Что означает атрибут расстояния в DMatches? - программирование
Подтвердить что ты не робот

Что означает атрибут расстояния в DMatches?

У меня есть короткий вопрос: когда я выполняю сопоставление функций в OpenCV, что означает атрибут distance для DMatches в MatOfMatches?

Я знаю, что мне приходится фильтровать матчи с большим расстоянием, потому что они не так хороши, как они с меньшим расстоянием. Но в чем смысл этого атрибута? Это своего рода отклонение?

4b9b3361

Ответ 1

В этом контексте функция представляет интерес для изображения. Чтобы сравнить функции, вы "описываете" их с помощью детектора признаков. Каждая функция затем связана с дескриптором. Когда вы сопоставляете функции, вы фактически соответствуете их дескрипторам.

Дескриптор - многомерный вектор. Это может быть real-value (например, SIFT) или двоичный (например, BRIEF).

Согласование представляет собой пару дескрипторов, по одному от каждого изображения, которые являются наиболее похожими среди всех дескрипторов. И, конечно, чтобы найти дескриптор в изображении B, который наиболее похож на дескриптор изображения A, вам нужна мера этого сходства.

Существует несколько способов вычисления "оценки сходства" между двумя векторами. Для вещественных дескрипторов часто используется Евклидово расстояние, когда Хэмминг расстояние является общим для двоичных дескрипторов.

Как результат, теперь мы можем понять атрибут distance: это оценка сходства между двумя дескрипторами совпадения.

Ответ 2

Обычно, когда вы сопоставляете две функции, вы фактически сравниваете два вектора с определенными метриками расстояния. Теперь предположим, что ваша функция SIFT с 128 измерениями, и вы сравниваете две функции SIFT a и b с использованием евклидова расстояния, тогда DMatch.distance равно

formula

Ответ 3

Атрибут расстояния в DMatch является мерой сходства между двумя дескрипторами (векторами признаков). Если расстояние меньше, то изображения более похожи и наоборот.

Урок, извлеченный из моего опыта, когда я начал:

Не путайте DMatch.distance с нормальным пространственным расстоянием между двумя точками. Оба они разные. Расстояние в DMatch представляет собой расстояние между двумя дескрипторами (векторы с 128 значениями в случае SIFT)

В случае SIFT (локальный дескриптор функции):

1) Сначала вы обнаруживаете ключевые точки (интересные точки) для двух изображений, которые вы хотите сравнить.

2) Затем вы вычисляете дескрипторы просеивания для определенной области (16 X 16 вокруг каждой ключевой точки) вокруг всех ключевых точек. Каждый дескриптор хранит гистограмму ориентированных градиентов для области вокруг каждой ключевой точки.

3) Наконец, дескрипторы обоих изображений сопоставляются, чтобы найти совпадающие ключевые точки между изображениями. Это делается с помощью BFMatcher → match(), knnMatch() или FlannBasedMatcher → knnMatch().

4) Если вы используете BFMatcher.match(), вы получите список объектов DMatch. Количество объектов DMatch равно количеству совпадений. Каждый объект DMatch содержит следующие четыре атрибута для каждой пары сопряженных ключевых точек.

DMatch.distance - Distance between descriptors. The lower, the better it is.
DMatch.trainIdx - Index of the descriptor in train descriptors(1st image)
DMatch.queryIdx - Index of the descriptor in query descriptors(2nd image)
DMatch.imgIdx - Index of the train image.

5) DMatch.Distance может быть одной из многих мер измерения → Norm_L1, Norm_L2 (эвклидово расстояние), расстояние Хэмминга, расстояние Хэмминга2..., которое можно указать как параметр в BFMatcher. Расстояние по умолчанию - евклидово.

6) Разница между пространственным евклидовым расстоянием и удвоением эвклидовой дистанции:

SIFT дескриптор 1 → [a1, a2,.... a128]

Дескриптор SIFT 2 → [b1, b2,.... b128]

(DMatch) → Евклидово расстояние = sqrt [(a1-b1) ^ 2 + (a2-b2) ^ 2 +... + (a128-b128) ^ 2]

Точка 1 → (x1, y1)

Точка 2 → (x2, y2)

(пространственный) → евклидово расстояние = sqrt [(x2-x1) ^ 2 + (y2-y1) ^ 2]

Таким образом, это расстояние от DMatch является расстоянием между дескрипторами и представляет собой степень сходства между двумя дескрипторами и отличается от нормального пространственного евклидова расстояния между двумя точками.

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

Надеюсь, это поможет понять значение атрибута distance в объектах DMatch. Если вы поняли это, вы можете работать с любыми дескрипторами функций, такими как HOG, SIFT, SURF, ORB, BRISK, FREAK,... Все они похожи, когда речь идет о соответствующих дескрипторах функций.