OpenCV PCA вопрос - PullRequest
       5

OpenCV PCA вопрос

2 голосов
/ 28 сентября 2011

Я пытаюсь создать модель PCA в OpenCV для хранения координат пикселей. В качестве эксперимента у меня есть два набора координат пикселей, которые отображают два приближенных круга. Каждый набор координат имеет 48 пар х, у. Я экспериментировал со следующим кодом, который считывает координаты из файла и сохраняет их в структуре Mat. Тем не менее, я не думаю, что это правильно, и PCA в openCV, кажется, очень плохо освещена в Интернете.

    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 в open cv.

1 Ответ

3 голосов
/ 29 сентября 2011

Возможно, было бы полезно, если бы вы более подробно описали, для чего вам нужно использовать PCA и чего вы надеетесь достичь (вывод?).

Я вполне уверен, что причина сбоя вашей программы заключается в том, чтовходной Mat - CV_32FC2, когда он должен быть CV_32FC1.Вам необходимо преобразовать ваши данные в одномерные векторы строк перед использованием PCA, не зная, что вам нужно, я не могу сказать, как изменить ваши данные.(Распространенным приложением с изображениями является eigenFace, которое требует преобразования изображения в вектор строки).Кроме того, вам необходимо нормализовать входные данные в диапазоне от 0 до 1.

Кроме того, обычно вы предпочитаете оставить на 1 основной компонент меньше, чем количество входных выборок, поскольку последний главный компонент просто ортогоналеностальные.

Я раньше работал с opencv PCA и хотел бы помочь в дальнейшем.Я бы также отослал вас к этому блогу: http://www.bytefish.de/blog/pca_in_opencv, который помог мне начать работу с PCA в openCV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...