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