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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

С уважением.

Алекс

Ответ 3

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

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

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

Ответ 4

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