一、人脸识别算法之特征脸方法(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的更多相关文章

  1. DeepID人脸识别算法之三代(转)

    DeepID人脸识别算法之三代 转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/42091205 DeepID,目前最强人脸识别算法,已经三 ...

  2. DeepID人脸识别算法之三代

    DeepID人脸识别算法之三代 转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/42091205 DeepID,眼下最强人脸识别算法.已经三 ...

  3. 用opencv做的静态图片人脸识别

    这次给大家分享一个图像识别方面的小项目,主要功能是识别图像中的人脸并根据人脸在图片库找出同一个与它最相似的图片,也就是辨别不同的人. 环境:VS2013+opencv2.4.13 主要是算法:open ...

  4. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  5. 总结几个简单好用的Python人脸识别算法

    原文连接:https://mp.weixin.qq.com/s/3BgDld9hILPLCIlyysZs6Q 哈喽,大家好. 今天给大家总结几个简单.好用的人脸识别算法. 人脸识别是计算机视觉中比较常 ...

  6. 基于MATLAB的人脸识别算法的研究

    基于MATLAB的人脸识别算法的研究 作者:lee神 现如今机器视觉越来越盛行,从智能交通系统的车辆识别,车牌识别到交通标牌的识别:从智能手机的人脸识别的性别识别:如今无人驾驶汽车更是应用了大量的机器 ...

  7. Eigenface与PCA人脸识别算法实验

    简单的特征脸识别实验 实现特征脸的过程其实就是主成分分析(Principal Component Analysis,PCA)的一个过程.关于PCA的原理问题,它是一种数学降维的方法.是为了简化问题.在 ...

  8. Visual C++ 经典的人脸识别算法源代码

    说明:VC++ 经典的人脸识别算法实例,提供人脸五官定位具体算法及两种实现流程. 点击下载

  9. opencv学习之路(41)、人脸识别

    一.人脸检测并采集个人图像 //take_photo.cpp #include<opencv2/opencv.hpp> using namespace cv; using namespac ...

随机推荐

  1. css学习_css补充知识

    1.渐进增强,优雅降级 2.浏览器前缀 3.背景渐变   4.css  验证工具 2种方式:第2种支持验证本地的css(推荐) 5.css压缩  ----(节约空间,节省带宽) 6.旋转轮播图 案例: ...

  2. style样式不换行

    style="white-space:nowrap;"不自动换行<font color="" size=""></font ...

  3. [strongswan][autoconf][automake][cento] 在CentOS上编译strongswan git源码时遇到的autoconf问题

    编译strongswan的git源码问题 1. 概述 首先,我们想要通过源码编译strongswan.当满足以下条件时,通常你会遇见此问题: 源码时通过git clone的得来的,而不是官网下载的源码 ...

  4. react-native-Cocoapods-Swift-Project

    https://reactnative.cn/docs/integration-with-existing-apps/ 1.创建一个xcode工程,single View就行,项目语言选择swift, ...

  5. Sessions Hang on row cache lock

    Sessions Hang on "row cache lock" (dc_objects) While Creating & Dropping a Table Concu ...

  6. 提取一个txt 文档中含指定字符串的所有行

    将一个txt 文档中含指定字符串内容的所有行提取出来并保存至新的txt文档中 例如,要提取 1.txt 中所有包含”aaa” 的行的内容 只需在此文件夹中新建一个bat文件,输入以下代码,双击运行,便 ...

  7. npm run dev没反应

    npm config set registry https://registry.npm.taobao.org npm install npm run dev

  8. zabbix监控特定脚本有无生成

    1.由于权限问题,zabbix不能直接查看其它用户目录下的文件,修改sudo文件使zabbix用户能以root身份执行test命令 visudo zabbix ALL=(root) NOPASSWD: ...

  9. JQuery实现一个轮播图

    1.HTML <div class="banner"> <div class="b_main"> <div class=" ...

  10. JavaScript 里 var a =a ||{}

    首先,搞明白||的意思. 1.在js里面,||运算符,比如(A||B)有个很有意思的用处: 2.系统先判断A表达式的布尔值,是真是假.如果为真,直接返回A.如果为假,直接返回B(不会判断B是什么类型) ...