2011-11-09 14 views
1

私はPCAを使って画像の特徴ベクトルのサイズを縮小する顔認識プロジェクトに取り組んでいます。問題は、トレーニング中に、すべてのトレーニング画像を組み込むことによってPCAオブジェクトを作成することです。今、テスト中に、私は以前に取得したPCAオブジェクトが必要です。opencvでpcaオブジェクトを保存する

PCAオブジェクトをファイルに書き込む方法がわからないので、テスト中に使用できます。 1つの選択肢は、ファイルに固有ベクトルを書き込むことです。しかし、オブジェクト自体を書く方がずっと便利です。これを行う方法はありますか?

+0

他の質問を確認して回答を受け入れてください。 – karlphillip

答えて

11

私が知る限り、PCAオブジェクトをファイルに保存する一般的な方法はありません。あなたは、固有ベクトル、固有値、平均をファイルに保存し、ロード後に新しいPCAに入れなければなりません。精度を失わないフォーマット、特に平均を使用することを覚えておく必要があります。ここで

は、いくつかのサンプルコードです:

#include "opencv2/core/core.hpp" 
#include <iostream> 

... 

cv::PCA pca1; 
cv::PCA pca2; 

cv::Mat eigenval,eigenvec,mean; 
cv::Mat inputData; 
cv::Mat outputData1,outputData2; 

//input data has been populated with data to be used 
pca1(inputData,Mat()/*dont have previously computed mean*/, 
CV_PCA_DATA_AS_ROW /*depends of your data layout*/);//pca is computed 
pca1.project(inputData,outputData1); 

//here is how to extract matrices from pca 
mean=pca1.mean.clone(); 
eigenval=pca1.eigenvalues.clone(); 
eigenvec=pca1.eigenvectors.clone(); 

//here You can save mean,eigenval and eigenvec matrices 

//and here is how to use them to make another pca 
pca2.eigenvalues=eigenval; 
pca2.eigenvectors=eigenvec; 
pca2.mean=mean; 

pca2.project(inputData,outputData2); 

cv::Mat diff;//here some proof that it works 
cv::absdiff(outputData1,outputData2,diff); 

std::cerr<<sum(diff)[0]<<std::endl; //assuming Youre using one channel data, there 
            //is data only in first cell of the returned scalar 

// if zero was printed, both output data matrices are identical 
+0

固有ベクトルと固有値からpcaオブジェクトを作成する方法について言及できますか?ドキュメントでは、元のデータとmaxcomponentsを渡してpcaオブジェクトを作成する方法が1つしかないようです – Karan

0

あなたはこれを試すことがあります。

void save(const string &file_name,cv::PCA pca_) 
{ 
    FileStorage fs(file_name,FileStorage::WRITE); 
    fs << "mean" << pca_.mean; 
    fs << "e_vectors" << pca_.eigenvectors; 
    fs << "e_values" << pca_.eigenvalues; 
    fs.release(); 
} 

int load(const string &file_name,cv::PCA pca_) 
{ 
    FileStorage fs(file_name,FileStorage::READ); 
    fs["mean"] >> pca_.mean ; 
    fs["e_vectors"] >> pca_.eigenvectors ; 
    fs["e_values"] >> pca_.eigenvalues ; 
    fs.release(); 

} 

Hereがソースです。

関連する問題