Дескриптор FREAK с Opencv Python

Я пытался реализовать дескриптор FREAK в Python с помощью Opencv. Вот код, который я использую:

def surf_freak_detect(image,hessianThreshold):
    surfDetector = cv2.SURF(hessianThreshold)
    surfDetector=cv2.GridAdaptedFeatureDetector(surfDetector,50)
    keypoints = surfDetector.detect(image,None) 
    freakExtractor = cv2.DescriptorExtractor_create('FREAK')
    keypoints,descriptors= freakExtractor.compute(image,keypoints)
    del freakExtractor
    return keypoints,descriptors

Это правильный способ инициализировать дескриптор Freak? Сделав небольшую отладку, выяснилось, что интерпретатор занимает очень много времени при вычислении дескрипторов, а затем в конечном итоге сбой. Ключевые точки обнаружены должным образом. Как ни странно, иногда работает и иногда просто сбой!

Ответ 1

Если ключевые точки обнаружены правильно, но программа сработает при генерации дескрипторов, это связано с тем, что область дескриптора (которая окружает ключевую точку) выходит из изображения, и есть доступ к памяти в положение, которое не существует.

Вам нужно как-то ограничить область работы для дескрипторов freak.

Ответ 2

В OpenCV 3.0 теперь есть привязки Python для FREAK. Его параметры конфигурации описаны здесь. Кажется, что отсутствует документация о том, как на самом деле назвать его в Python, но вы можете использовать его в Python следующим образом:

freakExtractor = cv2.xfeatures2d.FREAK_create()
keypoints,descriptors= freakExtractor.compute(image,keypoints)

(Вы должны получить ключевые точки от отдельного детектора функций, как это было в вашем коде выше.)