
基于OpenCV的EigenFace FisherFace LBPHFace人脸识别的实现
OpenCV自带了丰富的人脸识别库,本文通过阅读OpenCV文档,实现了人脸识别的三种经典算法:PCA(特征脸方法),LDA(线性判别分析),以及LBP(Local Binary Patterns,局部二值模式)方法。人脸数据集采用的是Yale的人脸数据库和att_faces人脸库,下载链接
下面附上代码:
/*2015.12.31,by xdzzju*/
/*改程序的功能是利用opencv的人脸识别库,训练及测试yale人脸库和att_faces人脸库,可选用三种训练模型,eigenface,fisherface及LBP*/
/*编程环境为vs2012+opencv2.4.9*/#include "iostream"
#include "stdlib.h"
#include "vector"#include "opencv2/core/core.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/highgui/highgui.hpp"using namespace std;
using namespace cv;int main()
{vector<Mat> images;vector<int> labels;cout<<"choose dataset:"<<endl;int datasetChoose;cin>>datasetChoose; //选择数据集if(datasetChoose==1){string* fileName=new string[166];for(int i=1;i<=165;i++) //将文件名编号放入string数组,从1开始{char* temp=new char[3];itoa(i,temp,10);fileName[i]="yaleFaceDataset/s";fileName[i]+=temp;fileName[i]+=".bmp";}// load imagesfor(int i=1;i<=165;i++){if(i%11) //将每组人脸的前十张用于训练,最后一张用于测试{images.push_back(imread(fileName[i], CV_LOAD_IMAGE_GRAYSCALE));labels.push_back(i/11+1);}}int modelChoose;Ptr<FaceRecognizer> model;while(1){cout<<"choose model:"<<endl;cout<<"1 EigenFace"<<endl;cout<<"2 Fisher"<<endl;cout<<"3 LBPH"<<endl;cin>>modelChoose;switch(modelChoose){case 1:model = createEigenFaceRecognizer();break;case 2:model = createFisherFaceRecognizer();break;case 3:model = createLBPHFaceRecognizer();break;default:model = createLBPHFaceRecognizer();break;}model->train(images,labels);for(int i=11;i<=165;i+=11){Mat image=imread(fileName[i], CV_LOAD_IMAGE_GRAYSCALE);int predict=model->predict(image);cout<<predict<<endl;}}}else if(datasetChoose==2){int predictRight=0,predictWrong=0;string fileName;char* tempdir=new char[3];char* tempFilename=new char[3];for(int i=1;i<=40;i++) //导入图片,每组前9张作为训练集,最后一张用来测试{for(int j=1;j<=9;j++){fileName="att_faces/";itoa(i,tempdir,10);fileName+="s";fileName+=tempdir;fileName+="/";itoa(j,tempFilename,10);fileName+=tempFilename;fileName+=".bmp";Mat tempImage=imread(fileName, CV_LOAD_IMAGE_GRAYSCALE);images.push_back(tempImage);labels.push_back(i);}}int modelChoose;Ptr<FaceRecognizer> model;while(1){predictRight=0;predictWrong=lease();cout<<"choose model:"<<endl;cout<<"1 EigenFace"<<endl;cout<<"2 Fisher"<<endl;cout<<"3 LBPH"<<endl;cin>>modelChoose;switch(modelChoose){case 1:model = createEigenFaceRecognizer();break;case 2:model = createFisherFaceRecognizer();break;case 3:model = createLBPHFaceRecognizer();break;default:model = createLBPHFaceRecognizer();break;}model->train(images,labels);for(int i=1;i<=40;i++){fileName="att_faces/";itoa(i,tempdir,10);fileName+="s";fileName+=tempdir;fileName+="/";fileName+="10.bmp";cout<<fileName<<endl;Mat image=imread(fileName, CV_LOAD_IMAGE_GRAYSCALE);int predict=model->predict(image);if(predict==i)predictRight++;else predictWrong++;cout<<predict<<endl;}cout<<"right:"<<predictRight<<endl;cout<<"wrong:"<<predictWrong<<endl;}}return 0;
}