Проект PCA и Backproject в OpenCV 2.3 (C ++) - PullRequest
3 голосов
/ 24 февраля 2012

Я работаю над проектом по распознаванию лиц, и у меня возникают проблемы при проецировании на подпространство PCA.

Когда я передаю матричный вектор своей функции с изображениями с измененным размером, я проецирую их, а затем реконструирую их, чтобы убедиться, что они работают хорошо, но все, что у меня есть в окне «Cam», это серое изображение (все того же цвета) .

Я не знаю, что я делаю плохо.

Это функция:

void doPCA (const vector<Mat>& images)
{
int nEigens = images.size()-1;
Mat data (images.size(), images[0].rows*images[0].cols, images[0].type() );
for (int i = 0; i < images.size(); i++)
{
Mat aux = data.row(i);
images[i].reshape(1,1).copyTo(aux);
}
PCA pca(data,Mat(),CV_PCA_DATA_AS_ROW,nEigens);

//Project images
Mat dataprojected(data.rows, nEigens, CV_32FC1) ;
for(int i=0; i<images.size(); i++)
{
pca.project(data.row(i), dataprojected.row(i));
}

//Backproject to reconstruct images
Mat datareconstructed (data.rows, data.cols, data.type());
for(int i=0; i<images.size(); i++)
{
pca.backProject (dataprojected.row(i), datareconstructed.row(i) );
}
for(int i=0; i<images.size(); i++)
{
imshow ("Cam", datareconstructed.row(i).reshape(1,images[0].rows) );
waitKey();
}
}

1 Ответ

2 голосов
/ 24 февраля 2012

Я думаю, что этот пост является дубликатом:

Ах, я нашел ошибку в вашем коде. Когда вы создаете матрицу данных, вы делаете:

images[i].reshape(1,1).copyTo(aux);

Вы должны использовать convertTo для преобразования данных в правильный тип и копирования их в матрицу данных:

images[i].reshape(1,1).convertTo(aux, CV_32FC1, 1/255.);

Тогда нормализованные собственные векторы должны быть в порядке. И не забудьте нормализовать значения между 0 и 255 перед их отображением, вы можете использовать cv :: normalize , чтобы сделать это, вот простая функция для превращения его в градации серого:

Mat toGrayscale(const Mat& src) {
    Mat srcnorm;
    cv::normalize(src, srcnorm, 0, 255, NORM_MINMAX, CV_8UC1);
    return srcnorm;
}

Вы можете посмотреть на пример в моем блоге:

...