2012-02-24 9 views
3

私は顔認識プロジェクトに取り組んでおり、PCA部分空間に投影するときに問題があります。OpenCV 2.3(C++)のPCAプロジェクトとバックプロジェクト

リサイズされたイメージを使用して機能にマットベクトルを渡すと、私はそれらを投影し、それが正常に機能していることを確認するために再構成しますが、 "カム"ウィンドウにあるすべてがグレーのイメージです)。

私は何をやっているのか分かりません。

これは、関数である:

void doPCA (const vector<Mat>& images) 
{ 
int nEigens = images.size()-1; 
Mat data (images.size(), images[0].rows*images[0].cols, images[0].type()); 
for (int i = 0; i < images.size(); i++) 
{ 
Mat aux = data.row(i); 
images[i].reshape(1,1).copyTo(aux); 
} 
PCA pca(data,Mat(),CV_PCA_DATA_AS_ROW,nEigens); 

//Project images 
Mat dataprojected(data.rows, nEigens, CV_32FC1) ; 
for(int i=0; i<images.size(); i++) 
{ 
pca.project(data.row(i), dataprojected.row(i)); 
} 

//Backproject to reconstruct images 
Mat datareconstructed (data.rows, data.cols, data.type()); 
for(int i=0; i<images.size(); i++) 
{ 
pca.backProject (dataprojected.row(i), datareconstructed.row(i)); 
} 
for(int i=0; i<images.size(); i++) 
{ 
imshow ("Cam", datareconstructed.row(i).reshape(1,images[0].rows)); 
waitKey(); 
} 
} 

答えて

2

私はこのポストはの複製であると思う:

ああ、私はあなたのコード内のエラーを発見しました。あなたはデータ行列を作成するときは、操作を行います。

images[i].reshape(1,1).copyTo(aux); 

あなたは正しい型にデータを変換するためにconvertToを使用する必要がありますし、あなたのデータ行列にそれをコピーします。次に、正規化された固有ベクトルがあるべき

images[i].reshape(1,1).convertTo(aux, CV_32FC1, 1/255.); 

OK。そして、あなたがこれを行うにはcv::normalizeを使用することができ、それらを表示する前に、0〜255の値を正規化することを忘れないでください、ここでグレースケールにそれを回すための簡単な関数です:

Mat toGrayscale(const Mat& src) { 
    Mat srcnorm; 
    cv::normalize(src, srcnorm, 0, 255, NORM_MINMAX, CV_8UC1); 
    return srcnorm; 
} 

あなたが見てみたいこと私のブログの例:すべての

+0

こんにちはbytefish.First、感謝。私は "normalize"で試しましたが、うまくいきませんので、私のコードをあなたのアルゴリズム(単純な例)を使用するように書き直して、pca.meanと固有ベクトルを表示すると黒い画像が表示されます。 – user1219145

+0

convertToがあなたの問題を解決したら(私は私の答えを編集しました)、試してください。ちなみに、私がEigenfacesとFisherfacesの実装を私のページに提供しています。 – bytefish

+0

ご協力ありがとうございます。最後に私はあなたのブログにあるあなたのコード "Simple Example"を使用しており、うまくいきました。私はあなたのブログの残りの部分をチェックします。再度、感謝します。 – user1219145

関連する問題