Сопоставление дескриптора ключевой точки: как рассчитать качество соответствия для шаблона?

Я не уверен, относится ли это к stackoverflow или другому сайту обмена стеками — вводите сюда.

Я использовал python OpenCV для сопоставления дескрипторов ключевых точек BRISK целевого изображения, в свою очередь, с тремя разными шаблонами.

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

Прямо сейчас я вычисляю количество cv2.RANSAC вставок, возвращаемых cv2.findHomography (которое, кстати, не возвращает статистику согласия) и беру шаблон с наибольшим числом.

Я просмотрел гистограммы дескрипторных расстояний, которые всегда кажутся гауссовскими с центром (как ни странно) около 105 (единиц?).

https://en.wikipedia.org/wiki/Random_sample_consensus кажется весьма полезным.

Руководство высоко ценится - спасибо!


person jtlz2    schedule 07.08.2018    source источник
comment
Не могли бы вы немного подробнее объяснить, почему вы недовольны выбором шаблона с самым высоким процентом вложений?   -  person Demplo    schedule 07.08.2018
comment
@Demplo Спасибо за вопрос. Я родом из байесовского прошлого, поэтому мне это кажется немного случайным. В идеале я хотел бы иметь возможность выбирать модель, т. Е. Количественно оценивать разницу в степени соответствия с точки зрения шансов, а более высокий процент этого не дает. Меня интересует ошибка перепроецирования, состояние матрицы H и т. д. - findHomography должен вычислять вероятность внутренне, но не возвращает ее.   -  person jtlz2    schedule 07.08.2018


Ответы (1)


Это началось как комментарий, но стало слишком длинным.

Действительно, OpenCV вычисляет ошибку перепроецирования внутри и не возвращает ее. Но вы могли бы сделать то же самое самостоятельно, как только получите гомографию, не так ли? Фактически алгоритм минимизирует сумму ошибок перепроецирования по всем точкам. Достаточно полное описание процесса находится в документах OpenCV

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

Из похожий ответ на другом сайте:

computed_pt = H * source_pt
error_pt = sqrt( (computed_pt.x - dst_pt.x)*(computed_pt.x - dst_pt.x) + (computed_pt.y - dst_pt.y)*(computed_pt.y - dst_pt.y) )

вычислить евклидово расстояние между двумя точками.

person Demplo    schedule 07.08.2018
comment
Большое спасибо за это ясное объяснение. Пара вопросов: (i) Является ли, например. cv2.warpPerspective (или другой?), эквивалентный первой строке (не то, чтобы ваша строка не была достаточно простой)? И (ii) Поскольку вы рассчитали остаточную сумму квадратов, я могу связать это с chisq и, следовательно, рассчитать дельта-chisq для выбора модели, верно? (Но что использовать для шумовой сигмы?) Мне бы понравилось, если бы findHomography выдавало вероятность на каждой итерации, потому что тогда, по крайней мере, я мог бы исследовать форму поверхности... Но, вероятно, здесь излишне. Спасибо еще раз - person jtlz2; 08.08.2018
comment
(cv2.perspectiveTransform() скорее) - person jtlz2; 08.08.2018
comment
(i) Похоже, что cv2.perspectiveTransform делает именно то, что вы ожидаете. (ii) К сожалению, я не эксперт по дистрибутиву chisq, поэтому не могу помочь. Все, что я могу добавить, это то, что, возможно (?) sigma должен быть стандартным разработчиком для извлечения признаков, который, хотя и зависит от самого экстрактора, как правило, вы можете предположить ~ 0,5 пикселя, хотя не уверен, что это полезно... - person Demplo; 09.08.2018
comment
Никаких проблем - очень благодарен за ваш ответ и информацию - я просто проверю код, а затем, надеюсь, смогу принять ответ :) - person jtlz2; 13.08.2018