2013-11-22 2 views
12

OpenCV имеет very good documentation on generating SIFT descriptors, но это версия «слабый SIFT», где ключевые точки обнаружены оригиналом Lowe algorithm. Пример OpenCV читает что-то вроде:OpenCV-Python плотный SIFT

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:

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

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

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

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

Любые идеи? Благодарю.

+0

Новейшие версии OpenCV (или, по крайней мере, его привязки на Python), похоже, больше не поддерживают .detect и .compute ... Вместо этого вы должны использовать .detectAndCompute, что означает что уже невозможно создавать собственные ключевые точки. – bard

+0

Это неправда для opencv3 –

ответ

3

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

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

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

+1

Спасибо Дэвиду. Тогда мой вопрос: с чем именно я заполняю массив ключей? Могу ли я как-то вывести правильный формат с страницы API OpenCV? Спасибо за головокружительную скорость SIFT, реализация VLFeat с плотным просеиванием, по-видимому, очень быстрая, поэтому я думаю, мне придется пойти на это. – Doa

+1

Кроме того, целью является использование его для классификации сцены/объекта, для которого плотный просеивание, по-видимому, лучше подходит, чем «нормальный» просеивание. – Doa

+0

Я просто ответил на вопрос с примером здесь http://stackoverflow.com/a/33702400/2156909, если он все еще интересует. –

21

Вы можете использовать плотный просеиватель в opencv 2.4.6 <. Создает детектор признаков по его названию.

cv2.FeatureDetector_create (detectorType)

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

например: -

dense=cv2.FeatureDetector_create("Dense") 
kp=dense.detect(imgGray) 
kp,des=sift.compute(imgGray,kp) 
+0

Не то, чтобы я хочу захватить этот ответ, но можно ли сделать то же самое в C++? Может ли кто-нибудь указать мне в правильном направлении? –

+0

@SemicolonWarrier Да, это возможно. Смотрите здесь http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_feature_detectors.html#featuredetector-create –

1

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

Смежные вопросы