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 ...
随机推荐
- 简单数据库开发之dao层开发
数据库 dao层是用来与底层数据库连接的一系列代码,它因上层service层调用而调用底层数据库,因为一般的数据库不会只存在一到几张表格,所以必须定义出dao层的接口协议,方便各种表格的操作. dao ...
- Django集成Bootstrap美化后台
1.pip install bootstrap-admin 2.编辑项目下的settings.py,增加下面行,放在最前面 3.编辑项目下的settings.py,增加下面行
- 在docker上部署mysql
1.拉取官方镜像5.6的版本.(查看有哪些版本,可以在阿里云的镜像仓库查看,我配置的镜像是阿里云的) docker pull mysql:5.6 2.查看拉取的镜像,获取镜像id docker ima ...
- treesoft,couchDB,
下载 docker 镜像:docker pull docker.io/lu566/treesoft:1.0启动容器:docker run -d -p 127.0.0.1:18080:8080 dock ...
- VScode 中 vue文件template中不能使用tab补齐标签
选择 文件-->首选项-->设置-->搜索 emmet,选择 编辑 setting.json, 添加下列代码: "emmet.includeLanguages" ...
- java面试题 wait和sleep区别
sleep() 方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争cpu的执行时间 wait()是Objec ...
- AWS 移动推送到iOS设备,Amazon Pinpoint
前言 第一次对接aws,遇到的坑是真多.现在记录一下.本文主要用到的是[Amazon Pinpoint]推送. 开发人员的指南:https://docs.aws.amazon.com/zh_cn/pi ...
- cacheline基本理论
一.cacheline 1.cache:解决cpu频率与内存访问之间速度差距越来越大的问题 2.cacheline:cpu cache的最小单位,主流为64B 3.指导:访问数组数据在同一个cache ...
- JFinal框架
FJinal过滤器(tomcat) 创建java类继承JFinalConfig 会实现六个方法(有一个是拦截器的方法好像是,那个我好像看的跟struts2一样但是又没看懂暂时不写) Controlle ...
- python之xml模块
# XML 模块的操作参考链接 # http://www.cnblogs.com/yuanchenqi/articles/5732581.html