注:笔者使用的开发环境为VS2013+opencv2.4.10
调用于仕琪老师提供的人脸检测库库文件:
http://www.opencv.org.cn/forum.php?mod=viewthread&tid=34155&extra=page%3D1
1、在工程中导入facedetect-dll.h和CvvImage.h
2、在Dlg.cpp中添加
#pragma comment(lib,”libfacedetect.lib”)
在Dlg.h中添加
VideoCapture cap;
IplImage* m_frame;
3、添加将图像显示到picture控件的DrawToMFC函数
(可参考笔者的另一个教程:opencv结合MFC打开图片 )
4、添加检测人脸的定时器
void CFaceObjectDlg::OnTimer(UINT_PTR nIDEvent)
{
switch (nIDEvent)
{
case 1:
{
Mat image;
cap >> image;
Mat gray;
cvtColor(image, gray, CV_BGR2GRAY);
int * pResults = NULL;
//pBuffer是用于检测功能.
//如果在多个线程中调用函数,请为每个线程创建一个缓冲区!
unsigned char * pBuffer = (unsigned char *)malloc(DETECT_BUFFER_SIZE);
int doLandmark = 1;
// 正面人脸检测
//检测人脸的速度快,但不能检测侧视图面
//输入图像必须是灰色的(单通道)
pResults = facedetect_frontal(pBuffer, (unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, (int)gray.step,
1.2f, 2, 48, 0, doLandmark);
Mat result_frontal = image.clone();
//输出检测结果
for (int i = 0; i < (pResults ? *pResults : 0); i++)
{
short * p = ((short*)(pResults + 1)) + 142 * i;
int x = p[0];
int y = p[1];
int w = p[2];
int h = p[3];
int neighbors = p[4];
int angle = p[5];
rectangle(result_frontal, Rect(x, y, w, h), Scalar(0, 255, 0), 2);
}
//将Mat转换为Iplimage用于显示
m_frame = &result_frontal.operator IplImage();
DrawToMFC(IDC_PIC,m_frame);
//释放缓存
free(pBuffer);
}break;
default:
break;
}
CDialogEx::OnTimer(nIDEvent);
}
5、打开摄像头进行人脸检测
void CFaceObjectDlg::OnBnClickedFaceObject()
{
cap.open(0);
SetTimer(1,20,NULL);
}
6、关闭摄像头停止人脸检测
void CFaceObjectDlg::OnBnClickedStopObject()
{
KillTimer(1);
cap.release();
}
检测结果:
哈哈哈,笔者不露脸啦,就用计算机视觉里的一副插图来检测^_^