2

我正在尝试在 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。

4

1 回答 1

3

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

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

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

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

于 2011-09-29T15:31:38.307 回答