0

一連のトレーニング イメージの 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 である必要があります。固有ベクトル行列の各行を保存する必要がありますか? どんな提案でも大歓迎です!

4

3 に答える 3

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();

これが他の誰かにも役立つことを願っています!

于 2013-02-16T18:24:42.237 に答える