OpenCV PCA вопрос

Я пытаюсь создать модель PCA в OpenCV для хранения координат пикселей. В качестве эксперимента у меня есть два набора координат пикселей, которые отображают две приблизительные окружности. Каждый набор координат имеет 48 пар x,y. Я экспериментировал со следующим кодом, который считывает координаты из файла и сохраняет их в структуре 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 в открытом резюме.


person user969776    schedule 28.09.2011    source источник
comment
Вы видели раздел PCA документации OpenCV?   -  person Andrey Kamaev    schedule 28.09.2011


Ответы (1)


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

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

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

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

person Kevin    schedule 29.09.2011
comment
Привет, Кевин, спасибо за ваш ответ и извините за задержку с ответом, так как я заболел гриппом!!! То, что я пытаюсь сделать, это создать модель PCA для рта в изображениях. Я делаю выборку точек вокруг рта на двух изображениях и хочу создать модель PCA на основе моих точек выборки. Таким образом, на первом изображении у меня есть 48 координат (x,y), которые повторяют форму мотылька, а на втором изображении у меня есть еще 48 точек для другого рта. Затем я хотел бы получить средние координаты рта. Я пытался найти полезные онлайн-ресурсы, но безуспешно. - person user969776; 02.10.2011
comment
Я посмотрю блог, который вы рекомендовали, так как он выглядит полезным. Любые дальнейшие подсказки и советы о том, как создать желаемую модель, будут очень признательны (если у вас или у кого-то еще есть время)... - person user969776; 02.10.2011
comment
Привет Кевин, еще раз спасибо за вашу помощь. Мне удалось скомпилировать код, используя CV_32FC1 и нормализовав данные, как вы сказали. Забавно, как несколько советов от более опытного человека могут избавить нас от душевных страданий, пытающихся найти ответы в Google. В Интернете есть много хороших ресурсов по PCA, но очень мало примеров PCA с OpenCV. Так что большое спасибо за помощь, все было на месте!!! - person user969776; 03.10.2011
comment
Нет проблем, не могу не согласиться с тем, что вы сказали о нескольких примерах, имеющих огромное значение. - person Kevin; 28.11.2011