gpt4 book ai didi

c++ - OpenCV 2.3 (C++) 中的 PCA 项目和反向项目

转载 作者:太空狗 更新时间:2023-10-29 21:49:00 25 4
gpt4 key购买 nike

我正在做一个人脸识别项目,在 PCA 子空间上投影时遇到问题。

当我将带有调整大小的图像的垫子 vector 传递给我的函数时,我投影它们,然后重建它们以验证它是否正常工作,但我在“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();
}
}

最佳答案

我认为这篇文章与以下内容重复:

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

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

你可能想看看我博客中的例子:

关于c++ - OpenCV 2.3 (C++) 中的 PCA 项目和反向项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9426373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com