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.
Любые идеи? Спасибо.