OpenCV人脸检测

本文介绍了OpenCV中Viola-Jones人脸检测方法,包括算法原理、OpenCV的检测步骤和如何使用Haar特征分类器。提供了OpenCV自带的Haar分类器文件位置,并列举了多个Adaboost人脸检测的学习资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.人脸检测算法原理
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.xmlhaarcascade_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

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值