【问题标题】:OpenCV PCA questionOpenCV PCA 问题
【发布时间】:2011-11-27 03:41:13
【问题描述】:

我正在尝试在 OpenCV 中创建一个 PCA 模型来保存像素坐标。作为一个实验,我有两组像素坐标,它们映射出两个近似圆。每组坐标有 48 个 x,y 对。我正在尝试使用以下代码从文件中读取坐标并将它们存储在 Mat 结构中。但是,我认为这是不对的,而且 openCV 中的 PCA 在 Internet 上似乎覆盖得很少。

    Mat m(2, 48, CV_32FC2); // matrix with 2 rows of 48 cols of floats held in two channels

pFile = fopen("data.txt", "r");

for (int i=0; i<48; i++){
    int x, y;
    fscanf(pFile, "%d%c%c%d%c", &x, &c, &c, &y, &c);

    m.at<Vec2f>( 0 , i )[0] = (float)x; // store x in row 0, col i in channel 0
    m.at<Vec2f>( 0 , i )[1] = (float)y; // store y in row 0, col i in channel 1

}

for (int i=0; i<48; i++){
    int x, y;
    fscanf(pFile, "%d%c%c%d%c", &x, &c, &c, &y, &c);

    m.at<Vec2f>( 1 , i )[0] = (float)x; // store x in row 1, col i in channel 0
    m.at<Vec2f>( 1 , i )[1] = (float)y; // store y in row 1, col i in channel 1

}

PCA pca(m, Mat(), CV_PCA_DATA_AS_ROW, 2); // 2 principle components??? Not sure what to put here e.g. is it 2 for two data sets or 48 for number of elements?

    for (int i=0; i<48; i++){
 float x = pca.mean.at<Vec2f>(i,0)[0]; //get average x
     float y = pca.mean.at<Vec2f>(i,0)[1]; //get average y
     printf("\n x=%f, y=%f", x, y);
}

但是,这会在创建 pca 对象时崩溃。我知道这是一个非常基本的问题,但我有点迷茫,希望有人可以让我在 open cv 中开始使用 pca。

【问题讨论】:

标签: opencv pca


【解决方案1】:

如果您更详细地描述您需要使用 PCA 做什么以及您希望实现什么(输出?),也许会有所帮助。

我相当确定您的程序崩溃的原因是因为输入 Mat 是 CV_32FC2,而它应该是 CV_32FC1。在使用 PCA 之前,您需要将数据重塑为一维行向量,不知道您需要什么我不能说如何重塑您的数据。 (图像的常见应用是 eigenFace,它需要将图像重新整形为行向量)。此外,您需要在 0 和 1 之间标准化输入数据。

另外,通常您会选择保留比输入样本数少 1 个主成分,因为最后一个主成分与其他主成分完全正交。

我之前曾使用过 opencv PCA,并希望进一步提供帮助。我还建议您参考这个博客:http://www.bytefish.de/blog/pca_in_opencv,它帮助我开始使用 openCV 中的 PCA。

【讨论】:

  • 嗨,凯文,谢谢你的回答,很抱歉延迟回复,因为我已经生病了!!!我想做的是为图像中的嘴创建一个 pca 模型。我所做的是在两张图像中嘴巴周围的样本点,并希望根据我的样本点创建一个 pca 模型。因此,在第一张图像中,我有 48 个 (x,y) 坐标跟随飞蛾的形状,而在第二张图像中,我有另外 48 个点用于不同的嘴巴。然后我想获得平均嘴坐标。我一直在努力寻找有用的在线资源,但没有运气。
  • 我会看看你推荐的博客,因为它看起来很有用。任何有关如何创建所需模型的进一步提示和技巧将不胜感激(如果您或其他任何人有时间)...
  • 嗨,凯文,再次感谢您的帮助。我设法通过使用 CV_32FC1 编译代码并按照您所说的对数据进行规范化。有趣的是,来自更有经验的人的一些提示可以为我们省去很多在谷歌上寻找答案的心痛。互联网上有很多关于 PCA 的好资源,但在使用 OpenCV 的 PCA 示例方面却很少。所以非常感谢你的帮助,它是正确的!!!
  • 没问题,完全同意你所说的几个例子产生了巨大的影响。
猜你喜欢
  • 2018-01-28
  • 2012-02-25
  • 1970-01-01
  • 2013-03-03
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
相关资源
最近更新 更多