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 回答