OpenCV PCA问题

发布于 2024-12-06 22:05:11 字数 1326 浏览 1 评论 0原文

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

    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 对象时会崩溃。我知道这是一个非常基本的问题,但我有点迷失,希望有人能让我在开放简历中开始使用 PCA。

I'm trying to create a PCA model in OpenCV to hold pixel coordinates. As an experiment I have two sets of pixel coordinates that maps out two approximate circles. Each set of coordiantes has 48 x,y pairs. I was experimenting with the following code which reads the coordinates from a file and stores them in a Mat structure. However, I don't think it is right and PCA in openCV seems very poorly covered on the 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);
}

However, this crashes when creating the pca object. I know this is a very basic question but I am a bit lost and was hoping that someone could get me started with pca in open cv.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

心房敞 2024-12-13 22:05:11

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

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

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

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

Perhaps it would be helpful if you described in further detail what you need to use PCA for and what you hope to achieve (output?).

I am fairly sure that the reason your program crashes is because the input Mat is CV_32FC2, when it should be CV_32FC1. You need to reshape your data into 1 dimensional row vectors before using PCA, not knowing what you need I can't say how to reshape your data. (The common application with images is eigenFace which requires an image to be reshaped into a row vector). Additionally you will need to normalize your input data between 0 and 1.

As a further aside, usually you would choose to keep 1 less principal component than the number of input samples because the last principal component is simply orthogonal to the others.

I have worked with opencv PCA before and would like to help further. I would also refer you to this blog: http://www.bytefish.de/blog/pca_in_opencv which helped me get started with PCA in openCV.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文