2011-01-11 13 views
2

Как и в сторону: Извинения, если я затопление SO с OpenCV вопросы: рPCA в OpenCV, используя новый C++ интерфейс

Я в настоящее время пытается портировать мой старый код 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 в первую очередь?

ответ

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