opencv人脸识别--cvHaarDetectObjects函数
转载请注明出处:http://blog.csdn.net/itismelzp/article/details/50378468
Haar特征分类器就是一个XML文件,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。
Haar特征分类器存放目录:OpenCV安装目录中的\data\ haarcascades目录下,opencv2.4.8版本下的Haar特征分类器如下:
haarcascade_eye.xml haarcascade_eye_tree_eyeglasses.xml haarcascade_frontalface_alt.xml haarcascade_frontalface_alt_tree.xml haarcascade_frontalface_alt2.xml haarcascade_frontalface_default.xml haarcascade_fullbody.xml haarcascade_lefteye_2splits.xml haarcascade_lowerbody.xml haarcascade_mcs_eyepair_big.xml haarcascade_mcs_eyepair_small.xml haarcascade_mcs_leftear.xml haarcascade_mcs_lefteye.xml haarcascade_mcs_mouth.xml haarcascade_mcs_nose.xml haarcascade_mcs_rightear.xml haarcascade_mcs_righteye.xml haarcascade_mcs_upperbody.xml haarcascade_profileface.xml haarcascade_righteye_2splits.xml haarcascade_smile.xml haarcascade_upperbody.xml
根据命名就可以很快知道各个分类器的用途。
其中:haarcascade_frontalface_alt.xml与haarcascade_frontalface_alt2.xml都是人脸识别的Haar特征分类器了。
cvHaarDetectObjects函数中指定相应的人脸 特征检测分类器,就可以检测出图片中所有的人脸,并将检测到的人脸通过矩形的方式返回。下面开始介绍这个函数,cvHaarDetectObjects原型如下:
CVAPI(CvSeq*) cvHaarDetectObjects( const CvArr* image, CvHaarClassifierCascade* cascade, CvMemStorage* storage, double scale_factor CV_DEFAULT(1.1), int min_neighbors CV_DEFAULT(3), int flags CV_DEFAULT(0), CvSize min_size CV_DEFAULT(cvSize(0,0)), CvSize max_size CV_DEFAULT(cvSize(0,0)) );
总共有8个参数,函数说明:
三、人脸识别示例
先来看处理前的两个张图
养眼美女--白百何
绿箭侠的主角们。
人脸识别示例代码:
#include <opencv2/opencv.hpp> #include <cstdio> #include <cstdlib> using namespace std; int main() { // 【1】加载分类器 // 加载Haar特征检测分类器 // 将haarcascade_frontalface_alt2.xml拷至项目目录下,便于操作 const char *pstrCascadeFileName = "haarcascade_frontalface_alt2.xml"; CvHaarClassifierCascade *pHaarCascade = NULL; pHaarCascade = (CvHaarClassifierCascade*)cvLoad(pstrCascadeFileName); if(!pHaarCascade) {printf("分类器加载失败\n");return -1;} // 【2】载入图像 const char *pstrImageName = "白百何.jpg"; IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED); IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1); cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY); // 转化成灰度图,提高检测速度 // 标记颜色 CvScalar FaceCirclecolors[] = { {{0, 0, 255}}, {{0, 128, 255}}, {{0, 255, 255}}, {{0, 255, 0}}, {{255, 128, 0}}, {{255, 255, 0}}, {{255, 0, 0}}, {{255, 0, 255}} }; // 设置缓存区 CvMemStorage *pcvMStorage = cvCreateMemStorage(0); cvClearMemStorage(pcvMStorage); // 【3】识别 CvSeq *pcvSeqFaces = cvHaarDetectObjects(pGrayImage, pHaarCascade, pcvMStorage); printf("人脸个数: %d\n", pcvSeqFaces->total); // 【4】标记 for(int i = 0; i <pcvSeqFaces->total; i++) { CvRect* r = (CvRect*)cvGetSeqElem(pcvSeqFaces, i); CvPoint center; int radius; center.x = cvRound((r->x + r->width * 0.5)); center.y = cvRound((r->y + r->height * 0.5)); radius = cvRound((r->width + r->height) * 0.25); cvCircle(pSrcImage, center, radius, FaceCirclecolors[i % 8], 2); } cvReleaseMemStorage(&pcvMStorage); // 释放缓存 // 【5】显示 const char *pstrWindowsTitle = "【人脸识别】"; cvShowImage(pstrWindowsTitle, pSrcImage); cvWaitKey(0); return 0; }
效果图如下:
如果要识别人体的其它部位,只需将上面的haarcascade_frontalface_alt2.xml分类器替换即可。
源码下载:http://download.csdn.net/detail/itismelzp/9385242