您的位置:首页 > 其它

视频流中实时人脸检测

2016-06-21 00:04 375 查看
发现一个人脸检测库,可供商业和非商业无限制使用,包含正面和多视角人脸检测两个算法.优点:速度快(OpenCVhaar+adaboost的2-3倍), 准确度高 (FDDB非公开类评测排名第二),能估计人脸角度,这是纯C语言生成的二进制库,不依赖任何其他的库。下载地址为:https://github.com/ShiqiYu/libfacedetection。性能如下:



因此萌生了使用该库在视频流中检测人脸的想法,试验其实时检测人脸的能力。编程环境:win10+WindowsSDK7.1+opencv2.4.13,任务就是采用DirectShow编写一个Transform Filter,opencv的目的只是将每个Sample转换成灰度图像数据方便处理。在vs2013项目中新建一个Filter项目,名称为FilterFaceDT。



既可以自己新建,也可以基于DirectShow自带的例子进行修改。关键代码是在转换类的Transform(IMediaSample *pMediaSample)函数中:

IplImage* img = cvCreateImage(cvSize(cxImage,cyImage), IPL_DEPTH_8U, 1);//创建灰度图
uchar *p = (uchar *)img->imageData;
for (int i = height-1; i >= 0; i--){
for (int j = 0; j < width; j++){
<span style="white-space:pre">	</span>uchar a = prgb->rgbtBlue*0.114 + prgb->rgbtGreen*0.587 + prgb->rgbtRed*0.299;//转换为灰度值
p[i*step + j] = a;
prgb++;
}
}
Mat gray(img);
int * pResults = NULL;
pResults = facedetect_frontal((unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, gray.step,1.2f, 3, 24);//这是人脸检测的关键函数
if (pResults){
sprintf(text, "人脸检测%d:%d*%d", *pResults, img->width, img->height);
DrawString(10, 10, text, rq, "宋体", 0, 800);// 此时坐标系为正常视觉
this->DrawRect(pResults, width, height, rq); //开始画人脸矩形
}


生成FaceDT.ax后,使用带管理员权限运行cmd,注册之。

下面用DirectShow中的graphedt构造FilterGraph,如下图所示。



检测效果如下,貌似还不错,有兴趣的朋友可以使用其它两个函数facedetect_multiview和facedetect_multiview_reinforce进行测试:





资源下载地址:http://download.csdn.net/detail/wootengxjj/9554995
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: