Почему экстрактор opencv FREAK удаляет так много ключевых точек, особенно с использованием детектора ORB

Я использую интерфейс OpenCV 2.4.3 C++, чтобы найти точки совпадения между двумя изображениями. Первая попытка была с использованием SURF. Единственная проблема - трудоемкость, поэтому я попробовал новый экстрактор FREAK. Используя SURF для обнаружения и FREAK для описания, я понял, что FREAK сокращает количество ключевых точек почти до половины обнаруженных, и получающихся в результате совпадений недостаточно. По этой причине я попытался БЫСТРО, чтобы получить больше ключевых точек. Результаты, достижения:

  1. Детектор SURF, экстрактор SURF, перекрестная проверка BFMatcher true, RANSAC: 70 ключевых точек первого изображения, 50 ключевых точек второго изображения, 200 мс. 250мс. 15мс. 15мс.
  2. Детектор SURF, экстрактор FREAK, перекрестная проверка BFMatcher true, RANSAC: 39 ключевых точек первого изображения, 30 ключевых точек второго изображения (после FREAK), 200 мс, 50 ​​мс., 0мс., 0мс. Это приводит к тому, что хороших совпадений слишком мало.
  3. Детектор FAST, экстрактор FREAK, перекрестная проверка BFMatcher true, RANSAC: 120 ключевых точек, 90 ключевых точек (69 и 48 ключевых точек после FREAK), 10 мс, 450 мс, 15 мс, 10 мс.

После этого я использовал ORBFeatureDetector, и он получает то же количество ключевых точек, что и FAST, но после экстрактора FREAK результирующие ключевые точки равны 0 для каждого изображения. Я делаю что-то неправильно? Отличаются ли ключевые точки ORB от точек, полученных из FAST? Может быть, я мог бы открыть еще один вопрос для этого, но у меня есть последний. Какая может быть лучшая комбинация детектор / экстрактор для получения тех же результатов, что и в моих первых экспериментах с использованием SURF, но с уменьшением времени обработки? Потому что, когда я получаю больше ключевых точек, часть извлечения также занимает больше времени, хотя я использую FREAK.

4 ответа

Решение

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

Я также использую FAST в сочетании с FREAK и получаю наилучшие результаты, но у меня все еще есть проблема сокращения времени извлечения, которое для меня слишком велико.

На самом деле, вы использовали параметр cross check = true. это также причина, почему многие ваши очки будут устранены. Этот параметр, если он истинен, дорог с вычислительной точки зрения. Он используется, чтобы избежать пар дескрипторов, которые не полностью совпадают в процессе сопоставления.

Если у вас есть два набора дескрипторов D1 и D2, то этот параметр разрешает только пары, которые обычно совпадают в направлениях сопоставления D1-> D2 и D2->D1.

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

С наилучшими пожеланиями.

Alex

Помимо удаления пограничных точек, как предполагает Jav_Rock, огромное (непоследовательное?!) уменьшение точек действительно зависит от параметра размера, который вы сохранили в keyPoint. Даже если для параметра scaleNormalized установлено значение false, значение параметра float для параметра размера, близкого к нулю, FREAK просто отбрасывает эту ключевую точку. (но я, кажется, не могу понять почему, так как параметр размера keyPoint используется только в том случае, если scaleNormalized имеет значение true: source)

Поэтому убедитесь, что для параметра размера установлено значение, большее нуля (например, единицы), если вы не используете scaleNormalization.
И интерпретировать его как значение с единицей измерения "пиксел" (при использовании scaleNormalization).
Btw. минимальный размер ключевой точки по умолчанию равен 7.

Надеюсь это поможет...

FAST - только детектор ключевых точек (без дескриптора). Если вы комбинируете FAST и используете для описания (мультимасштаб) BRIEF, вы получите ORB.

Другие вопросы по тегам