Как известно, для отслеживания объектов в OpenCV мы можем использовать:
Для соответствия функций DescriptorMatcher использует расстояние Хэмминга (значение разности между двумя последовательностями одинакового размера, а не расстояние между координатами).
То есть мы находим наиболее похожий объект в текущем кадре, но не самый ближайший к предыдущей позиции (если мы его знаем).
Как мы можем использовать для сопоставления как расстояние Хемминга, так и расстояние между координатами, например, учитывая вес обоих, а не только расстояние Хемминга?
Это может решить следующие проблемы:
Если мы начнем отслеживать объект с позиции (x, y) на предыдущем кадре, а текущий кадр содержит два похожих объекта, то мы найдем наиболее похожие, но не самые близкие. Но из-за инерции координаты обычно изменяются медленнее, чем сходство (резкое изменение света или вращение объекта). И мы должны найти подобный объект с ближайшими координатами.
Таким образом, мы находим элементы, которые не только наиболее похожи, но и дают наиболее точную гомографию, потому что мы исключаем элементы, которые хотя и очень похожи, но очень далеко расположены в координатах и, скорее всего, принадлежат другим объектам.
Что вам нужно, вероятно, что-то вроде:
DMatch
имеет queryIdx
а также trainIdx
индексы. Вы можете использовать их для получения соответствующих ключевых точек. Вычислить евклидово расстояние между ними и обновить значение distance
если DMatch
с какой-то весовой функцией.distance
изменилось).Теперь вектор совпадений сортируется как по расстоянию Хэмминга между дескрипторами, так и по евклидову расстоянию между ключевыми точками.
Я думаю, что в opencv нет встроенного метода для этого.
Я бы использовал cv :: DescriptorMatcher :: radiusMatch. Он находит все совпадения, которые находятся под определенным расстоянием Хэмминга. Вам нужно найти радиус / расстояние, которое гарантирует, что функции достаточно похожи для вашего приложения, но не слишком велики, чтобы сделать весь расчет медленным.
Затем из этой функции вы можете выбрать ту, которая будет наиболее близкой к предполагаемой вами позиции, или рассчитать какую-то взвешенную оценку, основанную на расстоянии Хэмминга, расстоянии кордината и т. Д.