Есть ли у кого-нибудь примеры использования 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

Есть ли у кого-нибудь пример кода, который делает такие вещи, или указатели на любую документацию, содержащую образцы?


person Ben    schedule 29.05.2012    source источник


Ответы (4)


Вот пример кода, который я написал для извлечения функций 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, вам придется пройти через этот утомительный процесс.

person Kkov    schedule 29.05.2012
comment
Это сработало! Ну наконец то! Спасибо. Одно небольшое редактирование: у вас есть functions.detect, но функции не определены: я думаю, вы имеете в виду surfDetector.detect. Кажется, это работает. Спасибо! - person Ben; 30.05.2012
comment
Исправил ошибку. Рад, что смог помочь. - person Kkov; 30.05.2012

Вот простой код, который я сделал для 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
person Gareth Webber    schedule 29.05.2012
comment
Спасибо! Как ни странно, хотя документация показывает cv2.SURF для v2.4.0 OpenCV, когда я пытаюсь это сделать, это не работает: AttributeError: объект «модуль» не имеет атрибута «SURF» - person Ben; 29.05.2012
comment
@Ben Ты точно использовал мой код или скопировал биты в свой? Я точно знаю, что это работало, когда я использовал его в последний раз, но, возможно, это было в версии 2.3.x. К сожалению, я на работе и не могу проверить это здесь. - person Gareth Webber; 29.05.2012
comment
Я попробовал ваш код в точности как есть... Он не соответствует третьей строке кода (surf = cv2.SURF(85)), но также похоже, что функция surf.detect изменилась по сравнению с версией, которую вы использовали... Может быть, я нужно понизить OpenCV до 2.3.x... - person Ben; 29.05.2012
comment
В документации, на которую я ссылался, это выглядит точно так же: cv2.SURF(_hessianThreshold[, _nOctaves[, _nOctaveLayers[, _extended[, _upright]]]]) должен возвращать объект SURF. cv2.SURF.detect(img, mask[, useProvidedKeypoints]) затем возвращает ключевые точки, дескрипторы. Я не уверен, в чем проблема, извините. - person Gareth Webber; 29.05.2012
comment
@Ben Я только что нашел этот ответ. С моим кодом все в порядке, в последней версии OpenCV есть проблема, которая будет исправлена ​​в следующей версии. В этой ссылке есть пример извлечения дескрипторов. Надеюсь это поможет - person Gareth Webber; 29.05.2012
comment
Спасибо за помощь! К сожалению, похоже, что v2.4 просто не поддерживает этот материал, или, по крайней мере, если и поддерживает, то он недокументирован. Я попробовал этот код для извлечения дескриптора, но тогда я не знаю, как их использовать. Я попытался сделать это, как в вашем коде, но теперь ему нужны два аргумента вместо 3, и когда я пытаюсь передать два аргумента, он ошибается: Surf_detector.detect(im, None) - person Ben; 29.05.2012

Используя open cv 2.4.3, вы можете сделать следующее:

import cv2
surf = cv2.SURF()
keypoints, descriptors = surf.detectAndCompute(img,None,useProvidedKeypoints = True)
person lizzie    schedule 29.11.2012

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

где

л = ключевые точки

д = дескриптор

person Enu    schedule 24.11.2012