一、人脸识别算法之特征脸方法(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、代码

  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 }

二、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、代码

#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);
}

分类: opencv

人脸识别算法之特征脸方法(Eigenface)相关推荐

  1. 经典人脸识别算法(特征脸,FISHERFACE,LBP)

    首先,只是基于对算法的主要是想的介绍和理解,对于涉及到的PCA以及直方图比较提到的方法等等可以自己再去深入研究. 其次,只是用作笔记记录. 参考了CSDN博客:https://blog.csdn.ne ...

  2. 人脸扫描建模_人脸识别中的特征建模方法与流程

    本发明涉及生物特征识别,特别是涉及人脸识别中的特征建模方法. 背景技术: 人脸识别技术一般包括四个组成部分,分别为人脸图像采集.人脸图像预处理.人脸图像特征提取以及匹配与识别,具体来说: 人脸图像采集 ...

  3. python人脸识别特征脸法_人脸识别经典算法一 特征脸方法(Eigenface)

    这篇文章是撸主要介绍人脸识别经典方法的第一篇,后续会有其他方法更新.特征脸方法基本是将人脸识别推向真正可用的第一种方法,了解一下还是很有必要的.特征脸用到的理论基础PCA在另一篇博客里:特征脸(Eig ...

  4. python人脸识别特征脸法_人脸识别经典算法:特征脸方法(Eigenface)

    特征脸方法基本是将人脸识别推向真正可用的第一种方法,了解一下还是很有必要的.特征脸用到的理论基础PCA在之前的文章中已经讲过了.直接上特征脸方法的步骤: 步骤一:获取包含M张人脸图像的集合S.在我们的 ...

  5. 基于OpenCV人脸识别Eigenfaces(特征脸)算法、Fisherfaces算法、Local Binary, Patter Histogram(LBPH)算法认识

    一.Eigenfaces(特征脸)算法 在如今的世界,人脸识别也变得越来越重要,应用越来越广泛,比如人脸识别可用于身份认证.摄影.支付.视频等领域.现在人脸识别一般采用三种经典算法:Eigenface ...

  6. 人脸识别经典算法:特征脸方法(Eigenface)

    https://www.toutiao.com/a6698955075127083527/ 这个算法需要数学知识特别好的人才会看得懂吧! 步骤一:获取包含M张人脸图像的集合S.在我们的例子里有25张人 ...

  7. 人脸检测、人脸跟踪、人脸识别、OpenCV(特征脸、LBPH、费歇脸)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Face_Detection.py# 导入OpenCV库 im ...

  8. openCV学习笔记(十二) —— 人脸识别算法(1/3)—— 特征脸 EigenFaces

    一.原理 opencv支持3种人脸识别的算法,分别是: 1.    Eigen Faces    PCA(特征脸方法) 2.    Fisher Faces    LDA(线性判别分析) 3.     ...

  9. opencv中人脸识别算法的基本原理

    opencv中人脸识别算法的基本原理(一) 使用opencv中自带的三种人脸识别算法进行实验后,特意去了解学习了一下其基本原理,在这里记录下. opencv人脸识别 关于如何使用opencv实现人脸识 ...

最新文章

  1. 建站之前做好规划方案会为网站带来意外之喜
  2. JoshChen_php 简单的商城网站功能原理(一)
  3. 省掉bean自定义spring mvc注解注入json值
  4. htc816t Android go,HTC D816t(Desire D816t 移动4G)一键刷机图文教程详解
  5. 笔试面试常考数据结构-单链表常用操作编程实现
  6. 在教学中利用计算机软件,计算机软件技术教学方法研究
  7. 在CentOS中安装和部署nacos配置中心
  8. Luogu P1963 [NOI2009]变换序列(二分图匹配)
  9. java读取修改文件内容_JAVA读取文件指定内容进行修改
  10. cocos2dx 制作一个简单的三消游戏
  11. oracle的驱动是什么文件,oracle数据库驱动在哪个文件夹
  12. 华为 DAYU 详细介绍
  13. Android studio设计一个简易微信界面
  14. CentOS7 好日子到头了,如何优雅的抛弃 CentOS7?
  15. M1 Mac 上安装 python mysqlclient
  16. 速卖通重点国家市场俄罗斯市场分析平台热销产品推荐
  17. 解决 redis 存入中文,取出来是乱码wenti
  18. Switch开关按钮js
  19. 松滋覃氏家族是明皇子朱棣的御林指挥使卢振的后裔
  20. 换发型软件有哪些?试试这些软件吧

热门文章

  1. mysqli_affected_rows()获取查询受影响的行数
  2. XMind思维导图教程:思维导图怎么画好看?(一)
  3. Vue.use()详解
  4. 涉密磁介质数据清除工具
  5. 金蝶KIS标准版 运行时错误 ‘3800‘: ‘PrimaryKey‘ 不是此表中的一个索引 解决方法
  6. Ex4:Image Warping and Image Morphing
  7. 《Python基础教程》第7章 再谈抽象
  8. CRMEB_Java新零售社交电商系统
  9. Redis理论知识——redis持久化(RDB、AOF)
  10. 怎么查看CAD图纸文件呢?CAD快速看图有什么好的方法吗?