属性错误:'模块'对象没有属性'xfeatures2d'[Python/OpenCV 2.4]

57

这一行:

sift = cv2.xfeatures2d.SIFT_create()

返回错误:

Traceback (most recent call last):
  File "C:/Python27/openCVskrypty/GUI/SOLUTION2.py", line 11, in <module>
    sift = cv2.xfeatures2d.SIFT_create()
AttributeError: 'module' object has no attribute 'xfeatures2d'

我读到了一些关于这个错误的信息,它出现在OpenCV 3.0版本中。这很奇怪因为我有2.4.11版本。

我检查了dir(cv2),但我没有得到xfeatures2d模块。有人知道原因吗?我可以单独下载它吗?

感谢帮忙解决这个问题。

13个回答

62

我认为您应该安装opencv-contrib-python。您正在使用的模块在opencv-python中不受支持。请参见opencv-contrib-python

安装方法:

pip install opencv-contrib-python

1
这很可能是OpenCV 3+用户看到AttributeError: 'module' object has no attribute 'xfeatures2d'的正确解决方案。 - Karaszka
你尝试过先卸载之前的OpenCV吗? - Shao-Kui
对我来说工作正常,但是收到了这个警告 - [ WARN:0@0.237] global shadow_sift.hpp:13 SIFT_create DEPRECATED: cv.xfeatures2d.SIFT_create() 已经过时,因为SIFT已经转移到主存储库。https://github.com/opencv/opencv/issues/16736 - Shubham Singh

33

SIFT是一种受专利保护的算法,因此不是每个开放式计算机视觉版本都可用。您可以做的是同时安装OpenCV及其contrib部分,即

pip install opencv-python==3.3.0.10 opencv-contrib-python==3.3.0.10

SIFT在我使用的OpenCV版本上表现良好。


5
你甚至可以升级到3.4.2.17版本仍然使用SIFT。 - creimers
1
至少对我来说,cv2.xfeatures2d.SIFT_create() 只在3.3.0.10版本上工作。 - Emeeus
1
错误:找不到与opencv-python==3.3.0.10相匹配的发行版。 - Talha Anwar
1
版本3.3.0.10现在不可用,下一个版本是3.4.2.16,并且可以使用sift=cv2.xfeatures2d.SIFT_create()。我还需要运行pip3 install opencv-pythonsudo apt-get install libatlas-base-devsudo apt-get install libjasper-devsudo apt-get install libqtgui4sudo apt-get install python3-pyqt5sudo apt install libqt4-test - Captain Fantastic
1
只需使用 cv2.SIFT_create() 在较新版本中就可用。我正在使用的是OpenCV 4.5.4。 - Daniel Azemar

23

对于CV2版本4.5.1,这是可行的。

sift = cv2.SIFT_create()
kp = sift.detect(gimg,None)
img=cv2.drawKeypoints(gimg,kp,img)
plt.imshow(img)

https://github.com/HeatherJiaZG/SuperGlue-pytorch/issues/13 - Evan Anger
1
我也使用opencv-python==4.5.3.56和opencv-contrib-python==4.5.3.56,可以正常工作。 - Azam Rafique
@Usama gimg是什么? - Syed Hussain
@SyedHussain 这是灰色图像。 - Usama Imdad

14

执行该命令后:

pip install opencv-contrib-python

我遇到了如下错误:

错误:OpenCV(4.0.0) /Users/rene/build/skvark/opencv-python/opencv_contrib/modules/xfeatures2d/src/sift.cpp:1207: 错误:(-213:该功能未实现) 此算法受专利保护,并在此配置中被排除;在“create”函数中设置OPENCV_ENABLE_NONFREE CMake选项并重新构建库

在anaconda中,可以使用以下命令解决:

conda install -c menpo opencv

或者使用pip:

pip install opencv-python==3.4.2.17

pip install opencv-contrib-python==3.4.2.17

2
未找到匹配的分发。 - Captain Fantastic
1
应该这样安装:pip install opencv-python==3.4.2.17pip install opencv-contrib-python==3.4.2.17 - turbo_sheep
如果您想使用SIFT或SURF,请安装3.4.2.16版本(已测试)。https://dev59.com/VVQK5IYBdhLWcg3wL9Bq - Burak

5
我得到了这个错误,我所做的只是卸载opencv包并按照以下顺序重新安装它们。
步骤:
1. 以管理员身份运行Anaconda Prompt。 2. 输入以下命令。
pip uninstall opencv-python

pip uninstall opencv-contrib-python

接下来输入以下命令

pip install opencv-contrib-python==3.4.2.16

pip install opencv-python==3.4.2.16

这解决了我的问题。希望这也能解决你的问题!!

4

在最新的CV2版本4.5.3.56中,这个功能是可行的:

img1 = cv2.imread(r'C:\Users\CW\Desktop\new_img.png') 
sift = cv2.SIFT_create() 
kp1, des1 = sift.detectAndCompute(img1, None)

仅提供代码的答案并不是良好的做法。请考虑解释这个答案如何回答问题 - DevWithZachary

3

我以前也遇到了@srihegde提到的类似问题,你可以尝试卸载opencv-contrib-python包并重新安装。如果你已经安装了opencv-python包,也可以尝试卸载它,因为它可能会影响其他包。

这对我有所帮助。

卸载:

pip3 uninstall opencv-contrib-python
pip3 uninstall opencv-python

然后安装:

pip3 install opencv-contrib-python
pip3 install opencv-python

我只需要安装部分。 - Captain Fantastic

3

现在SIFT专利已经过期了,所以在OpenCV版本>4.4中,OpenCV已将SIFT_create()直接移动到主存储库中,而不是放在contrib模块中。因此,请使用sift = cv2.SIFT_create()代替cv2.xfeatures2d.SIFT_create()。详细信息请参见此处


3

我也遇到了同样的错误……我使用了 cv2.__version__cv2.__path__ 来检查 OpenCV 的版本和路径。然后我从 site-packages 中删除了 cv2,并安装了以下内容:

pip install opencv-python==3.4.2.17

pip install opencv-contrib-python==3.4.2.17

这是适用于最新版本的安装顺序。 - Sundeep Pidugu
未找到匹配的发行版。 - Captain Fantastic
你需要将 OpenCV 的发行版本修改为最新的版本。目前它是 4.1.2.30。 - Sanjoy Kanrar

2
问题出在你的OpenCV版本上。你说你用的是2.4.11版本,但这个版本的OpenCV没有这个可用的方法。
你可以查看文档。它有features2d
而OpenCV 3.0则有这个方法。

谢谢您的回答。我是否可以单独下载这个模块,而不必下载v.3.0 OpenCV? - Lipstick

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