opencv学习之路(40)、人脸识别算法——EigenFace、FisherFace、LBPH
一、人脸识别算法之特征脸方法(Eigenface)
1、原理介绍及数据收集
特征脸方法主要是基于PCA降维实现。
详细介绍和主要思想可以参考
http://blog.csdn.net/u010006643/article/details/46417127
上述博客的人脸数据库打不开了,大家可以去下面这个博客下载ORL人脸数据库
http://blog.csdn.net/xdzzju/article/details/50445160
下载后,ORL人脸数据库有40个人,每人10张照片。

2、流程


3、相关图示

4、代码
#include <opencv2/opencv.hpp>
#include <opencv2/face.hpp> using namespace cv;
using namespace cv::face;
using namespace std; //对原图归一化
Mat normal(Mat src, Mat dst) {
if (src.channels() == )//若原图单通道
normalize(src, dst, , , NORM_MINMAX, CV_8UC1);
else //否则,原图三通道
normalize(src, dst, , , NORM_MINMAX, CV_8UC3);
return dst;
} void main() {
//读取文件,转换为数据流
string filename = string("at.txt");
ifstream file(filename.c_str(), ifstream::in);
if (!file)
cout << "error" << endl; string line, path, classlabel;
vector<Mat>image;
vector<int>labels;
char separator = ';';
while (getline(file,line))
{
stringstream liness(line);
getline(liness, path, separator);
getline(liness, classlabel);
if (!path.empty()&&!classlabel.empty())
{
//cout << "path:" << path<< endl;
image.push_back(imread(path, ));
labels.push_back(atoi(classlabel.c_str()));
}
} if (image.size() < || labels.size() < )
cout << "invalid image path..." << endl; int height = image[].rows;
int width = image[].cols;
//cout << "height:" << height << ",width:" << width<<endl; //最后一个人为测试样本
Mat testSample = image[image.size() - ];
int testLabel = labels[labels.size() - ];
image.pop_back();
labels.pop_back(); //训练
Ptr<BasicFaceRecognizer>model = createEigenFaceRecognizer();
model->train(image, labels); //识别
int predictLabel = model->predict(testSample);
cout << "actual label:" << testLabel << ",predict label:" << predictLabel << endl; //获得特征值,特征向量,均值 平均脸
Mat eigenvalues = model->getEigenValues();
Mat eigenvectors = model->getEigenVectors();
Mat mean = model->getMean();
Mat meanFace = mean.reshape(,height);
Mat dst;
dst= normal(meanFace,dst);
imshow("Mean Face", dst); //特征脸
for (int i = ; i < min(,eigenvectors.cols); i++)
{
Mat ev = eigenvectors.col(i).clone();
Mat eigenFace = ev.reshape(, height);
Mat grayscale;
grayscale = normal(eigenFace, grayscale);
Mat colorface;
applyColorMap(grayscale, colorface, COLORMAP_BONE);
char* winTitle = new char[];
sprintf(winTitle, "eigenface_%d", i);
imshow(winTitle, colorface);
} //重建人脸
for (int num = min(, eigenvectors.cols); num < min(, eigenvectors.cols); num+=)
{
Mat evs = Mat(eigenvectors, Range::all(), Range(, num));
Mat projection = LDA::subspaceProject(evs, mean, image[].reshape(, ));
Mat reconstruction= LDA::subspaceReconstruct(evs, mean, projection); Mat result = reconstruction.reshape(, height);
reconstruction = normal(result, reconstruction);
char* winTitle = new char[];
sprintf(winTitle, "recon_face_%d", num);
imshow(winTitle, reconstruction);
} waitKey();
}

二、FisherFace(LDA线性判别分析)
1、理论介绍
http://blog.csdn.net/feirose/article/details/39552997

2、流程

3、PCA和LDA的对比

4、代码(与特征脸代码几乎一致)
此处只列出修改部分
55行模型训练 Ptr<BasicFaceRecognizer>model = createFisherFaceRecognizer(); 72行显示特征脸 for (int i = 0; i < min(16,eigenvectors.cols); i++)
Mat ev = eigenvectors.col(i).clone(); 86行重建人脸 for (int num = 0; num < min(16, eigenvectors.cols); num++)
三、LBPH
1、原理介绍
大家可以参考http://blog.csdn.net/xiaomaishiwoa/article/details/46640377

二、流程

3、代码
#include <opencv2/opencv.hpp>
#include <opencv2/face.hpp> using namespace cv;
using namespace cv::face;
using namespace std; //对原图归一化
Mat normal(Mat src, Mat dst) {
if (src.channels() == )//若原图单通道
normalize(src, dst, , , NORM_MINMAX, CV_8UC1);
else //否则,原图三通道
normalize(src, dst, , , NORM_MINMAX, CV_8UC3);
return dst;
} void main() {
//读取文件,转换为数据流
string filename = string("at.txt");
ifstream file(filename.c_str(), ifstream::in);
if (!file)
cout << "error" << endl; string line, path, classlabel;
vector<Mat>image;
vector<int>labels;
char separator = ';';
while (getline(file,line))
{
stringstream liness(line);
getline(liness, path, separator);
getline(liness, classlabel);
if (!path.empty()&&!classlabel.empty())
{
//cout << "path:" << path<< endl;
image.push_back(imread(path, ));
labels.push_back(atoi(classlabel.c_str()));
}
} if (image.size() < || labels.size() < )
cout << "invalid image path..." << endl; int height = image[].rows;
int width = image[].cols;
//cout << "height:" << height << ",width:" << width<<endl; //最后一个人为测试样本
Mat testSample = image[image.size() - ];
int testLabel = labels[labels.size() - ];
image.pop_back();
labels.pop_back(); //训练
Ptr<LBPHFaceRecognizer>model = createLBPHFaceRecognizer();
model->train(image, labels); //识别
int predictLabel = model->predict(testSample);
cout << "actual label:" << testLabel << ",predict label:" << predictLabel << endl; //打印参数
int radius = model->getRadius(); //中心像素点到周围像素点的距离
int neibs = model->getNeighbors(); //周围像素点的个数
int grad_x = model->getGridX(); //将一张图片在x方向分成几块
int grad_y = model->getGridY(); //将一张图片在y方向分成几块
double t = model->getThreshold(); //相似度阈值
cout << "radius:" << radius << endl;
cout << "neibs:" << neibs << endl;
cout << "grad_x:" << grad_x << endl;
cout << "grad_y:" << grad_y << endl;
cout << "threshold:" << t<<endl; waitKey();
}

