一、关于检测算法
分类器训练:
通过正样本与负样本训练可得到分类器,opencv有编译好的训练Demo,按要求训练即可生成,这里我们直接使用其已经训练好的分类器检测;
检测过程:
检测过程很简单,可以通过两种方式进行检测:
1、缩放图像:根据要检测的人脸尺寸范围对原图进行缩放,然后利用窗口(训练时正样本的尺寸),逐个遍历该尺寸下图像的所有潜在人脸位置,与分类器匹配,若通过每一级强分类器,则为人脸,若不能通过任何一级强分类器,则被判定不是人脸;
2、缩放特征:与缩放图像类似,不同的是缩放图像方式遍历的窗口是固定大小的(与正样本大小有关),图像在缩放,而缩放特征是图像不变,特征窗口在缩放;
不同点:缩放特征,积分图只需计算一次,不需要频繁缩放图像;
二、基于的OpenCV的检测Demo
先利用OpenCV的接口调用一下检测算法,测试一下,后续考虑移植其源代码为C语言版本,个人觉得C语言版本的算法较易理解,易于阅读;
#include <opencv/highgui.h> #include <opencv/cv.h> #include <opencv2/imgproc/imgproc_c.h> #include <opencv2/objdetect/objdetect.hpp> using namespace cv; int main(int argc, char** argv) { CascadeClassifier stFaceCascade; IplImage *pstImage = NULL; std::vector<Rect> faceRects; if( !stFaceCascade.load("D:\\ProgramFiles\\develop\\opencv2.4.8\\sources\\data\\lbpcascades\\lbpcascade_frontalface.xml") ) { printf("Loading cascade error\n"); return -1; } pstImage = cvLoadImage("D:\\test.jpg", CV_LOAD_IMAGE_COLOR); stFaceCascade.detectMultiScale(pstImage, faceRects, //检出结果 1.1, //缩放步长 2, //框融合时的最小检出个数 0|CV_HAAR_SCALE_IMAGE,//标志 |CV_HAAR_FIND_BIGGEST_OBJECT|CV_HAAR_DO_ROUGH_SEARCH|CV_HAAR_DO_CANNY_PRUNING Size(30, 30), //最小人脸尺寸 Size(300, 300) ); //最大人脸尺寸 printf("Face Num[%d]\n", faceRects.size()); for( unsigned int j = 0; j < faceRects.size(); j++ ) { cvRectangle(pstImage, cvPoint(faceRects[j].x, faceRects[j].y), cvPoint(faceRects[j].x + faceRects[j].width, faceRects[j].y + faceRects[j].height), cvScalar(0,255,0), 2,8,0); } cvShowImage("FDWin", pstImage); cvWaitKey(0); cvReleaseImage(&pstImage); return 0; }
三、检测结果
本文转自风一样的码农博客园博客,原文链接:http://www.cnblogs.com/chenpi/p/5128232.html,如需转载请自行联系原作者