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