在OPENCV中使用PCA非常简单,只要几条语句就可以了。
1、初始化数据
3、选出前P个特征向量(主成份),然后投影,结果保存在pResult中,pResult中包含了P个系数
使用时如果是想用PCA判断“是非”问题,则可以先用正样本计算主成分,判断时,对需要判断得数据进行投影,然后重构,计算重构出的数据与原数据的差异,如果差异在给定范围内,可以认为“是”。
如果相用PCA进行分类,例如对数字进行分类,则先用所有数据(0-9的所有样本)计算主成分,然后对每一类数据进行投影,计算投影的系数,可简单得求平 均。即对每一类求出平均系数。分类时,将需要分类得数据进行投影,得到系数,与先前计算出得每一类得平均系数进行比较,可判为最接近得一类。当然这只是最 简单得使用方法
#include <QtCore/QCoreApplication>
#include "cv.h"
#include "highgui.h"
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int start = 0;
float arr[360000];
for (int index = 1; index <= 10; index++) {
char t[3];
sprintf(t, "%d", index);
string f(t);
string fileName = "test\\" + f + ".jpg";
IplImage* pSrc = cvLoadImage( fileName.c_str(), 1);
IplImage* pGray = cvCreateImage(cvGetSize(pSrc),8,1);
cvCvtColor(pSrc, pGray, CV_RGB2GRAY);
CvMat* mat = cvCreateMat(pGray->height, pGray->width, CV_32FC1);
cvConvert(pGray, mat);
cvReleaseImage( &pSrc ); //释放图像
cvReleaseImage( &pGray ); //释放图像
for (int i=0; i<mat->rows;i++) {
for (int j=0; j<mat->cols;j++) {
float value = cvmGet(mat, i, j);
arr[start] = value;
start++;
}
}
}
CvMat data = cvMat(10, 36000, CV_32FC1, arr);
CvMat* pMean = cvCreateMat(1, 36000, CV_32FC1);
CvMat* pEigVals = cvCreateMat(1, 10, CV_32FC1);
CvMat* pEigVecs = cvCreateMat(10, 36000, CV_32FC1);
cvCalcPCA( &data, pMean, pEigVals, pEigVecs, CV_PCA_DATA_AS_ROW );
for (int i = 0; i<10; i++) {
cout << cvmGet(pEigVals, 0, i) << endl;
}
return a.exec();
}
转自:
http://www.cnblogs.com/cvlabs/archive/2010/05/14/1735230.html
http://www.cnblogs.com/cvlabs/archive/2010/05/17/1737748.html