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 ...
随机推荐
- Install VirtualBox Guest Additions for elementary os
Pls refer to: Install VirtualBox Guest Additions for elementary os
- php协议流
文件包含漏洞结合php协议流的特性,使得漏洞利用效率更高,下面的内容主要讲解协议流的使用. 0x00 测试环境: php版本: 5.2,5.3,5.5,7.0等web服务: apache2OS系统: ...
- 如何让外网访问自己的本地Web服务
目前很多网站开发者安装了IIS或者Apache等Web服务器,可以把自己电脑配置成一以路由为中心的内网服务器. 本地服务器在内网测试是绰绰有余的,但是有些项目需要演示给异地的客户验收,而又赶不及把自己 ...
- Spring框架学习之--搭建spring框架
此文介绍搭建一个最最简单的spring框架的步骤 一.创建一个maven项目 二.在pom.xml文件中添加依赖导入spring框架运行需要的相关jar包 注意:在引入jar包之后会出现org.jun ...
- [Freemarker]自定义时间戳函数
使用freemarker的web项目经常需要用在Url后面加上时间戳来保证资源不被缓存,我们可以自定义方法实现时间戳. 先看freemarker配置信息: <bean id="free ...
- paginate()出来的数据怎样循环插入数据?
paginate()出来的数据怎样循环插入数据? paginate()分页如何转数组操作数据之后再转回对象? thinkphp5 model里面用toarray后怎么分页? 以上类似问题的出现,是因为 ...
- request.getParameterNames()和request.getParameterValues()
request.getParameterNames()方法是将发送请求页面中form表单里所有具有name属性的表单对象获取(包括button).返回一个Enumeration类型的枚举. 通过Enu ...
- jenkins centos slave起不来报错The SSH key presented by the remote host does not match the key saved in the Known Hosts file against this host. Connections to this host will be denied until the two keys mat
场景:我的centos-204是一台centos的机器,本来用https://www.cnblogs.com/zndxall/p/8297356.html 的centos slave方式搭建ok的,一 ...
- *** target pattern contains no `%'. Stop.
windows上的ndk工程移到linux下编译就报这个错, 解决方法,把jni目录下obj目录删除,重新编译就好了
- js某一元素在数组中的索引
第一种:数组遍历 function search(arr,dst){ var i = arr.length; while(i-=1){ if (arr[i] == dst){ return i; } ...


