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
#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;
}
效果图如下:
如果要识别人体的其它部位,只需将上面的haarcascade_frontalface_alt2.xml分类器替换即可。
源码下载:http://download.csdn.net/detail/itismelzp/9385242