我需要将一组训练图像的 OpenCV PCA 对象(特征值、特征向量)存储到持久存储中,以便稍后重新加载以进行测试。我正在使用 OpenCV 2.4 功能XML/YAML 文件存储将我的特征向量和特征值矩阵写入 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,因为我正在投影完全相同的图像。我需要存储特征向量矩阵的每一行吗?任何建议都非常感谢!