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