您的位置:首页 > 其它

基于VC的人脸识别软件(识别出人脸五官)

2014-04-29 07:32 176 查看
最近在学MFC和Opencv,刚好毕业设计要做人脸识别软件,所以写了一个,感觉挺简单的。

首先给VC配置opencv,这个不用说了,很简单,网上资料很多,然后就是设计界面啦,这个完全凭个人喜好了,我设计的界面是这样的:


然后就是拍照,保存图片,这个也很简单,网上资料也很多,就简单粘贴一下代码吧:

这是打开摄像头的代码:

pwnd = GetDlgItem(IDC_STATIC1);

pDC =pwnd->GetDC();

hDC= pDC->GetSafeHdc();

pwnd->GetClientRect(&rect);

if (!camera.OpenCamera(0,false))

{

AfxMessageBox("无法打开摄像头");

return;

}

//IplImage* m_Frame;

m_Frame=camera.QueryFrame();

CvvImage m_CvvImage;

m_CvvImage.CopyOf(m_Frame,1);

if (true)

{

m_CvvImage.DrawToHDC(hDC, &rect);

//cvWaitKey(10);

}

// 设置计时器,每10ms触发一次事件

SetTimer(1,10,NULL);

}

关闭摄像头:

void CBishe5_1Dlg::OnButton3()

{

// TODO: Add your control notification handler code here

camera.CloseCamera();

KillTimer(1);

}

保存图片并在第二的picture框中显示:

// TODO: Add your message handler code here and/or call default

pwnd = GetDlgItem(IDC_STATIC1);

pDC =pwnd->GetDC();

hDC= pDC->GetSafeHdc();

pwnd->GetClientRect(&rect);

m_Frame=camera.QueryFrame();

CvvImage m_CvvImage;

m_CvvImage.CopyOf(m_Frame,1);

if (true)

{

m_CvvImage.DrawToHDC(hDC, &rect);

//cvWaitKey(10);

}

CDialog::OnTimer(nIDEvent);

}



在摄像头拍摄图片中还遇到了问题,应该是兼容性的问题,我是在win7系统上运行VC和opencv1.0,其中opencv1.0中打开摄像头操作无法执行,后来搞了好长时间,找了一些资料,后来将打开摄像头等操作代码不调用opencv1.0的,自己写代码从win7的API调用,此段代码是一个大神写的,很好用,十分感谢他的,代码很长,就不粘贴了,网上仔细找找都有。

接下来就是图像识别了,这个我感觉很简单,我花了一下人脸识别的程序框图,帮助大家理解一下:



其实程序很简单,我就张贴一下我的找出人脸并圈出人脸的代码,其他鼻子嘴巴等五官识别都差不多:

CvSeq* FaceDet(IplImage* imgSrc, IplImage* imgDst)

{

if(imgSrc != imgDst)

{

cvReleaseImage(&imgDst);

imgDst = cvCloneImage(imgSrc);

}

const char* cascade = "haarcascade_frontalface_alt2.xml";

CString file = getXMLFile(cascade);

CvSeq * faces = CvHarrEx(imgSrc, NULL, /*FACEXML*/file, cvSize(20, 20));

if(!faces)

{

MessageBox(NULL,"此人长得太帅!!!导致计算机无法识别,实在不好意思", "", 0);

return NULL;

}

//Reduce(faces);

int i, n = faces->total;

CvRect* r;

//--check whether have eyes in the face

for(i = 0; i < n; i++)

{

r = (CvRect*)cvGetSeqElem( faces, i );

if( CvHarrEx(imgSrc, r, /*EYERXML*/getXMLFile("ojoD.xml"), cvSize(18, 12)) == NULL)

{

cvSeqRemove(faces, i);

i--;

n = faces->total;

}

}

DrawCircle(imgSrc, imgDst, faces, cvPoint(0,0));

return faces;

}

最终结果是将人脸五官全识别并圈出来:



具体就这些了,全程序我打包发在CSDN的下载中把,其实还没搞完,原本想建,把家人的脸都训练成模板,建一个模型库,然后当外人出现在摄像头前,在模板库中找不到匹配的模板,然后报警。嗯嗯,小弟刚开始学,比较水,还是第一次写博客,往大神多多关照。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: