人脸识别算法之特征脸方法(Eigenface)
一、人脸识别算法之特征脸方法(Eigenface)
1、原理介绍及数据收集
特征脸方法主要是基于PCA降维实现。
详细介绍和主要思想可以参考
https://www.cnblogs.com/little-monkey/p/8118938.html
http://blog.csdn.net/u010006643/article/details/46417127
上述博客的人脸数据库打不开了,大家可以去下面这个博客下载ORL人脸数据库
http://blog.csdn.net/xdzzju/article/details/50445160
下载后,ORL人脸数据库有40个人,每人10张照片。
2、流程
3、相关图示
4、代码
![](/assets/blank.gif)
1 #include <opencv2/opencv.hpp> 2 #include <opencv2/face.hpp> 3 4 using namespace cv; 5 using namespace cv::face; 6 using namespace std; 7 8 //对原图归一化 9 Mat normal(Mat src, Mat dst) { 10 if (src.channels() == 1)//若原图单通道 11 normalize(src, dst, 0, 255, NORM_MINMAX, CV_8UC1); 12 else //否则,原图三通道 13 normalize(src, dst, 0, 255, NORM_MINMAX, CV_8UC3); 14 return dst; 15 } 16 17 void main() { 18 //读取文件,转换为数据流 19 string filename = string("at.txt"); 20 ifstream file(filename.c_str(), ifstream::in); 21 if (!file) 22 cout << "error" << endl; 23 24 string line, path, classlabel; 25 vector<Mat>image; 26 vector<int>labels; 27 char separator = ';'; 28 while (getline(file,line)) 29 { 30 stringstream liness(line); 31 getline(liness, path, separator); 32 getline(liness, classlabel); 33 if (!path.empty()&&!classlabel.empty()) 34 { 35 //cout << "path:" << path<< endl; 36 image.push_back(imread(path, 0)); 37 labels.push_back(atoi(classlabel.c_str())); 38 } 39 } 40 41 if (image.size() < 1 || labels.size() < 1) 42 cout << "invalid image path..." << endl; 43 44 int height = image[0].rows; 45 int width = image[0].cols; 46 //cout << "height:" << height << ",width:" << width<<endl; 47 48 //最后一个人为测试样本 49 Mat testSample = image[image.size() - 1]; 50 int testLabel = labels[labels.size() - 1]; 51 image.pop_back(); 52 labels.pop_back(); 53 54 //训练 55 Ptr<BasicFaceRecognizer>model = createEigenFaceRecognizer(); 56 model->train(image, labels); 57 58 //识别 59 int predictLabel = model->predict(testSample); 60 cout << "actual label:" << testLabel << ",predict label:" << predictLabel << endl; 61 62 //获得特征值,特征向量,均值 平均脸 63 Mat eigenvalues = model->getEigenValues(); 64 Mat eigenvectors = model->getEigenVectors(); 65 Mat mean = model->getMean(); 66 Mat meanFace = mean.reshape(1,height); 67 Mat dst; 68 dst= normal(meanFace,dst); 69 imshow("Mean Face", dst); 70 71 //特征脸 72 for (int i = 0; i < min(10,eigenvectors.cols); i++) 73 { 74 Mat ev = eigenvectors.col(i).clone(); 75 Mat eigenFace = ev.reshape(1, height); 76 Mat grayscale; 77 grayscale = normal(eigenFace, grayscale); 78 Mat colorface; 79 applyColorMap(grayscale, colorface, COLORMAP_BONE); 80 char* winTitle = new char[128]; 81 sprintf(winTitle, "eigenface_%d", i); 82 imshow(winTitle, colorface); 83 } 84 85 //重建人脸 86 for (int num = min(10, eigenvectors.cols); num < min(300, eigenvectors.cols); num+=15) 87 { 88 Mat evs = Mat(eigenvectors, Range::all(), Range(0, num)); 89 Mat projection = LDA::subspaceProject(evs, mean, image[0].reshape(1, 1)); 90 Mat reconstruction= LDA::subspaceReconstruct(evs, mean, projection); 91 92 Mat result = reconstruction.reshape(1, height); 93 reconstruction = normal(result, reconstruction); 94 char* winTitle = new char[128]; 95 sprintf(winTitle, "recon_face_%d", num); 96 imshow(winTitle, reconstruction); 97 } 98 99 waitKey(0); 100 }
![](/assets/blank.gif)
二、FisherFace(LDA线性判别分析)
1、理论介绍
http://blog.csdn.net/feirose/article/details/39552997
2、流程
3、PCA和LDA的对比
4、代码(与特征脸代码几乎一致)
此处只列出修改部分
1
2
3
4
5
6
|
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、代码
![](/assets/blank.gif)
#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() == 1)//若原图单通道normalize(src, dst, 0, 255, NORM_MINMAX, CV_8UC1);else //否则,原图三通道normalize(src, dst, 0, 255, 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, 0));labels.push_back(atoi(classlabel.c_str()));}}if (image.size() < 1 || labels.size() < 1)cout << "invalid image path..." << endl;int height = image[0].rows;int width = image[0].cols;//cout << "height:" << height << ",width:" << width<<endl;//最后一个人为测试样本Mat testSample = image[image.size() - 1];int testLabel = labels[labels.size() - 1];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(0); }
![](/assets/blank.gif)
人脸识别算法之特征脸方法(Eigenface)相关推荐
- 经典人脸识别算法(特征脸,FISHERFACE,LBP)
首先,只是基于对算法的主要是想的介绍和理解,对于涉及到的PCA以及直方图比较提到的方法等等可以自己再去深入研究. 其次,只是用作笔记记录. 参考了CSDN博客:https://blog.csdn.ne ...
- 人脸扫描建模_人脸识别中的特征建模方法与流程
本发明涉及生物特征识别,特别是涉及人脸识别中的特征建模方法. 背景技术: 人脸识别技术一般包括四个组成部分,分别为人脸图像采集.人脸图像预处理.人脸图像特征提取以及匹配与识别,具体来说: 人脸图像采集 ...
- python人脸识别特征脸法_人脸识别经典算法一 特征脸方法(Eigenface)
这篇文章是撸主要介绍人脸识别经典方法的第一篇,后续会有其他方法更新.特征脸方法基本是将人脸识别推向真正可用的第一种方法,了解一下还是很有必要的.特征脸用到的理论基础PCA在另一篇博客里:特征脸(Eig ...
- python人脸识别特征脸法_人脸识别经典算法:特征脸方法(Eigenface)
特征脸方法基本是将人脸识别推向真正可用的第一种方法,了解一下还是很有必要的.特征脸用到的理论基础PCA在之前的文章中已经讲过了.直接上特征脸方法的步骤: 步骤一:获取包含M张人脸图像的集合S.在我们的 ...
- 基于OpenCV人脸识别Eigenfaces(特征脸)算法、Fisherfaces算法、Local Binary, Patter Histogram(LBPH)算法认识
一.Eigenfaces(特征脸)算法 在如今的世界,人脸识别也变得越来越重要,应用越来越广泛,比如人脸识别可用于身份认证.摄影.支付.视频等领域.现在人脸识别一般采用三种经典算法:Eigenface ...
- 人脸识别经典算法:特征脸方法(Eigenface)
https://www.toutiao.com/a6698955075127083527/ 这个算法需要数学知识特别好的人才会看得懂吧! 步骤一:获取包含M张人脸图像的集合S.在我们的例子里有25张人 ...
- 人脸检测、人脸跟踪、人脸识别、OpenCV(特征脸、LBPH、费歇脸)
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Face_Detection.py# 导入OpenCV库 im ...
- openCV学习笔记(十二) —— 人脸识别算法(1/3)—— 特征脸 EigenFaces
一.原理 opencv支持3种人脸识别的算法,分别是: 1. Eigen Faces PCA(特征脸方法) 2. Fisher Faces LDA(线性判别分析) 3. ...
- opencv中人脸识别算法的基本原理
opencv中人脸识别算法的基本原理(一) 使用opencv中自带的三种人脸识别算法进行实验后,特意去了解学习了一下其基本原理,在这里记录下. opencv人脸识别 关于如何使用opencv实现人脸识 ...
最新文章
- 建站之前做好规划方案会为网站带来意外之喜
- JoshChen_php 简单的商城网站功能原理(一)
- 省掉bean自定义spring mvc注解注入json值
- htc816t Android go,HTC D816t(Desire D816t 移动4G)一键刷机图文教程详解
- 笔试面试常考数据结构-单链表常用操作编程实现
- 在教学中利用计算机软件,计算机软件技术教学方法研究
- 在CentOS中安装和部署nacos配置中心
- Luogu P1963 [NOI2009]变换序列(二分图匹配)
- java读取修改文件内容_JAVA读取文件指定内容进行修改
- cocos2dx 制作一个简单的三消游戏
- oracle的驱动是什么文件,oracle数据库驱动在哪个文件夹
- 华为 DAYU 详细介绍
- Android studio设计一个简易微信界面
- CentOS7 好日子到头了,如何优雅的抛弃 CentOS7?
- M1 Mac 上安装 python mysqlclient
- 速卖通重点国家市场俄罗斯市场分析平台热销产品推荐
- 解决 redis 存入中文,取出来是乱码wenti
- Switch开关按钮js
- 松滋覃氏家族是明皇子朱棣的御林指挥使卢振的后裔
- 换发型软件有哪些?试试这些软件吧
热门文章
- mysqli_affected_rows()获取查询受影响的行数
- XMind思维导图教程:思维导图怎么画好看?(一)
- Vue.use()详解
- 涉密磁介质数据清除工具
- 金蝶KIS标准版 运行时错误 ‘3800‘: ‘PrimaryKey‘ 不是此表中的一个索引 解决方法
- Ex4:Image Warping and Image Morphing
- 《Python基础教程》第7章 再谈抽象
- CRMEB_Java新零售社交电商系统
- Redis理论知识——redis持久化(RDB、AOF)
- 怎么查看CAD图纸文件呢?CAD快速看图有什么好的方法吗?