PCA en OpenCV usando el nuevo interfaz de C ++
-
10-10-2019 - |
Pregunta
Como acotación al margen: Disculpas si estoy inundando SO con preguntas OpenCV: p
Actualmente estoy tratando de puerto sobre mi código C de edad para utilizar la nueva interfaz de C ++ y he llegado al punto en el que estoy rebuilidng mi clase Eigenfaces cara reconocedor.
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
Estoy intentando crear el espacio PCA, y luego ver si está funcionando mediante la visualización de la imagen promedio calculado. ¿Hay otros pasos para esto?
Tal vez tengo que proyectar las imágenes sobre el subespacio PCA en primer lugar?
Solución
Su error es probablemente aquí:
Mat data;
data.create(2,1, img2_roi.type());
data.row(0) = img_roi;
data.row(1) = img2_roi;
PCA espera una matriz con los vectores de datos como filas. Sin embargo, nunca escalar las imágenes al mismo tamaño para que tengan el mismo número de píxeles (por lo que la dimensión es el mismo), también data.create(2,1,...)
- las necesidades 1
a ser la dimensión de su vector, es decir, el número de sus píxeles. A continuación, copie los píxeles de la cosecha a su matriz.