基于特征脸或Fisher脸的人脸识别

2016-10-20 12:25 阅读 963 次 评论 1 条

人脸识别和人脸检测介绍

1)人脸检测:它是图像中定位人脸区域的过程。它不关心人是谁,只关心是不是人脸。

2)人脸预处理:这步是调整人脸图像,使其看起来更清楚,且相似于其他人脸的过程。

3)收集和学习人脸:这步会收集许多预处理过的人脸,然后学习如何识别他们。

4)人脸识别:在所收集的人脸中查找哪个人脸与摄像头中的人脸最相似。

注意:通常人们所说的人脸识别是指寻找人脸的位置(也就是步骤1中所介绍的人脸检测)。

用opencv实现人脸检测

正如前面所说的那样,opencv带有各种训练好的检测器,这些检测器以XML格式保存,可用于各种应用。


级联分类器的类型                            XML文件名

人脸检测器(默认)                        haarcascade_frontalface_default.xml

人脸检测器(快速的haar)                  haarcascade_frontalface_alt2.xml

人脸检测器(快速的LBP)                   lbpcascade_frontalface.xml

人脸检测器的属性(侧视)                   haarcascade_profileface.xml

眼部检测其(分为左右眼)                   haarcascade_lefteye_2splits.xml

嘴部检测器                               haarcascade_mcs_mouth.xml

鼻子检测器                               haarcascade_mcs_nose.xml

整个人身体的检测器                        haarcascade_fullbody.xml


对于人脸识别项目,其检测的是正面人脸。因此可使用LBP人脸检测器,因为他最快而且没有专利协议问题。注意:OpenCV 2.x 自带的LBP人脸检测器与Harr人脸检测器或使用Harr人脸检测器。

加载Haar或LBP对象或人脸检测器

为了执行对象或人脸检测,首先必须用OpenCV的CascadeClassifier类来加载训练好的XML文件。具体操作如下:

通过指定不同的文件名,就可以加载Haar或LBP检测器。用这种方式加载时,有一个常见的错误,即提供了错误的文件夹或文件名。由于编译环境不同,load()方法会返回false或产生一个C++异常(用一个断言错误来退出程序)。所以处理load()方法的这种错误需用try/catch块,如果出错了,就显示一个友好的错误信息给用户。很多初学者会跳过错误检测,但当用户未正确加载时,给用户提示信息很关键,若不这样做,用户可能会花很长时间来调试代码的其他部分,最后才发现是因为数据没有加载。一个简单的错误显示如下:

访问摄像机

为了从一台电脑的摄像头或从视频文件中获取帧,可简单地按摄像机编号或视频文件名来调用VideoCapture::open()函数,然后使用C++的流运算符来获取帧。

用Harr或LBP检测器来检测对象

现在已经加载检测器(在初始化期间只加载一次),可用他来检测摄像机每帧中的人脸。但首先需要专门针对人脸检测来预处理摄像机图像,步骤如下:

1)灰度色彩转换:人脸检测只适合灰度图像。因此,应转换彩色摄像机帧为灰度图像。

2)收缩摄像机图像:人脸检测的速度取决于输入图像的大小(对大的图像很慢,对小的图像很快),即使在低分辨率下,其检测也相当可靠。所以应该收缩摄像机图像,使其有一个合理的尺寸(或对检测器的minFeatureSize使用一个较大的值)。

3)直方图均衡化:在光线不足的情况下,人脸检测器并不可靠。所以,应该进行直方图均衡化,以改善对比度和亮度。

灰度图像转换

收缩摄像机图像

直方图均衡化

下面是equalizeHist()函数的使用方法:

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:基于特征脸或Fisher脸的人脸识别 | 术与道的分享
分类:OpenCV 标签:
1024do.com导航_术与道导航平台

发表评论


表情

  1. 浅梦
    浅梦 【农民】 @回复

    人脸识别呀,我要赶紧收藏了😍