【OpenCV笔记 16-1】OpenCV人脸检测之Haar分类器

本文将介绍如何利用OpenCV的Haar检测器实现人脸识别的

基本步骤:

1.用opencv实现人脸检测

2.加载Haar分类

  • 一般来说分类训练器的xml文件路径如下:....\sources\data\haarcascades\haarcascade_frontalface_alt.xml
  • 每个人的安装位置不同,训练器的xml也不同,我的是opencv3.0,需要将该xml文件复制到当前工程目录下
  • 使用 CascadeClassifier 类来检测视频流中物体. 特别地,我们将使用函数:load 来加载一个 .xml 分类文件,detectMultiScale 来进行图像的多尺度检测.

3.载入图片,或者访问相机

4.利用前面加载的Haar检测器检测对象(人脸

  • 彩色图转换为灰度图
  • 收缩摄像机图像(前提是访问摄像头)
  • 直方图均衡化

示例代码

#include<opencv2/opencv.hpp>
#include <iostream>   
using namespace std;
using namespace cv;

string face_cascade_name = "haarcascade_frontalface_alt.xml";
//该文件存在于OpenCV安装目录下的\sources\data\haarcascades内,需要将该xml文件复制到当前工程目录下  
CascadeClassifier face_cascade;
void detectAnddisplay(Mat frame);

int main(int argc,char** argv)
{
	Mat srcImage;
	//============载入并显示人脸图片=========
	srcImage = imread("image/ITboss.jpg",1);  //当前工程image目录下的jpg文件,注意目录符号  
	imshow("原图",srcImage);

	//============加载分类器=========
	if (!face_cascade.load(face_cascade_name))
	{
		printf("级联分类错误,可能未找到文件,请拷贝该文件到工程目录下!\n");
		return -1;
	}
	//============调用人脸检测函数  =========
	detectAnddisplay(srcImage); 
	waitKey(0);//暂停显示一下,ESC退出  
}

//= == == == == == =自定义人脸检测函数 == == == == 
void detectAnddisplay(Mat dispface)
{
	//定义变量
	std::vector<Rect> faces;
	Mat srcFace,grayFace,eqlHistFace;

	cvtColor(dispface,CV_BGR2GRAY);  //rgb类型转换为灰度类型  
	equalizeHist(grayFace,eqlHistFace);   //直方图均衡化  

	face_cascade.detectMultiScale(eqlHistFace,faces,1.01,1,0 | CV_HAAR_SCALE_IMAGE,Size(5,5),Size(22,23));
	//增大第四个参数可以提高检测精度,但也可能会造成遗漏
	//人脸尺寸minSize和maxSize,关键参数,自行设定,随图片尺寸有很大关系,

	for (unsigned int i = 0; i < faces.size(); i++)
	{
		Point center(faces[i].x + faces[i].width/2,faces[i].y + faces[i].height/2);
		//用绿色椭圆标记检测到的人脸
		ellipse(dispface,center,Size(faces[i].width*1/2,faces[i].height*65/100),360,Scalar(50,255,0),2,8,0);
	}
	//输出
	cout << "共检测到人脸: " << faces.size() <<" 张"<<endl;
	imshow("人脸识别结果",dispface);
}

检测结果:

总共试验了两张图片第一张2015年很火的图片,国内IT大佬岁习大大访美合影;第二张NBA球星合影。
图片1: 检测正确率约为81%,27人中检测出22人,可以看出跟图片质量关系很大,漏检主要在后排。



==============================================================


图片2:检测正确率约为100%,全部识别。(注意:相应的函数参数也发生变化)


参数修改代码

face_cascade.detectMultiScale(eqlHistFace,1.1,Size(35,35));


相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念