opencv学习之路(40)、人脸识别算法——EigenFace、FisherFace、LBPH的更多相关文章
- DeepID人脸识别算法之三代(转)
DeepID人脸识别算法之三代 转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/42091205 DeepID,目前最强人脸识别算法,已经三 ...
- DeepID人脸识别算法之三代
DeepID人脸识别算法之三代 转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/42091205 DeepID,眼下最强人脸识别算法.已经三 ...
- 用opencv做的静态图片人脸识别
这次给大家分享一个图像识别方面的小项目,主要功能是识别图像中的人脸并根据人脸在图片库找出同一个与它最相似的图片,也就是辨别不同的人. 环境:VS2013+opencv2.4.13 主要是算法:open ...
- OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...
- 总结几个简单好用的Python人脸识别算法
原文连接:https://mp.weixin.qq.com/s/3BgDld9hILPLCIlyysZs6Q 哈喽,大家好. 今天给大家总结几个简单.好用的人脸识别算法. 人脸识别是计算机视觉中比较常 ...
- 基于MATLAB的人脸识别算法的研究
基于MATLAB的人脸识别算法的研究 作者:lee神 现如今机器视觉越来越盛行,从智能交通系统的车辆识别,车牌识别到交通标牌的识别:从智能手机的人脸识别的性别识别:如今无人驾驶汽车更是应用了大量的机器 ...
- Eigenface与PCA人脸识别算法实验
简单的特征脸识别实验 实现特征脸的过程其实就是主成分分析(Principal Component Analysis,PCA)的一个过程.关于PCA的原理问题,它是一种数学降维的方法.是为了简化问题.在 ...
- Visual C++ 经典的人脸识别算法源代码
说明:VC++ 经典的人脸识别算法实例,提供人脸五官定位具体算法及两种实现流程. 点击下载
- opencv学习之路(41)、人脸识别
一.人脸检测并采集个人图像 //take_photo.cpp #include<opencv2/opencv.hpp> using namespace cv; using namespac ...
随机推荐
- 2019OO第一单元总结
第一次作业 (你没看错,就一个类...) 通过正则表达式处理输入的字符串,提取出每一项的系数和指数,在输出的时候,应当考虑到合并同类项和正项提前的问题,使得最终的输出最短. 我第一次作业的代码超级难看 ...
- sourceTree如何不用注册就使用
下载好之后会有这么一个界面要求你注册或登录.(不管它)将下面的一串串放进我的电脑的地址栏,打开sourcetree的文件夹 %LocalAppData%\Atlassian\SourceTree\ 注 ...
- 我喜欢的几款不错的vim插件
插件安装组件 https://github.com/tpope/vim-pathogen supertab自动补齐 https://www.vim.org/scripts/script.php?scr ...
- php java aes
class CryptAES{ protected $cipher = MCRYPT_RIJNDAEL_128; protected $mode = MCRYPT_MODE_ECB; protecte ...
- python学习笔记3-列表
# 1.列表长度可变,内容可修改 a = [0,1,2,3] a[0] = 'a0' a # ['a0', 1, 2, 3] # 2.添加元素 # 2.1列表末尾添加元素 a.append(4) a ...
- 2019春第八周作业Compile Summarize
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 在这里 我在这个课程的目标是 能更加进一步的够熟练掌握指针的用法 这个作业在那个具体方面帮助我实现目标 指针对于高阶题目的做法 参考文献与 ...
- 代码块: 以冒号作为开始,用缩进来划分作用域,这个整体叫做代码块,python的代码块可以提升整体的整齐度,提高开发效率
# ### 代码块: 以冒号作为开始,用缩进来划分作用域,这个整体叫做代码块 if 5 == 5: print(1) print(2) if True: print(3) print(4) if Fa ...
- 一、初识CocoaPods——XCode的依赖库管理工具
概述 任意一款功能完整的APP,其中所涉及的内容都将是来自各个领域各个方面的.如果每个领域的每个方面都要重新开发并给予充分测试,那么1个APP的开发周期将会变得非常漫长,长到足以让房价再涨一倍,长到足 ...
- cocos 水果机,老Tiger虎机流水灯,博彩大转盘效果
原(http://www.cnblogs.com/zisou/p/cocos2d-xZhuanpan.html) 博彩大转盘,转盘抽奖的小系统,这是一个很有意思的游戏模块,游戏中增加这样一些趣味的小模 ...
- 接口自动化测试持续集成--Soapui接口测试
接口测试目前笔者掌握的工具有三种: 一.python+requests+jenkins,优点:代码实现接口测试,对测试代码书写比较自由等:缺点:需要测试者需要有一定的代码基础: 二.jmeter+an ...


