PCA + SVM utilisant la Syntaxe C++ dans OpenCV 2.2
Je vais avoir des problèmes pour obtenir de l'APC et Eigenfaces de travail à l'aide de la dernière syntaxe C++ avec le Tapis et de l'APC classes. L'ancienne syntaxe du C a eu un tableau de IplImage* en tant que paramètre pour effectuer son traitement et à l'API actuelle ne prend qu'un Tapis qui est formaté par Colonne ou Ligne. J'ai pris la Ligne en utilisant l'approche de remodeler la fonction pour s'adapter à mon image de la matrice de tenir dans une seule ligne. Finalement, j'ai envie de prendre ces données et l'utilisation de l'algorithme SVM pour effectuer la détection, mais quand je le fais, que toutes mes données est juste un courant de 0. Quelqu'un peut-il m'aider? Ce que je fais mal? Merci!
J'ai vu cette question et c'est un peu lié, mais je ne sais pas quelle est la solution.
C'est en gros ce que j'ai:
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");
OriginalL'auteur Roland Nasr | 2011-02-11
Vous devez vous connecter pour publier un commentaire.
Ce etarion dit est correct.
Pour copier une colonne ou une ligne, vous devez toujours écrire:
Le programme suivant montre comment effectuer une ACP dans OpenCV. Il va montrer l'image moyenne et les trois premières Eigenfaces. Les images que j'ai utilisées dans les y sont disponibles à partir de http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html:
et si vous voulez construire la matrice par ligne (comme dans l'original de votre question ci-dessus) utiliser ce lieu:
et définir l'indicateur dans l'APC:
Concernant l'apprentissage de la machine. J'ai écrit un document sur l'apprentissage de la machine avec le OpenCV API C++ qui a des exemples pour la plupart des classificateurs, y compris les Machines à Vecteurs de Support. Peut-être que vous pouvez obtenir un peu d'inspiration: http://www.bytefish.de/pdf/machinelearning.pdf.
OriginalL'auteur bytefish
Cela ne fonctionnera pas.
operator=
est une copie superficielle, ce qui signifie pas de données est copiée. UtilisationLe même aussi pour:
Il n'importe, car cette déclaration est essentiellement un no-op.
data.row(i)
crée une nouvelle matrice d'en-tête qui pointe vers les mêmes données, maintenantoperator=
modifie cette nouvelle retourné en-tête de matrice et ne fait rien d'autre, et à la fin de l'expression de la matrice temporaire de l'en-tête (que vous avez modifié) est détruite.data
est complètement modifiée. le opencv manuel explicitement les états que cela "ne fonctionne pas".OriginalL'auteur etarion
Je suggère de regarder à la nouvelle vérifié dans les tests sur le svn de la tête
modules/core/test/test_mat.cpp
en ligne ici : https://code.ros.org/svn/opencv/trunk/opencv/modules/core/test/test_mat.cpp
a des exemples pour cancer de la prostate dans le vieux c et c++
Espère que ça aide!
OriginalL'auteur macarthy