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

Как известно, для отслеживания объектов в OpenCV мы можем использовать:

  • FeatureDetector найти особенности
  • DescriptorMatcher чтобы сопоставить сходство между характеристиками желаемого объекта и характеристиками текущего кадра в видео
  • а затем использовать findHomography найти новую позицию объекта

Для соответствия функций DescriptorMatcher использует расстояние Хэмминга (значение разности между двумя последовательностями одинакового размера, а не расстояние между координатами).

То есть мы находим наиболее похожий объект в текущем кадре, но не самый ближайший к предыдущей позиции (если мы его знаем).

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

Это может решить следующие проблемы:

  • Если мы начнем отслеживать объект с позиции (x, y) на предыдущем кадре, а текущий кадр содержит два похожих объекта, то мы найдем наиболее похожие, но не самые близкие. Но из-за инерции координаты обычно изменяются медленнее, чем сходство (резкое изменение света или вращение объекта). И мы должны найти подобный объект с ближайшими координатами.

  • Таким образом, мы находим элементы, которые не только наиболее похожи, но и дают наиболее точную гомографию, потому что мы исключаем элементы, которые хотя и очень похожи, но очень далеко расположены в координатах и, скорее всего, принадлежат другим объектам.

0

Решение

Что вам нужно, вероятно, что-то вроде:

  1. Вычислять матчи как обычно.
  2. DMatch имеет queryIdx а также trainIdx индексы. Вы можете использовать их для получения соответствующих ключевых точек. Вычислить евклидово расстояние между ними и обновить значение distance если DMatch с какой-то весовой функцией.
  3. Сортировать совпадения по расстоянию (с distance изменилось).

Теперь вектор совпадений сортируется как по расстоянию Хэмминга между дескрипторами, так и по евклидову расстоянию между ключевыми точками.

2

Другие решения

Я думаю, что в opencv нет встроенного метода для этого.

Я бы использовал cv :: DescriptorMatcher :: radiusMatch. Он находит все совпадения, которые находятся под определенным расстоянием Хэмминга. Вам нужно найти радиус / расстояние, которое гарантирует, что функции достаточно похожи для вашего приложения, но не слишком велики, чтобы сделать весь расчет медленным.

Затем из этой функции вы можете выбрать ту, которая будет наиболее близкой к предполагаемой вами позиции, или рассчитать какую-то взвешенную оценку, основанную на расстоянии Хэмминга, расстоянии кордината и т. Д.

1

По вопросам рекламы [email protected]