2013-02-16 83 views
0

我需要将一组训练图像的OpenCV PCA对象(特征值,特征向量)存储到持久性存储中,以便稍后重新加载以供测试。我使用OpenCV 2.4功能XML/YAML file storages将我的特征向量和特征值矩阵写入yaml文件。但是,当重新加载文件并将相同的输入图像投影到重新加载的PCA空间时,我没有得到0投影之间的区别吗?我相信我失去了精确性,但似乎无法弄清楚为什么?我根据我的代码在他的解决方案“Saving pca object in opencv"OpenCV将PCA特征向量写入yaml文件,失去精度?

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; 

通过@link给出一个答案然而不同的是88.4,应该是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(); 

希望这可以帮助其他人!

0

您是否正确计算了均值向量? 我只是做了两个小的修改:(用我自己的matrix

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

diff为零。

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;