@使用PCA+SVM实现人脸识别,正样本使用的ORL face database,负样本是自己创建的,使用的QT编程软件
,以下是源码`
#include "mainwindow.h"
#include <opencv2/opencv.hpp>
#include <opencv\cv.h>
#include <opencv\cxcore.h>
#include <opencv\highgui.h>
#include <QApplication>
#include<QMessageBox>
using namespace cv;
using namespace std;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
}
MainWindow::~MainWindow()
{
}
int MainWindow::video_capture()
{
vector<Mat> images; //This variable will be loaded with a set of images to perform PCA on.
char filename[100];
int imageFaceNum = 400;
int imageNonFaceNum = 22;
int num = 0;
int num_face=0;
Size size;
Mat src;
Mat values(imageFaceNum+imageNonFaceNum, 1, CV_32SC1); //Values are the corresponding values to each of my images.
for(int i=1; i<=imageFaceNum/10; i++)
for(int j=1;j<=10;j++)
{
sprintf(filename,"D:\\VS C++\\QT\\PCA+SVM\\ORL face database\\s%d\\%d.bmp",i,j);
values.at<int>(num,0) = 1;
src=imread(filename,0);
size=Size(src.cols,src.rows);
equalizeHist(src,src);
waitKey(30);
imshow("samples",src);
images.push_back(src);
num++;
num_face++;
}
for(int i=1; i<=imageNonFaceNum; i++)
{
Mat dst(size,CV_8UC1);
sprintf(filename,"D:\\VS C++\\QT\\PCA+SVM\\no face database\\%d.jpg",i);
values.at<int>(num,0) = 0;
src=imread(filename,0);
cv:: resize(src,dst,size);
equalizeHist(dst,dst);
waitKey(30);
imshow("samples",dst);
images.push_back(dst);
num++;
}
int nEigens = images.size()-200; //Number of Eigen Vectors.作为基坐标的特征向量个数
//Load the images into a Matrix
Mat desc_mat(num_face, images[0].rows * images[0].cols, CV_8UC1);
Mat desc_mat1(images.size(), images[0].rows * images[0].cols, CV_8UC1);
for (int i=0; i<num_face; i++)
{
desc_mat.row(i) = images[i].reshape(1, 1) ;
}
for (int i=0; i<images.size(); i++)
{
desc_mat1.row(i) = images[i].reshape(1, 1) ;
}
Mat average;
PCA pca(desc_mat, average, CV_PCA_DATA_AS_ROW, nEigens);
Mat data(images.size(), nEigens, CV_32FC1); //This Mat will contain all the Eigenfaces that will be used later with SVM for detection
//Project the images onto the PCA subspace
for(int i=0; i<images.size(); i++)
{
Mat projectedMat(1, nEigens, CV_32FC1);
pca.project(desc_mat1.row(i), projectedMat);
data.row(i) = projectedMat.row(0);
}
cout<<"data"<<data.size()<<endl;
cout<<"values"<<values.size()<<endl;
CvMat d1 = (CvMat)data;
CvMat d2 = (CvMat)values;
CvSVM svm;
CvSVMParams param;
CvTermCriteria criteria;
criteria = cvTermCriteria( CV_TERMCRIT_EPS, 1000, FLT_EPSILON );
param = CvSVMParams( CvSVM::C_SVC, CvSVM::RBF, 10.0, 0.09, 1.0, 10.0, 0.5, 1.0, NULL, criteria );
//☆☆☆☆☆☆☆☆☆(5)SVM学习☆☆☆☆☆☆☆☆☆☆☆☆
svm.train( &d1, &d2, NULL, NULL, param );
svm.save("svmdata.xml");
Mat cs;
src=imread("D:\\VS C++\\QT\\PCA+SVM\\1.bmp",0);
equalizeHist(src,src);
cs = src.reshape(1, 1) ;
Mat projectedMat(1, nEigens, CV_32FC1);
pca.project(cs, projectedMat);
CvMat d3 = (CvMat)projectedMat;
int ret = svm.predict(&d3);
cout<<ret<<endl;
waitKey(0);
return 0;
}
`