将模块从opencv_contrib添加到OpenCV

时间:2014-09-26 12:04:04

标签: python opencv

我正在尝试将xfeatures2d模块从opencv_contrib添加到现有的OpenCV / Python项目中。

我已经从the repo下载了最新版本的模块,并使用以下附加参数再次构建了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

似乎新模块已正确安装。我可以在两个Python版本中导入cv2。但是,两者都没有认识到模块应该添加的新功能。

>>> 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'

4 个答案:

答案 0 :(得分:14)

我遇到了同样的问题。我使用python 2.7.6和OpenCv 3.0以及其他非免费模块。我确实在可用模块中存在xfeatures2d并且可以导入它,但是就好像xfeatures2d不包含SIFT或SURF一样。无论我如何称呼它们都是同样的错误:

  

&#34;属性错误:&#39;模块&#39;对象没有属性&#39; SIFT&#39;

我尝试了不同的名称空间,并且最近才注意到这个细节, GOT IT WORKING!

  

$ python

     

&gt;&gt;&gt;导入cv2

     

&GT;&GT;&gt;帮助(cv2.xfeatures2d)

您会注意到它回复说它现在被称为......

  

功能

SIFT_create(...)

SURF_create(...)

非常简单 - 命名空间是&#34; cv2.SIFT()&#34;或&#34; cv2.xfeatures2d.SIFT&#34;而是

  

<强> cv2.xfeatures2d.SIFT_create()

请试一试!

答案 1 :(得分:6)

从pip

安装

Python 2.x

pip install opencv-contrib-python

Python 3.x

pip3 install opencv-contrib-python

如果发生permsision错误,请使用sudo。

答案 2 :(得分:4)

另一种可能性(也是我发现的最简单的一种)是安装已经包含SIFT和SURF算法的2.4.9版本。 你只需要这样做

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

答案 3 :(得分:2)

您缺少新的额外命名空间:


>>> 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)