您的位置:首页 > 移动开发 > Objective-C

opencv人脸检测--cvHaarDetectObjects函数

2015-12-22 10:57 459 查看
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.xml与haarcascade_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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: