PCA + SVM mit C++ - Syntax in OpenCV 2.2
Bin ich immer Probleme auftreten PCA und Eigenfaces arbeiten mit den neuesten C++ - syntax mit dem Mat-und PCA-Klassen. Die alte C-syntax nahm ein array von IplImage* als parameter, um die Verarbeitung und den aktuellen API-dauert nur eine Matte, die formatiert ist Spalte oder Zeile. Ich nahm mir die Zeile Ansatz mit Hilfe der reshape-Funktion passen zu meinem Bild der matrix passt in eine einzige Zeile. Ich will schließlich nehmen diese Daten und verwenden Sie dann den SVM-Algorithmus zur Erkennung durchführen, aber wenn ich das mache, dass alle meine Daten ist nur ein Strom von 0EN. Kann mir bitte jemand helfen? Was mache ich falsch? Danke!
Sah ich diese Frage und es ist etwas im Zusammenhang, aber ich bin mir nicht sicher, was die Lösung ist.
Dies ist im Grunde das, was ich habe:
vector<Mat> images; //This variable will be loaded with a set of images to perform PCA on.
Mat values(images.size(), 1, CV_32SC1); //Values are the corresponding values to each of my images.
int nEigens = images.size() - 1; //Number of Eigen Vectors.
//Load the images into a Matrix
Mat desc_mat(images.size(), images[0].rows * images[0].cols, CV_32FC1);
for (int i=0; i<images.size(); i++) {
desc_mat.row(i) = images[i].reshape(1, 1);
}
Mat average;
PCA pca(desc_mat, average, CV_PCA_DATA_AS_ROW, nEigens);
Mat data(desc_mat.rows, nEigens, CV_32FC1); //This Mat will contain all the Eigenfaces that will be used later with SVM for detection
//Project the images onto the PCA subspace
for(int i=0; i<images.size(); i++) {
Mat projectedMat(1, nEigens, CV_32FC1);
pca.project(desc_mat.row(i), projectedMat);
data.row(i) = projectedMat.row(0);
}
CvMat d1 = (CvMat)data;
CvMat d2 = (CvMat)values;
CvSVM svm;
svm.train(&d1, &d2);
svm.save("svmdata.xml");
InformationsquelleAutor Roland Nasr | 2011-02-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was etarion sagte, ist richtig.
Kopieren einer Spalte oder Zeile, die Sie immer schreiben müssen:
Das folgende Programm zeigt, wie Sie zur Durchführung einer PCA in OpenCV. Es zeige das mittlere Bild und die ersten drei Eigenfaces. Die Bilder, die ich verwendet, dort sind ab http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html:
und wenn Sie wollen, bauen Sie die matrix zeilenweise (wie in deiner ursprünglichen Frage oben) verwenden Sie dieses anstatt:
und setzen Sie das Kennzeichen in der PCA:
Hinsichtlich der Maschine lernen. Ich schrieb ein Dokument, das auf machine-learning mit der OpenCV C++ - API, Beispiele für die meisten Klassifikatoren, einschließlich Support-Vektor-Maschinen. Vielleicht kannst du einige inspiration: http://www.bytefish.de/pdf/machinelearning.pdf.
InformationsquelleAutor bytefish
Wird dies nicht funktionieren.
operator=
ist eine flache Kopie, d.h. keine Daten werden tatsächlich kopiert. VerwendenDas gleiche auch für:
Es ist nicht egal, denn diese Aussage ist im Grunde ein no-op.
data.row(i)
erstellt ein neues matrix-header, die auf die gleichen Daten, die jetztoperator=
ändert diese neue matrix zurückgegeben Kopf-und tut sonst nichts, und am Ende des Ausdrucks die temporäre matrix-header (modifiziert) wird zerstört.data
ist völlig unverändert. die opencv-Handbuch ausdrücklich erklärt, dass dies "nicht funktioniert".InformationsquelleAutor etarion
Ich würde vorschlagen, Blick auf die neu eingecheckt tests im svn Kopf
modules/core/test/test_mat.cpp
online hier : https://code.ros.org/svn/opencv/trunk/opencv/modules/core/test/test_mat.cpp
gibt es Beispiele für PCA in der alten c-und c++ -
Hoffe, das hilft!
InformationsquelleAutor macarthy