3

私は顔認識プロジェクトに取り組んでおり、PCA サブスペースに投影するときに問題が発生しています。

サイズ変更された画像で関数にマット ベクトルを渡すと、それらを投影し、再構築して正常に機能していることを確認しますが、「Cam」ウィンドウにあるのは灰色の画像 (すべて同じ色) だけです。

何が悪いのかわからない。

これは機能です:

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

1 に答える 1

2

この投稿は次のものと重複していると思います。

ああ、あなたのコードにエラーが見つかりました。データ マトリックスを作成するときは、次のことを行います。

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

convertTo を使用してデータを正しい型に変換し、データ マトリックスにコピーする必要があります。

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

次に、正規化された固有ベクトルは問題ないはずです。また、値を表示する前に 0 から 255 の間の値を正規化することを忘れないでください。cv::normalizeを使用してこれを行うことができます。グレースケールに変換する簡単な関数を次に示します。

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

私のブログの例を見たいと思うかもしれません:

于 2012-02-24T16:05:40.487 に答える