OpenCV中的SIFT()无法运行:'module'对象没有属性'SURF'。

9

我想在Ubuntu的终端中运行最简单的OpenCV SIFT代码,但是没有成功。

我遇到了一个错误:

AttributeError: 'module' object has no attribute 'SURF'

代码如下:
import cv2
cv2.SIFT()

我的配置:

  • Ubuntu 版本是 13.10 64 位
  • cv2.__version__ 是 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'


1
SIFT和SURF是非免费的,受专利保护的算法。一些软件包管理器(例如Debian)提供了一个cv2模块,但不包括它们。 - berak
我有额外的配置 - Windows 7,安装了Python 2.7和OpenCV 2.4.6,在这个配置中,我能够通过终端和pyDev调用SIFT()...是哪个库使它在这个配置上工作? - Oz Radiano
1
库的名称应该是opencv_nonfree,但在Windows上预编译的cv2.pyd可能已经是静态链接的(因此已经包含在内)。如果您需要在Linux上使用它,请获取源代码,自行编译即可。 - berak
谢谢!我在哪里可以获取它? - Oz Radiano
1
请从以下两个网站下载OpenCV库:sourceforgegithub - berak
显示剩余3条评论
9个回答

6
这让我感到困扰,但是忘掉其他建议吧,现在只需使用两个终端命令即可获取SIFT和SURF!
  1. Be sure there is no other opencv on you computer...

    pip uninstall opencv-python
    
  2. Then get the contribute version (has SIFT and SURF + others)...

    pip install opencv-contrib-python
    

它应该可以安装,但需要注意名称有些不同。

import cv2
sift = cv2.xfeatures2d.SIFT_create()

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


意思是:这只是一个玩笑话,不是实际的代码。

这是一个很棒的答案。在我的Python3.8 Ubuntu 20.04上运行得非常好。 - Vadim

5
import cv2
sift = cv2.SIFT()

如果您使用的是OpenCV 3.0或更高版本,此代码将无法工作。 此代码的替代方案是

sift = cv2.xfeatures2d.SIFT_create()
(Only works if you have installed opencv-contrib-python library )

如果您使用的opencv-contrib-python版本大于3.4,则会出现不同的错误。

错误:OpenCV(4.1.0) C:\ projects \ opencv-python \ opencv_contrib \ modules \ xfeatures2d \ src \ sift.cpp:1207: 错误:(-213:函数/功能未实现)此算法受专利保护,因此在此配置中被排除;设置 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**

这对我很有帮助。
[注意:如果您没有使用pip install opencv-python安装opencv,那么只需删除已下载的库并按照上述说明进行操作即可。]

2
这不是最顺畅的方法,但对我起作用了。
@Berak向我解释了,在我提出的问题的评论中可以看到,SIFT算法和FAST算法都是受专利保护的,这意味着它们不是opencv常规安装的一部分。
因此,我搜索了一个包含所有内容的Python发行版 - 我找到了一个。所以,我并没有像@Berak建议的那样真正解决问题,而是使用Python(x,y)绕过了它。
感谢您的帮助,
Ozrad

“不是OpenCV常规安装的一部分。” - 没有常规的二进制分发。它被包含在src中,PCA的维护者决定是否打包它。 - berak

1

我在使用SIFT时遇到了问题,因为我只有OpenCV。但是在安装ROS Hydro之后,我能够使用SIFT/SURF,因为它们属于非自由部分。


1

我发现的一个简单的SIFT代码

import cv2
import numpy as np

img = cv2.imread('home.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT()
kp = sift.detect(gray,None)

img=cv2.drawKeypoints(gray,kp)

cv2.imwrite('sift_keypoints.jpg',img)

我测试了代码,它可以正常工作


0

SIFT和SURF都是由各自的作者拥有专利的算法。以前它们不在OpenCV的主要存储库中,而是在contrib中,但现在根据OpenCV,它们的专利已于2020年到期,因此SIFT和SURF已添加到最新版本的主要存储库中。我尝试了4.5.2,它运行良好。

您可以使用pip3 install opencv-python=4.5.2安装此opencv版本。

要实例化和测试SIFT,请使用以下代码。

import numpy as np
import cv2 as cv

img = cv.imread('home.jpg')
gray= cv.cvtColor(img,cv.COLOR_BGR2GRAY)
sift = cv.SIFT_create()
kp = sift.detect(gray,None)
img=cv.drawKeypoints(gray,kp,img)
cv.imwrite('sift_keypoints.jpg',img)


0

我按照openCV python windows安装指南进行了操作。我尝试使用cv2.SIFT,但发现在此安装中不可用。

之后,我彻底卸载了python 2.7和openCV,然后安装了python(x,y)并包含了openCV。我得到了:
cv2.version
'2.4.8'

并且: cv2.SIFT -> cv2.SURF

因此,python(x,y)确实包括SIFT、SURF模块。


让我澄清一下:Python并不是问题所在,问题是你的 cv2.pyd 是否编译了非免费模块。 - berak

0

请使用4.4.0以上的版本,SIFT已经重新移回到主库中。 https://opencv.org/opencv-4-4-0/

pip install opencv-python==4.4.0.46

import cv2
sift = cv2.SIFT_create()

0

您可以按照以下方式轻松使用它:

sift = cv2.xfeatures2d_SIFT()

keypoints_detector = sift.detect(image=your_grayscale_image, mask=None)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接