2

余談ですが、OpenCVの質問でSOを氾濫させている場合はお詫びします:p

現在、古いCコードを移植して新しいC ++インターフェイスを使用しようとしていますが、Eigenfacesの顔認識クラスを再構築するところまで来ています。

 Mat img = imread("1.jpg");
 Mat img2 = imread("2.jpg");
 FaceDetector* detect = new HaarDetector("haarcascade_frontalface_alt2.xml");

 // convert to grey scale
 Mat g_img, g_img2;
 cvtColor(img, g_img, CV_BGR2GRAY);
 cvtColor(img2, g_img2, CV_BGR2GRAY);

 // find the faces in the images
 Rect r = detect->getFace(g_img);
 Mat img_roi = g_img(r);

 r = detect->getFace(g_img2);
 Mat img2_roi = g_img2(r);

 // create the data matrix for PCA
 Mat data;
 data.create(2,1, img2_roi.type());
 data.row(0) = img_roi;
 data.row(1) = img2_roi;

 // perform PCA
 Mat averageFace;
 PCA pca(data, averageFace, CV_PCA_DATA_AS_ROW, 2);

 //namedWindow("avg",1); imshow("avg", averageFace); - causes segfault
 //namedWindow("avg",1); imshow("avg", Mat(pca.mean)); - doesn't work

PCA空間を作成しようとしています。次に、計算された平均画像を表示して、それが機能しているかどうかを確認します。これに対する他のステップはありますか?

おそらく、最初に画像をPCA部分空間に投影する必要がありますか?

4

1 に答える 1

2

あなたのエラーはおそらくここにあります:

Mat data;
data.create(2,1, img2_roi.type());
data.row(0) = img_roi;
data.row(1) = img2_roi;

PCAは、データベクトルを行として持つ行列を想定しています。ただし、画像を同じサイズに拡大縮小して同じピクセル数にすることはできません(つまり、寸法は同じです)。また、ベクトルの寸法、つまりピクセル数である必要がありますdata.create(2,1,...)1次に、クロップからマトリックスにピクセルをコピーします。

于 2011-01-12T09:53:09.130 に答える