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.
Любые идеи? Благодарю.
Новейшие версии OpenCV (или, по крайней мере, его привязки на Python), похоже, больше не поддерживают .detect и .compute ... Вместо этого вы должны использовать .detectAndCompute, что означает что уже невозможно создавать собственные ключевые точки. – bard
Это неправда для opencv3 –