opencv人脸检测--cvHaarDetectObjects函数

opencv人脸检测--cvHaarDetectObjects函数


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


一、Haar特征分类器介绍


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.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表示检测到的人脸矩形。



三、人脸识别示例



先来看处理前的两个张图

opencv人脸检测--cvHaarDetectObjects函数_第1张图片

养眼美女--白百何

opencv人脸检测--cvHaarDetectObjects函数_第2张图片


绿箭侠的主角们。



人脸识别示例代码:

#include 
#include 
#include 
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 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;
}




效果图如下:

opencv人脸检测--cvHaarDetectObjects函数_第3张图片


opencv人脸检测--cvHaarDetectObjects函数_第4张图片



如果要识别人体的其它部位,只需将上面的haarcascade_frontalface_alt2.xml分类器替换即可。


源码下载:http://download.csdn.net/detail/itismelzp/9385242



你可能感兴趣的:(opencv)