视频流中实时人脸检测

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

视频流中实时人脸检测_第1张图片

         

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

            视频流中实时人脸检测_第2张图片

       既可以自己新建,也可以基于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++){
		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_multiviewfacedetect_multiview_reinforce进行测试:

     视频流中实时人脸检测_第3张图片

     视频流中实时人脸检测_第4张图片

     资源下载地址:http://download.csdn.net/detail/wootengxjj/9554995

你可能感兴趣的:(视频处理)