基于OpenCV的EigenFace FisherFace LBPHFace人脸识别的实现
来源:互联网 发布:防空武器系统淘宝订购 编辑:程序博客网 时间:2024/06/07 10:32
OpenCV自带了丰富的人脸识别库,本文通过阅读OpenCV文档,实现了人脸识别的三种经典算法:PCA(特征脸方法),LDA(线性判别分析),以及LBP(Local Binary Patterns,局部二值模式)方法。人脸数据集采用的是Yale的人脸数据库和att_faces人脸库,下载链接http://pan.baidu.com/s/1hrmZRZe
下面附上代码:
#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++) { char* temp=new char[3]; itoa(i,temp,10); fileName[i]="yaleFaceDataset/s"; fileName[i]+=temp; fileName[i]+=".bmp"; } for(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++) { 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=0; model.release(); 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;}