3

我正在做一个人脸识别项目,在 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();
}
}
4

1 回答 1

2

我认为这篇文章是重复的:

啊,我在你的代码中发现了错误。当您创建数据矩阵时,您会:

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;
}

您可能想查看我博客中的示例:

于 2012-02-24T16:05:40.487 回答