OpenCV — извлечение дескриптора SIFT/SURF из предварительно обрезанных патчей

У меня есть набор из 100K 64x64 серых патчей (которые уже выровнены, то есть все они имеют одинаковую ориентацию), и я хотел бы извлечь дескриптор SIFT из каждого из них с помощью OpenCV.

Мне ясно, что все, что мне нужно сделать, это определить вектор с одной ключевой точкой kp таким образом, что: kp.x=32, kp.y=32.

Однако я не знаю, как установить параметр kp.size. При просмотре кода SIFT кажется, что он выполняет некоторые нетривиальные вычисления с этим параметром, а не просто предполагает, что это размер патча.

Вопрос 1: каким должен быть параметр kp.size при извлечении SIFT-дескрипторов из патчей размером 64x64?

Вопрос 2: каким должен быть параметр kp.size при извлечении дескрипторов SURF из патчей размером 64x64?


person GilLevi    schedule 12.09.2014    source источник
comment
взгляните на 1. оригинальные документы SIFT / SURF, как связаны масштаб объекта и размер дескриптора. 2. код openCV, используют ли они одни и те же вычисления. Или вы можете просто изменить код openCV SIFT/SURF, чтобы распечатать масштаб и размер дескриптора и проверить некоторые значения;)   -  person Micka    schedule 12.09.2014
comment
github.com/hpatches/hpatches-benchmark/blob/ master/python/ вот скрипт   -  person old-ufo    schedule 10.06.2019


Ответы (2)


Если вы посмотрите на просеять оригинальную публикацию, масштаб ключевой точки используется для взвешивания гистограммы величины и ориентации градиентов (параграф 6. Дескриптор локального изображения). Итак, в вашем случае, поскольку серые пятна выровнены, вам решать, хотите ли вы взвешивать вклады пикселей дальше от центра патча или нет, и выбирать масштаб (т.е. с помощью окна взвешивания Гаусса ) соответственно.

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

Кроме того, поскольку вы работаете с этими выровненными патчами, я бы посоветовал вам не использовать высокоуровневые функции OpenCV, а просто использовать/перекодировать часть извлечения дескриптора и применять любые веса, которые вы хотите вычислить. представление вашего патча. Одна из причин этого заключается в том, что в примере с SIFT вычисление дескрипторов SIFT может «добавить новые ключевые точки» к предоставленным вами, если алгоритм «не доволен» ориентацией ключевых точек, он дублирует ключевые точки в том же самом месте. расположение, но другая ориентация.

person remi    schedule 22.09.2014

Хорошо. Таким образом, дескриптор SIFT обычно использует окрестности сеток 4x4, каждая сетка обычно имеет размер 4x4 пикселя. Поэтому соседство в пикселях обычно 16x16. Масштаб/размер — это параметр, определяющий количество субдискретизации/размытия/радиуса ключевой точки. Поэтому я думаю, что в вашем случае это будет 4.

Вы, вероятно, также знаете, что ключевые точки SIFT также работают с субпиксельными слоями. (32,32) не будет точным центром вашего участка изображения, который на самом деле будет (32,5, 32,5), если размеры вашего изображения (x, y) начинаются с 1. Если они начинаются с 0, это будет (31,5, 31.5) — как и в случае с opencv.

person The Nomadic Coder    schedule 22.09.2014