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

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

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

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

True matching:

http://store1.up-00.com/Jun11/hxM00286.jpg

ложные совпадения!! :

http://store1.up-00.com/Jun11/D5H00286.jpg

мой код:

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;

3 ответов


проблема заключалась в использовании только сопоставления грубой силы, я нашел методы для получения набора хороших совпадений между двумя представлениями в "OpenCV 2 Компьютерное Зрение Прикладное Программирование Поваренная Книга"

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

Они используют K-ближайшего соседа и RANSAC

и спасибо


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

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

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

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


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