一.人脸检测算法原理
Viola-Jones人脸检测方法
参考文献:Paul Viola, Michael J. Jones. Robust Real-Time Face Detection[J]. International Journal of Computer Vision,2004,57(2):137-154.
该算法的主要贡献有三:
1.提出积分图像(integral image),从而可以快速计算Haar-like特征。
2.利用Adaboost学习算法进行特征选择和分类器训练,把弱分类器组合成强分类器。
3.采用分类器级联提高效率。
二.OpenCV检测原理
OpenCV中有检测人脸的函数(该函数还可以检测一些其他物体), 甚至还包含一些预先训练好的物体识别文件。
所以利用这些现成的东西就可以很快做出一个人脸检测的程序。
主要步骤为:
1.加载分类器。
用cvLoad函数读入xml格式的文件。文件在OpenCV安装目录下的“data/haarcascades/”路径下。
http://blog.youkuaiyun.com/yang_xian521/article/details/6973667推荐使用haarcascade_frontalface_atl.xml和haarcascade_frontalface_atl2.xml
2.读入待检测图像。读入图片或者视频。
3.检测人脸。
下面介绍利用opencv自带的分类器进行人脸检测的步骤:
一.人脸的Haar特征分类器是什么
二.在哪找人脸的Haar特征分类器
三.怎么用人脸的Haar特征分类器
四.人脸识别示例代码
五.人脸识别程序运行结果
一.人脸的Haar特征分类器是什么
人脸的Haar特征分类器就是一个XML文件,该文件中会描述人脸的Haar特征值。当然Haar特征的用途可不止可以用来描述人脸这一种,用来描述眼睛,嘴唇或是其它物体也是可以的。
二.在哪找人脸的Haar特征分类器
OpenCV有已经自带了人脸的Haar特征分类器。OpenCV安装目录中的\data\ haarcascades目录下的haarcascade_frontalface_alt.xml与haarcascade_frontalface_alt2.xml都是用来检测人脸的Haar分类器。这个haarcascades目录下还有人的全身,眼睛,嘴唇的Haar分类器。读者可以仿照本方的例子来试验下效果看看。
三.怎么用人脸的Haar特征分类器
使用人脸的Haar特征分类器非常之简单,直接使用cvHaarDetectObjects。下面来看看这个函数的介绍:
函数功能:检测图像中的目录
函数原型:
CVAPI(CvSeq*)cvHaarDetectObjects(
constCvArr*image,
CvHaarClassifierCascade*cascade,
CvMemStorage*storage,
doublescale_factorCV_DEFAULT(1.1),
intmin_neighborsCV_DEFAULT(3),
intflagsCV_DEFAULT(0),
CvSizemin_sizeCV_DEFAULT(cvSize(0,0)),
CvSizemax_sizeCV_DEFAULT(cvSize(0,0))
);
函数说明:
CvArr* image是一个灰度图像,如果设置了ROI,将只处理这个区域。
CvHaarClassifierCascade* cascade是前面读入的分类器特征级联,可以用cvLoad()函数来从磁盘中加载xml文件作为Haar特征分类器。。
CvMemStorage* storage 是这个算法的工作缓存。
scale_factor :算法用不同尺寸的窗口进行扫描,scale_factor是每两个不同大小的窗口之间的尺寸关系,默认为1.1即每次搜索窗口依次扩大10%。
min_neighbors 控制误检测,因为人脸会被不同位置大小的窗口重复检测到,至少有这么多次检测,我们才认为真的检测到了人脸。
flags有四个可用的数值,它们可以用位或操作结合使用。默认值是CV_HAAR_DO_CANNY_PRUNING,告诉分类器跳过平滑区域。
min_size 指示寻找人脸的最小区域。max_size 显然应该是寻找人脸的最大区域了。
函数返回值:
函数将返回CvSeq对象,该对象包含一系列CvRect表示检测到的人脸矩形。
#include <opencv2/opencv.hpp>
#include <cstdio>
#include <cstdlib>
#include <Windows.h>
using namespace std;
int main()
{
// 加载Haar特征检测分类器
// haarcascade_frontalface_alt.xml系OpenCV自带的分类器 下面是我机器上的文件路径
const char *pstrCascadeFileName = "D:\\opencv\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
CvHaarClassifierCascade *pHaarCascade = NULL;
pHaarCascade = (CvHaarClassifierCascade*)cvLoad(pstrCascadeFileName);
// 载入图像
const char *pstrImageName = "E:\\3.jpg";
IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);
IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);
// 人脸识别与标记
if (pHaarCascade != NULL)
{
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);
// 识别
DWORD dwTimeBegin, dwTimeEnd;
dwTimeBegin = GetTickCount();
CvSeq *pcvSeqFaces = cvHaarDetectObjects(pGrayImage, pHaarCascade, pcvMStorage);
dwTimeEnd = GetTickCount();
printf("人脸个数: %d 识别用时: %d ms\n", pcvSeqFaces->total, dwTimeEnd - dwTimeBegin);
// 标记
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);
}
const char *pstrWindowsTitle = "人脸识别";
cvNamedWindow(pstrWindowsTitle, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsTitle, pSrcImage);
cvWaitKey(0);
cvDestroyWindow(pstrWindowsTitle);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pGrayImage);
return 0;
}
接着将分类器换做haarcascade_eye_tree_eyeglasses.xml,检测眼睛
如果需要检测其他部位,可以到http://wiki.opencv.org.cn/index.php/%e7%89%b9%e5%be%81%e6%a3%80%e6%b5%8b%e4%b8%93%e9%a2%98下载相应的分类器
Adaboost的几个人脸检测网站
【1】基础学习笔记之opencv(1):opencv中facedetect例子浅析 http://www.cnblogs.com/tornadomeet/archive/2012/03/22/2411318.html
【2】OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect http://blog.youkuaiyun.com/yang_xian521/article/details/6973667
【3】Haar+Adaboost实现人头检测 http://blackhuman.blogcn.com/archives/143
【4】AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图 http://blog.youkuaiyun.com/weixingstudio/article/details/7631241
【5】AdaBoost中利用Haar特征进行人脸识别算法分析与总结2——级联分类器与检测过程 http://blog.youkuaiyun.com/weixingstudio/article/details/7631949
【6】Cv模式识别 http://www.opencv.org.cn/index.php/Cv%E6%A8%A1%E5%BC%8F%E8%AF%86%E5%88%AB
【7】OpenCV Haar分类器人脸检测部分代码注释 http://www.haogongju.net/art/1441498
【8】浅析人脸检测之Haar分类器方法 http://www.cnblogs.com/ello/archive/2012/04/28/2475419.html
【9】OpenCV学习笔记(三)人脸检测的代码分析 http://blog.youkuaiyun.com/Jee44/article/details/3454528
【10】OpenCV之 HaarTraining算法剖析 http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=4650
【11】Haar Training之CreateSamples http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=7706
【12】OpenCV训练分类器制作xml文档 http://blog.sina.com.cn/s/blog_617d698f0100xnx9.html
【13】opencv haartraining 分析一:cvCreateTreeCascadeClassifier http://blog.sina.com.cn/s/blog_75e063c10100z8vt.html
【14】Opencv中的Adaboost训练源码解读 http://www.opencvchina.com/thread-129-1-1.html
【15】请研究过cvhaartrainning源码的大牛帮忙~icvLoadTreeCascadeClassifier是什么功能http://www.opencv.org.cn/forum/viewtopic.php?f=10&t=15534
【16】计算haar特征的一个问题,不知大家有没有注意到 http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=6380
【17】关于haartraining的一些解析,不全 http://www.opencv.org.cn/forum/viewtopic.php?f=10&t=11129
【18】opencv haartraining 分析二:每级stage正负样本的获取 http://blog.sina.com.cn/s/blog_75e063c10100za53.html
【19】AdaBoost算法程序介绍说明(一)http://blog.sina.com.cn/s/blog_5f853eb10100s9ez.html
【20】AdaBoost算法程序介绍说明(二) http://blog.sina.com.cn/s/blog_5f853eb10100sd65.html
【21】AdaBoost算法程序介绍说明(三) http://blog.sina.com.cn/s/blog_5f853eb10100sdgn.html
【22】 OpenCV 人脸检测自学系列 http://blog.youkuaiyun.com/naruto0001/article/details/8029193 (相当不错哦)
【23】基于opencv2.0的haar算法以人脸识别为例的训练分类器xml的方法 http://hi.baidu.com/ccb163163/item/22ba182edcc6fac00e37f9dd
【24】AdaBoost人脸检测训练算法 (上)http://blog.youkuaiyun.com/hqw7286/article/details/5556767