OpenCV - сопоставление объектов с использованием дескрипторов SURF и BruteForceMatcher

17

У меня вопрос об объектах, соответствующих OpenCV. Я использую алгоритм SURF, реализованный в opencv 2.3, чтобы сначала обнаруживать признаки на каждом изображении, а затем извлекать дескрипторы этих функций. Проблема в сопоставлении с использованием Brute Force Matcher, я не знаю, как я сужу, что оба изображения совпадают или нет, так как, когда я использую два разных изображения, между двумя дескрипторами есть два изображения!

Эти выходы моего кода, либо два изображения, которые я сравниваю с ними, похожи или разные, изображение результата показывает, что оба изображения совпадают.

Вопрос: как я могу различать два изображения?

Истинное соответствие:

Ложное сопоставление !! :

Мой код:

Mat image1, outImg1, image2, outImg2;

// vector of keypoints
vector<KeyPoint> keypoints1, keypoints2;

// Read input images
image1 = imread("C://Google-Logo.jpg",0);
image2 = imread("C://Alex_Eng.jpg",0);

SurfFeatureDetector surf(2500);
surf.detect(image1, keypoints1);
surf.detect(image2, keypoints2);
drawKeypoints(image1, keypoints1, outImg1, Scalar(255,255,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
drawKeypoints(image2, keypoints2, outImg2, Scalar(255,255,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

namedWindow("SURF detector img1");
imshow("SURF detector img1", outImg1);

namedWindow("SURF detector img2");
imshow("SURF detector img2", outImg2);

SurfDescriptorExtractor surfDesc;
Mat descriptors1, descriptors2;
surfDesc.compute(image1, keypoints1, descriptors1);
surfDesc.compute(image2, keypoints2, descriptors2);

BruteForceMatcher<L2<float>> matcher;
vector<DMatch> matches;
matcher.match(descriptors1,descriptors2, matches);

nth_element(matches.begin(), matches.begin()+24, matches.end());
matches.erase(matches.begin()+25, matches.end());

Mat imageMatches;
drawMatches(image1, keypoints1, image2, keypoints2, matches, imageMatches, Scalar(255,255,255));

namedWindow("Matched");
imshow("Matched", imageMatches);

cv::waitKey();
return 0;
    
задан khateeb 04.09.2011 в 03:38
источник

3 ответа

17

Проблема заключалась только в использовании Brute Force Matcher, я нашел методы для получения набора хороших совпадений между двумя представлениями в «OpenCV 2 Computer Vision Application Programming Cookbook»

Ch9: сопоставление изображений с использованием случайного выборочного консенсуса

Они используют K-Nearest Neighbor и RANSAC

И спасибо

    
ответ дан khateeb 05.09.2011 в 15:08
источник
  • Эта книга оказывается очень полезной! –  Oct 2 '12 at 0:58 02.10.2012 в 02:58
  • Вы должны принять свой ответ. –  Leonel Machava 05.08.2013 в 11:25
8

Для удаления выбросов Голосование RANSAC + является хорошим методом при сравнении двух плоских изображений.

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

cv::findHomography(srcPoints,dstPoints, RANSAC, status);

Функция выше вернет статус массива, который имеет 1 для индексов, считающихся значениями, и 0 для индексов, считающихся выбросами, поэтому вы можете удалить выбросы, проверив этот массив состояний.

    
ответ дан Jav_Rock 19.12.2012 в 17:23
источник
  • Использование LMEDS (Calib3d.LMEDS на Android) дает лучшие результаты для меня, я не знаю, почему в моем курсовом проекте RANSAC в Matlab дал очень хорошие результаты. Но определенно, удаление outliners является обязательным! –  Mustafa 23.04.2013 в 03:27
3

Вам нужно изменить свой Hessian, 2500 - это слишком много. Попробуйте 50. Когда вы используете большой гессиан, в результате появляется много ключевых точек, что приводит к ненужному. Другая информация о SURF заключается в том, что ваш маркер должен быть более богатым, с более подробной информацией.

    
ответ дан Ricardo Ribani 01.03.2013 в 01:58
источник