opencv+pca小结

pca,求出协方差矩阵,然后算出协方差矩阵的特征值和特征向量,使特征值从大到小排序,同时排序特征向量,

这样的话,根据选择,取前面若干位的特征。

假设有100个样本,50个正样本,50个负样本,每个样本的大小为20*20,

Mat  matImage = imread("图像路径",0);则matImage 的大小为20*20,

收集所有样本,存入图像集合中, vector vecSrcImage;


//pca参数

int   nEigens = 200;  //这个数随机设定,即是要取多少维

Mat  desc_mat(vecSrcImage.size(),   matImage.cols*matImage.rows;  CV_8UC1);

//使用reshape函数,将原始的20*20的图像转为1*400的集合

for(int i=0; i

{

//reshape的参数,第一个参数,为0表示原通道,为1表示1通道,第二个参数代表行数

desc_mat.row(i) = vecSrcImage[i].reshape(1,1) + 0; 

}

Mat  average;   //每一列的平均值,pca函数的参数

PCA pca(desc_mat,  average,  CV_PCA_DATA_AS_ROW, nEigens );

//这一步得到可用于训练分类器的数据集合

Mat data (desc_mat.rows, nEigens, CV_32FC1);

for(int i=0; i

{

Mat projectedMat(1, nEigens, CV_32Fc1);

pca.project(desc_mat.row(i), projectedMat);

data.row(i) = projectedMat.row(0) + 0;

}

//下一步是使用data数据集 和 样本的标签 训练分类器,假定保存名为svm.xml

//Opencv自带的分类器,数据格式为CvMat


//现在可以测试了

Mat matTmp = imread("  图像路径", 0);

Mat matTmp01 = matTmp.reshape(1, 1) + 0;

Mat predictMat(1, nEigens, CV_32FC1);

pca.project(matTmp01, predictMat);

//预测函数进行预测

//svm.predict();   //(predictMat)


小结:根据样本得到pca的参数,这样的话,就算已经得到了分类器,以后可以直接调用分类器,但是要使用pca.project这个函数,

那岂不是每次都要载入训练集样本进行计算得到这个pca参数。   研究不深,暂时到此。










你可能感兴趣的:(机器学习)