opencv中haar特征检测人脸(适合小白)

本文的例程是我第一次用opencv自带的利用haar特征人脸识别的分类器文件进行人脸检测的收获,注意,前提是已经有了分类器文件xml,仅仅是利用它来进行检测的过程。希望能帮到有需求的人~

步入正题吧,haar特征识别人脸的原理情自行百度,这里就不多说了。《学习opencv》一书中有一段利用haar特征进行人脸检测和标识的代码,我按照他的代码写了程序,发现了一些小小的问题,列举下来。先直接上我最后的代码吧。

//----------------HAAR特征的人脸检测-------------------
//使用opencv自带的xml分类器文件
//问题:1.分类器文件的载入,使用的是opencvc的路径下的data中的带有GPU的文件夹下的分类器文件,另外一个不能成功。
//2、宏定义中的SCALE的值影响了缩放的比例,非常影响结果。
//----------------------cjs-----------------------------

#include<opencv.hpp>
#include<highgui.hpp>
//#include<core.hpp>
//#include<ml\ml.hpp>
//#include<opencv2\imgproc.hpp>

#define SCALE 1.01//宏定义一个缩放的尺寸方便修改

void detect_and_draw(IplImage* img, double scale = SCALE)
{
	//定义显示的框的颜色
	static CvScalar colors[] = { { 0,0,255 },{ 0,128,255 },{ 0,255,255 },{ 0,255,0 },
	{ 255,128,0 },{ 255,255,0 },{ 255,0,0 },{ 255,0,255 } };
	//载入分类器,按照自己的分类器路径加载
	CvHaarClassifierCascade *cascade = (CvHaarClassifierCascade*)cvLoad(
		"D:\\opencv_2_4_13\\opencv\\sources\\data\\haarcascades_GPU\\haarcascade_frontalface_default.xml");
	//判断是否载入分类器成功
	if (!cascade)
	{
		cvShowImage("error", img);
		cvWaitKey(100);//等100的原因是给足够的时间来显示图片,不然可能显示不成功

	}
	//创建存储空间
	CvMemStorage* storage = cvCreateMemStorage(0);
	//创建灰度图像和缩小的图像
	IplImage* gray = cvCreateImage(cvSize(img->width, img->height), 8, 1);
	IplImage* small_img = cvCreateImage(cvSize(cvRound(img->width / scale), cvRound(img->height / scale)), 8, 1);
	cvCvtColor(img, gray, CV_BGR2GRAY);
	cvResize(gray, small_img, CV_INTER_LINEAR);
	//直方图均衡化,消除图片成像条件引起的问题
	cvEqualizeHist(small_img, small_img);
	//先清空存储区域
	cvClearMemStorage(storage);
	//这就是重点啦,识别过程
	CvSeq* objects = cvHaarDetectObjects(small_img, cascade, storage, 1.1, 2, 0, cvSize(30, 30));
	//依次提取出结果并显示
	for (int i = 0; i < (objects ? objects->total : 0); i++)
	{
		CvRect* r = (CvRect*)cvGetSeqElem(objects, i);
		cvRectangle(img, cvPoint(r->x, r->y), cvPoint(r->x + r->width, r->y + r->height), colors[i % 8]);
	}
	cvShowImage("result", img);
	//暂停,一直显示结果
	cvWaitKey(0);
	cvReleaseImage(&gray);
	cvReleaseImage(&small_img);

}
void main()
{
	IplImage* img = cvLoadImage("people.jpg", 3);//这里可以更改读取的图像
	detect_and_draw(img,SCALE);
}


给两张运行结果图吧。


如图,人脸还是检测到了一些,但是有些地方有些错误识别,需要进一步研究咯,不过目的达到了,就是能使用分类器文件来检测出人脸了~

以下是几个问题:

1:分类器文件只能用data文件夹下的haarcascades_GPU文件夹下的文件,而不能用haarcascades下面的文件,至于为什么,我也不能解释,欢迎大家解答啦~

2:那个SCALE的值很会影响到识别的结果。这里设置的是1.01,效果还可以,我之前按照书上的设置的是1.3,效果惨不忍睹。就是这样咯~


以上就是我的一些小收获啦,如果有错误希望大家指正,大家一起交流进步~~微笑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值