OpenCV学习(37) 人脸识别(2)
在前面一篇教程中,我们学习了OpenCV中基于特征脸的人脸识别的代码实现,我们通过代码
Ptr<FaceRecognizer> model = createEigenFaceRecognizer();
创建了人脸识别模型类,该识别模型类基于特征值人脸。该类有几个重要的成员:
int _num_components;
double _threshold;
vector<Mat> _projections;
Mat _labels;
Mat _eigenvectors;
Mat _eigenvalues;
Mat _mean;
_num_components表示我们的特征脸识别算法通过PCA降维后保留的特征向量数目,如果在创建人脸识别类时没有指定它的值,则它会保留所有的特征向量,比如我们例子中有399个采样图片,每个图片都为10304维,则最多的特征值数目为399,_num_components的值即为399。_threshold是判定输入的图像属于那一个特征脸时使用。如果类创建时候,没有指定它的值,则默认它会被赋予一个很大的值。我们可以通过下面的代码在类初始化时指定他们的值。
创建人脸识别模型类之后,我们首先要调用train函数:
model->train(images, labels);
该函数参数为样本图像集合以及样本图像标签集合,在该函数中,会通过PCA算法,得到采样集合的特征值和特征向量,并把每个采样图像投影到PCA子空间,放在变量 _projections中。所谓的投影PCA空间,就是用当前采样图向量减去均值向量,然后用特征向量乘以它,得到的y值。
详细参考http://www.cnblogs.com/mikewolf2002/p/3432243.html。
进过train函数后,我就得到了一系列的PCA空间投影图。
然后,我们会调用predict函数,传入带识别的人脸图像,该函数会返回检测到的人脸标签号。
int predictedLabel = model->predict(testSample);
在该函数中,会首先把testSample投影到PCA空间,然后和_projections中保存的特征图像挨个比较,距离最近的特征图标签号即为输入图像对应的人。注意在比较中,用到域值_threshold,如果所有特征图距离都大于域值,则会返回-1,没有在模型中找到对应的人脸。
for(size_t sampleIdx = 0; sampleIdx < _projections.size(); sampleIdx++) {
double dist = norm(_projections[sampleIdx], q, NORM_L2);
if((dist < minDist) && (dist < _threshold)) {
minDist = dist;
minClass = _labels.at<int>((int)sampleIdx);
}
}
人脸识别模型类中还有两个重要的函数:load, save,我们在工程FirstOpenCV31中增加save函数:
model->save("face.data");
在工程FirstOpenCV33中,我们跳过train环节,直接load, face.data,这样可以加快程序执行速度。
model->load("face.data");
程序代码:FirstOpenCV31,FirstOpenCV33

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
OpenCV学习(36) 人脸识别(1)
本文主要参考OpenCV人脸识别教程:http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html 1、OpenCV 从2.4开始支持3个新的人脸识别算法。 Eigenfaces 极值特征脸 createEigenFaceRecognizer() Fisherfaces createFisherFaceRecognizer() Local Binary Patterns Histograms局部二值直方图 createLBPHFaceRecognizer() 2、为了使用这三种算法,我们首先需要准备人脸训练样本,本文采用AT&T Facedatabase(点击下载)提供的人脸训练样本,该样本包括40个人,每人10张照片。照片在不同时间、不同光照、不同表情(睁眼闭眼、笑或者不笑)、不同人脸细节(戴眼镜或者不戴眼镜)下采集。所有的图像都在一个黑暗均匀的背景下,正面竖直人脸(有些有轻微旋转)。图像格式为pgm,图像大小为92*112,我们可以用gimp打开该格式的图像。 解压AT&T人脸数据...
- 下一篇
OpenCV学习(38) 人脸识别(3)
前面我们学习了基于特征脸的人脸识别,现在我们学习一下基于Fisher脸的人脸识别,Fisher人脸识别基于LDA(线性判别算法)算法,算法的详细介绍可以参考下面两篇教程内容: http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html LDA算法细节参考: http://www.cnblogs.com/mikewolf2002/p/3435750.html 程序代码: #include "opencv2/core/core.hpp"#include "opencv2/contrib/contrib.hpp"#include "opencv2/highgui/highgui.hpp"#include <iostream>#include <fstream>#include <sstream>using namespace cv;using namespace std;static Mat norm_0_255(InputArray _src) { Mat src =...
相关文章
文章评论
共有0条评论来说两句吧...