#include "opencv\cv.h"
#include "opencv\highgui.h"
using namespace std;
using namespace cv;
Mat normalize(const Mat& src) {
Mat srcnorm;
normalize(src, srcnorm, 0, 255, NORM_MINMAX, CV_8UC1);
return srcnorm;
}
int main(int argc, char *argv[]) {
vector<Mat> db;
string prefix = "E:/CSolution/2013test/test/att_faces/";db.push_back(imread(prefix + "s1/1.pgm", 0));
//db.push_back(imread(prefix + "s1\\1.pgm", 0));
db.push_back(imread(prefix + "s1/2.pgm", 0));
db.push_back(imread(prefix + "s1/3.pgm", 0));
db.push_back(imread(prefix + "s2/1.pgm", 0));
db.push_back(imread(prefix + "s2/2.pgm", 0));
db.push_back(imread(prefix + "s2/3.pgm", 0));
db.push_back(imread(prefix + "s3/1.pgm", 0));
db.push_back(imread(prefix + "s3/2.pgm", 0));
db.push_back(imread(prefix + "s3/3.pgm", 0));
db.push_back(imread(prefix + "s4/1.pgm", 0));
db.push_back(imread(prefix + "s4/2.pgm", 0));
db.push_back(imread(prefix + "s4/3.pgm", 0));
double alpha = 1;
int nprincipal = 10;
double beta = 0;
size_t n = db.size();
size_t d = db[0].total();
Mat src(n, d, CV_32FC1);
for (int i = 0; i < n; i++)
{
Mat xi = src.row(i);
//db[i].reshape(1, 1).row(0).convertTo(xi, CV_32FC1, alpha, beta);
db[i].reshape(1, 1).row(0).convertTo(xi, CV_32FC1, alpha, beta);
}
PCA pca(src, Mat(), CV_PCA_DATA_AS_ROW, nprincipal);
imshow("pca", normalize(pca.eigenvectors.row(0).reshape(1, db[0].rows)));
waitKey();
return 0;
}
人脸数据库: http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html