Я пытаюсь использовать реализацию BRISK для OpenCV (для C ++), чтобы проверить на фотографии, включено ли изображение (или часть изображения). Например, я делаю фотографию и пытаюсь соответствовать ей с набором изображений в базе данных, и я хотел бы выбрать лучшее соответствующее изображение (или сообщение об ошибке, если ни одно из всех изображений не достаточно хорошо).
Итак, я сейчас тестирую OpenCV. Я просто взял образец, включенный в каркас (match_to_many_images), и изменил детектор и дескриптор с SURF на BRISK.
Однако у меня странные результаты. Вот результаты сопоставления (BruteForce Hamming):
В первом эпизоды совершенно разные, но матчей много!
Во втором сцены довольно похожи, но некоторые совпадения неверны.
Я думаю, что это проблема параметров, потому что на демо-видео BRISK результаты значительны.
Обычно выполняется много неправильных начальных совпадений при сопоставлении объектов с использованием SIFT, SURF, BRISK или любого другого локального дескриптора.
Многие из этих начальных совпадений будут неправильными из-за неоднозначных особенностей или особенностей, которые возникают из-за беспорядка фона. [От Отличительные особенности изображения из масштабных инвариантных ключевых точек]
Следующим шагом является выбор только подмножества тех совпадений, которые все согласны с общим преобразованием между двумя изображениями. Это объясняется в разделах 7.3 и 7.4 Отличительные особенности изображения из масштабных инвариантных ключевых точек.
Вы видели документацию OpenCV для BRISK? Я не уверен, какие параметры вы используете сейчас, но вы можете указать порог и октавы, а также шаблон. Документация на
http://docs.opencv.org/modules/features2d/doc/feature_detection_and_description.html#brisk
Также вы можете попробовать другой алгоритм сопоставления объектов, хотя, похоже, что в статье BRISK они также использовали расстояние Хэмминга
Наконец, не слишком неожиданно иметь ошибочные совпадения функций; опробуйте разные сцены, а также различные параметры и посмотрите, как ваши результаты
OpenCV Tutorial дает отличный пример того, как извлечь объекты и вычислить гомографию (преобразование, которое говорит вам, как преобразовать каждую точку из одного изображения в другое).
Вы можете заменить элемент-детектор / дескриптор любым другим, что приведет к различной устойчивости к определенным преобразованиям, таким как вращение, масштабирование или ошибкам, таким как размытие или изменение освещенности. Базовая реализация BRISK уже имеет значимые параметры определены.
И последнее, но не менее важное: если вы попытаетесь сопоставить два совершенно разных изображения, чего ожидать в результате? Алгоритм будет пытаться найти сходства и, следовательно, всегда вычислять результат, даже если он не имеет смысла и оценки очень низкие. Просто имейте в виду: Вывоз мусора -> Вывоз мусора.