OpenCV-Python плотный SIFT

OpenCV имеет очень хорошую документацию по генерации дескрипторов SIFT, но это версия "слабый SIFT", где ключевые точки обнаруживаются исходный алгоритм Lowe. Пример 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, сильно отсутствует, поэтому я понятия не имею, как достичь любой из этих вещей. В документации на С++ я вижу, что для grid есть детекторы ключевых точек, но я не знаю, как их использовать с Python.

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

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

Ответ 1

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

cv2.FeatureDetector_create (detectorType)

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

например: -

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

Ответ 2

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

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

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

Ответ 3

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