OpenCV将PCA特征向量写入yaml文件,失去精度?

时间:2013-02-16 18:03:37

标签: c++ opencv yaml pca

我需要将一组训练图像的OpenCV PCA对象(特征值,特征向量)存储到持久性存储中,我可以重新加载以便稍后进行测试。我正在使用OpenCV 2.4特性XML/YAML file storages将我的特征向量和特征值矩阵写入yaml文件。但是,当重新加载文件并将相同的输入图像投影到重新加载的PCA空间时,我没有得到0的投影之间的差异?我相信我会以某种方式失去精确度,但似乎无法弄明白为什么?我的代码基于@Link在他的解决方案“Saving pca object in opencv"

中给出的答案
int numPrincipalComponents = db.size()-1;
Mat output1, output2;
PCA pca(matrix, global_mean_vec, CV_PCA_DATA_AS_ROW, numPrincipalComponents);

pca.project(matrix.row(0), output1); //Project first image into orig. PCA

Mat eigenvalues = pca.eigenvalues.clone();
Mat eigenvectors = pca.eigenvectors.clone(); 

//Write matrices to pca_happy.yml
FileStorage fs("./Train/FileStore/pca_happy.yml", FileStorage::WRITE);
fs << "Eigenvalues" << eigenvalues;
fs << "Eigenvector" << eigenvectors;
fs.release();

//Load matrices from pca_happy.yml
FileStorage fs1("./Train/FileStore/pca_happy.yml", FileStorage::READ);
Mat loadeigenvectors, loadeigenvalues;
fs1["Eigenvalues"] >> eigenvalues;
fs1["Eigenvector"] >> eigenvectors;
fs1.release();

PCA pca2;
pca2.mean = global_mean_vec;
pca2.eigenvalues = loadeigenvalues;
pca2.eigenvectors = loadeigenvectors;

pca2.project(matrix.row(0), output2);

Mat diff;
absdiff(output1, output2, diff);

cout<<sum(diff)[0]<<endl;

然而差异是88.4并且应该是0,因为我正在投影完全相同的图像。我是否需要存储特征向量矩阵的每一行?任何建议都非常感谢!

3 个答案:

答案 0 :(得分:0)

在设置特征值,特征向量和均值或pca2时,我犯了一个非常愚蠢的错误!

PCA pca2;
pca2.mean = global_mean_vec;
pca2.eigenvalues = loadeigenvalues;
pca2.eigenvectors = loadeigenvectors;

应该是:

PCA pca2;
pca2.mean = global_mean_vec.clone();
pca2.eigenvalues = loadeigenvalues.clone();
pca2.eigenvectors = loadeigenvectors.clone();

希望这也可以帮助其他人!

答案 1 :(得分:0)

你是否正确计算了平均向量? 我只进行了两次小修改:(用我自己的matrix

PCA pca(matrix, Mat(), CV_PCA_DATA_AS_ROW, numPrincipalComponents);//compute mean automatically
pca2.mean = pca.mean;

diff为零。

答案 2 :(得分:0)

我想,PCA2应该是:

Mat eigenvalues1,eigenvectors1;
FileStorage fs1("fileName.yml", FileStorage::READ);
//Mat loadeigenvectors, loadeigenvalues;
fs1["Eigenvalues"] >> eigenvalues1;
fs1["Eigenvector"] >> eigenvectors1;
fs1.release();

PCA pca2;
pca2.mean = pca.mean;
pca2.eigenvalues = eigenvalues1;
pca2.eigenvectors = eigenvectors1;