Добавление модулей из opencv_contrib в OpenCV

Я пытаюсь добавить модуль xfeatures2d из opencv_contrib в существующий проект OpenCV/Python.

Я загрузил последнюю версию модуля из репо и снова создал OpenCV со следующими дополнительными параметрами:

OPENCV_EXTRA_MODULES_PATH=/path/to/opencv_contrib-master/modules
BUILD_opencv_xfeatures2d=ON

Выдержка из журнала построения:

-- Installing: /usr/local/lib/python2.7/site-packages/cv2.so
-- Installing: /usr/local/lib/python3.4/site-packages/cv2.so
-- Installing: /usr/local/lib/libopencv_xfeatures2d.3.0.0.dylib

Кажется, что новый модуль установлен правильно. Я могу импортировать cv2 в обеих версиях Python. Однако не распознавать новые функции, которые должен добавить модуль.

>>> cv2.SURF()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'SURF'
>>> cv2.xfeatures2d.SURF()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'xfeatures2d'

Ответ 1

Я столкнулся с этой же проблемой. Я использую python 2.7.6 и OpenCv 3.0 с дополнительными несвободными модулями. У меня есть xfeatures2d присутствует в доступных модулях и может импортировать его, однако это было так, как если бы xfeatures2d не содержал SIFT или SURF. Независимо от того, как я их назвал, это была та же ошибка:

"Объект AttributeError: 'module' не имеет атрибута 'SIFT'

Я попробовал различные пространства имен, предложенные, и только недавно заметил эту деталь, и ПОЛУЧИЛ РАБОТУ!

$python

→ > импорт cv2

<Р → → помощь (cv2.xfeatures2d)

Вы заметите, что он отвечает, что он теперь называется...

ФУНКЦИИ

SIFT_create(...)

и

SURF_create(...)

Так просто: пространство имен НЕ "cv2.SIFT()" или "cv2.xfeatures2d.SIFT", а скорее

cv2.xfeatures2d.SIFT_create()

Пожалуйста, сделайте снимок!

Ответ 2

Еще одна возможность (и самая простая, которую я нашел!) - установить версию 2.4.9, которая уже включает алгоритм SIFT и SURF. Вам просто нужно сделать

import cv2
sift = cv2.SIFT()
(...)

Ответ 3

Установите его из pip

Python 2.x

pip install opencv-contrib-python

Python 3.x

pip3 install opencv-contrib-python

Используйте sudo, если произошла ошибка permsision.

Ответ 4

вам не хватает нового, дополнительного пространства имен:


>>> help(cv2.xfeatures2d)
Help on module cv2.xfeatures2d in cv2:

NAME
    cv2.xfeatures2d

FILE
    (built-in)

FUNCTIONS
    SIFT(...)
        SIFT([, nfeatures[, nOctaveLayers[, contrastThreshold[, edgeThreshold[,
sigma]]]]]) -> <xfeatures2d_SIFT object>

    SURF(...)
        SURF([hessianThreshold[, nOctaves[, nOctaveLayers[, extended[, upright]]
]]]) -> <xfeatures2d_SURF object>

    StarDetector(...)
        StarDetector([, _maxSize[, _responseThreshold[, _lineThresholdProjected[
, _lineThresholdBinarized[, _suppressNonmaxSize]]]]]) -> <xfeatures2d_StarDetect
or object>

DATA
    FREAK_NB_ORIENPAIRS = 45
    FREAK_NB_PAIRS = 512
    FREAK_NB_SCALES = 64


>>> surf = cv2.xfeatures2d.SURF(300)