opencv中的SIFT()无效

Oz *_*ano 5 python ubuntu opencv sift python-2.7

我试图通过Ubuntu的shell运行最简单的opencv SIFT代码,没有运气

我收到一个错误:

AttributeError:'module'对象没有属性'SURF'

代码:

import cv2
cv2.SIFT()
Run Code Online (Sandbox Code Playgroud)

我的配置:

  • Ubuntu版本是13.10 64bit
  • "cv2.版本 "是 2.4.5
  • dir(cv2)的输出是(仅限S字母)

    'scaleAdd','segmentMotion','sepFilter2D','setIdentity','setMouseCallback','setTrackbarPos','setUseOptimized','setWindowProperty','solve','solveCubic','solvePnP','solvePnPRansac','solvePoly ','sort','sortIdx','split','sqrt','startWindowThread','stereoCalibrate','stereoRectify','stereoRectifyUncalibrated','subtract','sumElems'

小智 6

这让我发疯了,但我没有考虑所有其他建议,结果您现在只需两个终端命令即可获得 SIFT 和 SURF!

  1. 确保您的计算机上没有其他 opencv ...

    pip uninstall opencv-python
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后获取贡献版本(有 SIFT 和 SURF + 其他)...

    pip install opencv-contrib-python
    
    Run Code Online (Sandbox Code Playgroud)

它应该安装,但请注意名称略有不同。

import cv2
sift = cv2.xfeatures2d.SIFT_create()
Run Code Online (Sandbox Code Playgroud)

!!!pip pip 欢呼!!!(这只是一个双关语,不是代码的一部分)


shu*_*ngh 5

import cv2
sift = cv2.SIFT()
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 opencv 3.0 或更高版本,此代码将不起作用。此代码的替代方法是

sift = cv2.xfeatures2d.SIFT_create()
(Only works if you have installed opencv-contrib-python library )
Run Code Online (Sandbox Code Playgroud)

现在再一次,如果你有一个 opencv-contrib-python 版本 > 3.4 比它不会使用不同的错误

error: OpenCV(4.1.0) C:\projects\opencv-python\opencv_contrib\modules\xfeatures2d\src\sift.cpp:1207: error: (-213:The function/feature is not implementation)这个算法是专利的并且被排除在此配置中;设置 OPENCV_ENABLE_NONFREE CMake 选项并在函数 'cv::xfeatures2d::SIFT::create' 中重建库

对此的最佳解决方案是:

**step 1: pip uninstall opencv-python**

**step 2: pip install opencv-contrib-python==3.4.2.16**
Run Code Online (Sandbox Code Playgroud)

这对我有用。

[注意:如果您还没有使用 pip install opencv-python 安装 opencv,那么只需删除下载的库并按照上述说明进行操作]


Oz *_*ano 2

这不是最顺利的方法,但它对我有用。

@Berak 向我解释说,正如您在我的问题的评论中所观察到的那样,SIFT 算法以及 FAST 算法已获得专利,这意味着它们不是常规 opencv 安装的一部分。

因此,我搜索了一个包含这一切的 python 发行版 - 我找到了一个。所以,我实际上并没有解决问题,正如 @Berak 所建议的那样,或者我使用Python(x,y)绕过了它

谢谢您的帮助,

厄兹拉德