Почему я не могу найти совпадений с knnMatch, используя OpenCV с C ++?

0

Во-первых, я скажу, что до сих пор я основал большой кусок этого, используя этот очень интересный пост по этому вопросу.

В упомянутой статье в этом примере используется веб-камера и окно пользовательского интерфейса для просмотра результатов в режиме реального времени. Я просто пытаюсь использовать аналогичный код для сравнения двух изображений (как и для одного изображения и множества кадров), но столкнулся с некоторыми проблемами.

Итак, у меня есть два изображения (объекты cv :: Mat)

Mat object_1 = imread( "image1.jpg", CV_LOAD_IMAGE_GRAYSCALE );
Mat object_2 = imread( "image2.jpg", CV_LOAD_IMAGE_GRAYSCALE );

Следующий код невелик, но это общая идея:

int minHessian = 500;

SurfFeatureDetector detector( minHessian );
std::vector<KeyPoint> kp_object;

SurfDescriptorExtractor extractor;
Mat des_object;

extractor.compute( object_1, kp_object, des_object );

FlannBasedMatcher matcher;

std::vector<Point2f> obj_corners(4);

//Get the corners from the object
obj_corners[0] = cvPoint(0,0);
obj_corners[1] = cvPoint( object_1.cols, 0 );
obj_corners[2] = cvPoint( object_1.cols, object_1.rows );
obj_corners[3] = cvPoint( 0, object_1.rows );

Mat des_image, img_matches;
std::vector<KeyPoint> kp_image;
std::vector<vector<DMatch > > matches;
std::vector<DMatch > good_matches;
std::vector<Point2f> obj;
std::vector<Point2f> scene;
std::vector<Point2f> scene_corners(4);
Mat H;

detector.detect( object_2, kp_image );
extractor.compute( object_2, kp_image, des_image );

matcher.knnMatch(des_object, des_image, matches, 2);

for(int i = 0; i < min(des_image.rows-1,(int) matches.size()); i++) //THIS LOOP IS SENSITIVE TO SEGFAULTS
{
    if((matches[i][0].distance < 0.6*(matches[i][1].distance)) && ((int) matches[i].size()<=2 && (int) matches[i].size()>0))
    {
        good_matches.push_back(matches[i][0]);
    }
}

Проблема здесь в том, что поскольку matches.size() равен 0, он вообще не попадает в цикл.

Мой вопрос: (даже если оба оригинальных изображения одинаковы), почему нет совпадений?

Теги:
opencv
object
image
detection

1 ответ

3
Лучший ответ

Вам необходимо определить ключевые точки в object_1 с detector.detect(object_1, kp_image );

А после этого вы можете вызвать extractor.compute( object_1, kp_object, des_object ); как видно ЗДЕСЬ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню