PCA in OpenCV utilizzando l'interfaccia del nuovo C ++
-
10-10-2019 - |
Domanda
Per inciso: Mi scuso se sto inondando SO con domande OpenCV: p
Al momento sto cercando di porto sul mio vecchio codice C per utilizzare la nuova interfaccia C ++ e ho ottenuto al punto in cui sto rebuilidng mia Eigenfaces classe faccia riconoscitore.
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
Sto cercando di creare lo spazio PCA, e poi vedere se funziona, visualizzando l'immagine media calcolata. Ci sono altri passi per questo?
Forse ho bisogno di proiettare le immagini sul sottospazio PCA prima di tutto?
Soluzione
Il tuo errore è probabilmente qui:
Mat data;
data.create(2,1, img2_roi.type());
data.row(0) = img_roi;
data.row(1) = img2_roi;
PCA prevede una matrice con i vettori di dati come righe. Tuttavia, non avete mai scalare le immagini alle stesse dimensioni in modo che abbiano lo stesso numero di pixel (quindi la dimensione è lo stesso), anche data.create(2,1,...)
- le esigenze 1
di essere la dimensione del vettore, cioè il numero dei vostri pixel. Quindi copiare i pixel dal raccolto alla vostra matrice.