Я смотрел на тесты, и я думаю, что я более запутался, чем раньше. Я вижу, что они используют генератор случайных чисел для построения своей матрицы для выполнения PCA. Правильно ли я предположить, что мой подход к изменению формы моего Image Mat и добавлению их в строки нового Mat - это правильный подход? Что действительно смущает меня между версией C и C ++, так это то, что C принимает массив изображений (или Matrix), а версия C ++ принимает только одну матрицу. Спасибо!

я проблемы с работой PCA и Eigenfaces с использованием новейшего синтаксиса C ++ с классами Mat и PCA. Более старый синтаксис C использовал массив IplImage * в качестве параметра для выполнения своей обработки, а текущий API принимает только Mat, отформатированный в Column или Row. Я использовал подход Row, используя функцию изменения формы, чтобы подогнать матрицу моего изображения под одну строку. В конце концов я хочу взять эти данные и затем использовать алгоритм SVM для выполнения обнаружения, но когда я это делаю, все мои данные - это просто поток 0. Может кто-нибудь помочь мне? Что я делаю неправильно? Спасибо!

Я виделэтот вопрос и это несколько связано, но я не уверен, что решение.

Это в основном то, что у меня есть:

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");

Ответы на вопрос(2)

Ваш ответ на вопрос