Плотный SIFT OpenCV-Python

OpenCV имеет очень хорошую документацию по созданию дескрипторов SIFT, но это версия "слабого SIFT", где ключевые точки обнаруживаются оригинальным алгоритмом Лоу.. Пример OpenCV читается примерно так:

img = cv2.imread('home.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT()
kp = sift.detect(gray,None)
kp,des = sift.compute(gray,kp)

Я ищу сильный / плотный SIFT, который не обнаруживает ключевые точки, а вместо этого вычисляет дескрипторы SIFT для набора патчей (например, 16x16 пикселей, заполнение 8 пикселей), покрывающих изображение в виде сетки. Насколько я понимаю, в OpenCV есть два способа сделать это:

  • Я мог бы сам разделить изображение на сетку и каким-то образом преобразовать эти патчи в KeyPoints.
  • Я мог бы использовать детектор функций на основе сетки

Другими словами, мне пришлось бы заменить строку sift.detect() чем-то, что дает мне нужные мне ключевые точки.

Моя проблема в том, что остальной части документации OpenCV, особенно по Python, очень не хватает, поэтому я понятия не имею, как достичь того или другого. В документации по C ++ я вижу, что есть детекторы ключевых точек для сетки, но я не знаю, как их использовать в Python.

Альтернативой является переключение на VLFeat, который имеет очень хорошую реализацию DSift / PHOW, но означает, что мне придется переключиться с python на matlab.

Любые идеи? Спасибо.


person Doa    schedule 22.11.2013    source источник
comment
Новейшие версии OpenCV (или, по крайней мере, его привязки к Python), похоже, больше не поддерживают .detect и .compute ... Вместо этого вам нужно использовать .detectAndCompute, что означает, что больше невозможно создавать свои собственные ключевые точки.   -  person bard    schedule 03.12.2013
comment
Это не так для opencv3   -  person P.R.    schedule 14.11.2015


Ответы (3)


Вы можете использовать Dense Sift в opencv 2.4.6 ‹. Создает детектор объекта по его имени.

cv2.FeatureDetector_create (DetectorType)

Затем "Dense" строка вместо DetectorType

eg:-

dense=cv2.FeatureDetector_create("Dense")
kp=dense.detect(imgGray)
kp,des=sift.compute(imgGray,kp)
person madan ram    schedule 13.03.2014
comment
Не то чтобы я хотел взломать этот ответ, но можно ли сделать то же самое в С ++? Может ли кто-нибудь указать мне правильное направление? - person The Nomadic Coder; 28.05.2014
comment
@SemicolonWarrier Да, это возможно. Посмотрите здесь docs.opencv.org/modules/features2d/docs.opencv.org/modules/features2d/docs. - person Yasser Souri; 10.08.2014

Я не уверен, какова ваша цель здесь, но имейте в виду, что вычисление дескриптора SIFT происходит очень медленно и никогда не предназначалось для использования в плотной манере. При этом OpenCV делает это довольно тривиальным.

По сути, вместо использования sift.detect () вы просто заполняете ключевую точку создайте массив, сделав сетку ключевыми точками, какой бы плотной вы ни были. Затем дескриптор будет рассчитан для каждой ключевой точки, когда вы передадите ключевые точки в sift.compute ().

В зависимости от размера вашего изображения и скорости вашего компьютера это может занять очень много времени. Если кооперативное время является фактором, я предлагаю вам взглянуть на некоторые из двоичных файлов дескрипторы OpenCV может предложить.

person David Nilosek    schedule 22.11.2013
comment
Спасибо, Дэвид. Тогда у меня будет вопрос: чем именно заполнить массив ключевых точек? Могу ли я каким-то образом вывести правильный формат со страницы API OpenCV? Спасибо за внимание к скорости SIFT, реализация VLFeat плотного просеивания кажется очень быстрой, поэтому я думаю, что мне придется с этим согласиться. - person Doa; 24.11.2013
comment
Кроме того, цель состоит в том, чтобы использовать его для классификации сцены / объекта, для которой плотное просеивание, по-видимому, лучше подходит, чем обычное просеивание. - person Doa; 24.11.2013
comment
Я только что ответил на этот вопрос примером здесь stackoverflow.com/a/33702400/2156909, если это все еще интересно. - person P.R.; 14.11.2015

Несмотря на то, что OpenCV является стандартом, для меня это было слишком медленно. Поэтому для этого я использовал pyvlfeat, который в основном представляет собой привязку Python к VL-FEAT. Функции имеют такой же синтаксис, что и функции Matlab.

person The Nomadic Coder    schedule 18.12.2014