本文的例程是我第一次用opencv自带的利用haar特征人脸识别的分类器文件进行人脸检测的收获,注意,前提是已经有了分类器文件xml,仅仅是利用它来进行检测的过程。希望能帮到有需求的人~
步入正题吧,haar特征识别人脸的原理情自行百度,这里就不多说了。《学习opencv》一书中有一段利用haar特征进行人脸检测和标识的代码,我按照他的代码写了程序,发现了一些小小的问题,列举下来。先直接上我最后的代码吧。
//----------------HAAR特征的人脸检测-------------------
//使用opencv自带的xml分类器文件
//问题:1.分类器文件的载入,使用的是opencvc的路径下的data中的带有GPU的文件夹下的分类器文件,另外一个不能成功。
//2、宏定义中的SCALE的值影响了缩放的比例,非常影响结果。
//----------------------cjs-----------------------------
#include
#include
//#include
//#include
//#include
#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,效果惨不忍睹。就是这样咯~
以上就是我的一些小收获啦,如果有错误希望大家指正,大家一起交流进步~~