PCA в OpenCV с использованием нового интерфейса C ++ - PullRequest
2 голосов
/ 11 января 2011

В качестве отступления: извиняюсь, что я заливаю SO вопросами OpenCV: 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?

1 Ответ

2 голосов
/ 12 января 2011

Ваша ошибка, вероятно, здесь:

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 должно быть размером вашего вектора, т.е. ваших пикселей. Затем скопируйте пиксели из обрезки в матрицу.

...