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