人脸识别之人脸检测

最近参见了中兴捧月的比赛,有一点心得,记录于此,供大家学习参考,有不妥之处忘提出,在下面评论哈。

人脸识别分为人脸检测、人脸预处理、搜集和学习人脸以及人脸识别四个部分,此部分将人脸检测。

本文基于opencv进行的。在opencv中常用的人脸检测器有基于LBP的特征检测、基于Haar的特征检测,两者的区别:前者比后者快好几倍且不需要许可协议,但很多Haar检测器需要许可协议。

基于Haar的脸部检测器的基本思想是:对于面部正面的大部分区域而言,眼镜回避前额和廉价更暗,嘴巴应该比链接更暗等情形。通常需要执行约20个这样的比较来决定所检测的对象是否为人脸。但它必须针对图像中每个可能的位置和每种可能的人脸大小都这样做。因此,对于每幅图像,这样的比较实际上经常会做上千次。基于LBP的人脸检测器的基本思想与Haar人脸检测类型,但它比较的是像素亮度直方图,例如边缘、角落和平坦区域的直方图。

常用的opencv分类器如下:人脸识别之人脸检测


位于opencv跟文件夹下的data\haarcascades文件夹和data\lbpcascades文件下中

不多说了,下面给出代码实现。

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


int main()
{
string xmlPath = "lbpcascade_frontalface.xml";
CascadeClassifier ccf;   //创建分类器对象
Mat img = imread("people.jpg");
if (!ccf.load(xmlPath))   //加载训练文件
{
cout << "不能加载指定的xml文件" << endl;
return 0;
}

vector<Rect> faces;  //创建一个容器保存检测出来的脸
Mat gray;
if (img.channels() == 3)
{
cvtColor(img, gray, CV_BGR2GRAY); //转换成灰度图,因为harr特征从灰度图中提取
}
else{
gray = img;
}
equalizeHist(gray, gray);  //直方图均衡行
ccf.detectMultiScale(gray, faces, 1.1, 3, 0, Size(5, 5), Size(300, 300)); //检测人脸
for (vector<Rect>::const_iterator iter = faces.begin(); iter != faces.end(); iter++)
{
rectangle(img, *iter, Scalar(0, 0, 255), 2, 8); //画出脸部矩形
}
imshow("faces", img);

waitKey(0);
return 0;
}

原图:

人脸识别之人脸检测

效果图:

人脸识别之人脸检测

有问题就在下面评论吧,我们一起交流、学习。