opencv人脸识别--cvHaarDetectObjects函数

来源:互联网 发布:白金ディスコ 知乎 编辑:程序博客网 时间:2024/06/05 13:23

opencv人脸识别--cvHaarDetectObjects函数






转载请注明出处:http://blog.csdn.net/itismelzp/article/details/50378468





一、Haar特征分类器介绍


Haar特征分类器就是一个XML文件,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。

Haar特征分类器存放目录:OpenCV安装目录中的\data\ haarcascades目录下,opencv2.4.8版本下的Haar特征分类器如下:

haarcascade_eye.xmlhaarcascade_eye_tree_eyeglasses.xmlhaarcascade_frontalface_alt.xmlhaarcascade_frontalface_alt_tree.xmlhaarcascade_frontalface_alt2.xmlhaarcascade_frontalface_default.xmlhaarcascade_fullbody.xmlhaarcascade_lefteye_2splits.xmlhaarcascade_lowerbody.xmlhaarcascade_mcs_eyepair_big.xmlhaarcascade_mcs_eyepair_small.xmlhaarcascade_mcs_leftear.xmlhaarcascade_mcs_lefteye.xmlhaarcascade_mcs_mouth.xmlhaarcascade_mcs_nose.xmlhaarcascade_mcs_rightear.xmlhaarcascade_mcs_righteye.xmlhaarcascade_mcs_upperbody.xmlhaarcascade_profileface.xmlhaarcascade_righteye_2splits.xmlhaarcascade_smile.xmlhaarcascade_upperbody.xml


根据命名就可以很快知道各个分类器的用途。

其中:haarcascade_frontalface_alt.xmlhaarcascade_frontalface_alt2.xml都是人脸识别的Haar特征分类器了。



二、cvHaarDetectObjects函数详解


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个参数,函数说明:

  • 参数1:表示输入图像,尽量使用灰度图以加快检测速度。
  • 参数2:表示Haar特征分类器,可以用cvLoad()函数来从磁盘中加载xml文件作为Haar特征分类器。
  • 参数3:用来存储检测到的候选目标的内存缓存区域
  • 参数4:表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%
  • 参数5:表示构成检测目标的相邻矩形的最小个数(默认为3)。如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。如果min_neighbors  0, 则函数不做任何操作就返回所有的被检候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上。
  • 参数6:要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域。
  • 参数7:表示检测窗口的最小值,一般设置为默认即可。
  • 参数8:表示检测窗口的最大值,一般设置为默认即可。

  • 函数返回值:函数将返回CvSeq对象,该对象包含一系列CvRect表示检测到的人脸矩形。



三、人脸识别示例



先来看处理前的两个张图


养眼美女--白百何



绿箭侠的主角们。



人脸识别示例代码:

#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



1 0
原创粉丝点击