Есть ли у кого-нибудь примеры использования OpenCV с python для извлечения дескриптора?
Я пытаюсь использовать OpenCV для извлечения дескрипторов SURF из изображения. Я использую OpenCV 2.4 и Python 2.7, но изо всех сил пытаюсь найти любую документацию, которая предоставляет любую информацию о том, как использовать функции. Я смог использовать следующий код для извлечения функций, но я не могу найти разумный способ извлечь дескрипторы:
import cv2
img = cv2.imread("im1.jpg")
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
surf = cv2.FeatureDetector_create('SURF')
detector = cv2.GridAdaptedFeatureDetector(surf, 50) # max number of features
fs = detector.detect(img2)
Код, который я пытался извлечь дескрипторы,:
import cv2
img = cv2.imread("im3.jpg")
sd = cv2.FeatureDetector_create("SURF")
surf = cv2.DescriptorExtractor_create("SURF")
keypoints = []
fs = surf.compute(img, keypoints) # returns empty result
sd.detect(img) # segmentation faults
Есть ли у кого-нибудь образец кода, который делает подобные вещи, или указатели на любую документацию, которая предоставляет образцы?
Ответы
Ответ 1
Вот пример кода, который я написал для извлечения функций SURF с использованием Python 2.7 и OpenCV 2.4.
im2 = cv2.imread(imgPath)
im = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY)
surfDetector = cv2.FeatureDetector_create("SURF")
surfDescriptorExtractor = cv2.DescriptorExtractor_create("SURF")
keypoints = surfDetector.detect(im)
(keypoints, descriptors) = surfDescriptorExtractor.compute(im,keypoints)
Это работает и возвращает набор дескрипторов.
К сожалению, поскольку cv2.SURF() не работает в 2.4, вам нужно пройти этот утомительный процесс.
Ответ 2
Вот простой код, который я сделал для uni довольно недавно. Он захватывает изображение с камеры и отображает обнаруженные ключевые точки на выходном изображении в режиме реального времени. Я надеюсь, что он вам полезен.
Существует документация здесь.
код:
import cv2
#Create object to read images from camera 0
cam = cv2.VideoCapture(0)
#Initialize SURF object
surf = cv2.SURF(85)
#Set desired radius
rad = 2
while True:
#Get image from webcam and convert to greyscale
ret, img = cam.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#Detect keypoints and descriptors in greyscale image
keypoints, descriptors = surf.detect(gray, None, False)
#Draw a small red circle with the desired radius
#at the (x, y) location for each feature found
for kp in keypoints:
x = int(kp.pt[0])
y = int(kp.pt[1])
cv2.circle(img, (x, y), rad, (0, 0, 255))
#Display colour image with detected features
cv2.imshow("features", img)
#Sleep infinite loop for ~10ms
#Exit if user presses <Esc>
if cv2.waitKey(10) == 27:
break
Ответ 3
Используя open cv 2.4.3, вы можете сделать следующее:
import cv2
surf = cv2.SURF()
keypoints, descriptors = surf.detectAndCompute(img,None,useProvidedKeypoints = True)
Ответ 4
todofixthis я следую вашему коду, и я получаю это
import cv2
img = cv2.imread("im3.jpg")
sd = cv2.FeatureDetector_create("SURF")
surf = cv2.DescriptorExtractor_create("SURF")
keypoints = sd.detect(img) # segmentation faults
l,d = surf.compute(img, keypoints) # returns empty result
где
l = ключевые точки
d = дескриптор