无法在OpenCV中使用SURF和SIFT算法

71

我正在尝试做一件简单的事情,比如

detector = cv2.SIFT()

并且出现了这个糟糕的错误

detector = cv2.SIFT()
AttributeError: 'module' object has no attribute 'SIFT'

因为安装了cv2,所以我不理解。

cv2.__version__

$Rev: 4557 $

我的系统是Ubuntu 12.04。

或许有人遇到了同样的问题并能够帮助我。

编辑:

长话短说,testypypypy.py

import cv2

detector = cv2.SIFT()

错误:

Traceback (most recent call last):
  File "testypypy.py", line 3, in <module>
    detector = cv2.SIFT()
AttributeError: 'module' object has no attribute 'SIFT

如果我使用SURF,它可以正常工作,因为SURFdir(cv2)中,但是如果我也使用cv2.BFMatcher(),我会得到同样的错误...... 所以它缺失了,我必须添加它,但我不知道该如何添加。


你有查看过 dir(cv2) 的输出结果来确认 SIFT 是否被列出了吗? - Foon
只列出了“SIFT_COMMON_PARAMS_AVERAGE_ANGLE”和“SIFT_COMMON_PARAMS_FIRST_ANGLE”。我能否更新“SIFT”以及像“cv2.BFMatcher()”这样的其他内容?如果可以,该如何操作?:)谢谢 - Linda
Marten建议的步骤对我很有用。 :) 我在AWS上运行的Ubuntu 12.4上尝试了它。第4步中我改变了一件事:使用“sudo make install”而不是“make install”。我还能够使用下面链接中的说明使SIFT和SURF在Fedora上工作: http://www.g7smy.co.uk/?p=366 - user1146904
2
也许您拥有更新的OpenCV版本:尝试使用cv2.xfeatures2d.SURF_create代替cv2.SURF(许多教程都在使用旧的调用方法)。 - Paulo Scardine
SIFT和SURF位于贡献库部分,必须在安装时特别包含。请参见https://docs.opencv.org/4.1.1/d2/dca/group__xfeatures2d__nonfree.html。 - fmw42
22个回答

84

有一个pip源可以让这个过程变得非常简单。

  1. 如果您安装了另一个版本的opencv-python,请使用以下命令将其删除,以避免冲突:

  2. pip uninstall opencv-python
    
  3. 然后使用以下命令安装contrib版本:

  4. pip install opencv-contrib-python
    
  5. SIFT 的用法:

  6. import cv2
    sift = cv2.xfeatures2d.SIFT_create()
    

9
这个方法很有效。不知道为什么没有得到点赞。 - piepi
12
当我这样做时,出现以下错误: 错误:OpenCV(3.4.3) C:\projects\opencv-python\opencv_contrib\modules\xfeatures2d\src\sift.cpp:1207: 错误:(-213:该功能/特性未实现)此算法受专利保护,并在此配置中被排除;请设置OPENCV_ENABLE_NONFREE CMake选项并重新构建库以在函数'cv::xfeatures2d::SIFT::create()'中使用。 我猜下载的版本没有编译OPENCV_ENABLE_NONFREE。 - whiteShadow
13
截至2019年4月,最新版本(v4.0.0.21)报错(@whiteShadow指出)。您可以安装旧版本pip install -U opencv-contrib-python==3.4.0.12以避免此问题。 - Falcon
3
截至2019年9月,@Falcon的建议对我奏效了。基本上是卸载opencv-python并安装版本为3.4.2.16opencv-contrib-python - Sau001
3
我听说SIFT专利将于本月或下个月到期,可能会重新出现在OpenCV中。 - whiteShadow
显示剩余3条评论

63

如需有关此问题的最新信息(截至2015年9月),请参阅此页面

这里大多数关于该问题的信息都已过时。

pyimagesearch说的是由于专利问题,SURF/SIFT被移动到 opencv_contrib 中。

关于安装,还有一个详细页面,告诉您如何安装带有opencv_contrib和Python支持以获取SURF / SIFT。

请注意,API也已更改。现在是这样的:

sift = cv2.xfeatures2d.SIFT_create()
在我找到上述页面之前,我也遇到了不少困难。但是列出的这些页面在安装方面做得很好,并且能够解释问题所在。

8
cv2.xfeatures2d.SIFT_create() 是一个函数名,用于创建SIFT算法的对象。 - lysdexia
cv2.DescriptorExtractor_create("SIFT")的替代方案是什么? - jAYANT YADAV
3
你是如何让cv2.xfeatures2d.SIFT_create()运行起来的?我仍然遇到AttributeError: 'module' object has no attribute 'xfeatures2d'。你是如何安装opencv和opencv_contrib的?我使用了pip install python-opencv并按照原帖中提供的链接操作了下一步。 - piepi
2
这似乎是一个相当冗长的过程,然而运行pip install python-opencvpip install opencv-contrib-python会立即解决问题。 - piepi
我也在当前版本的OpenCV中看不到xfeatures2d可用。 - Michael Brown
我按照 https://www.learnopencv.com/install-opencv3-on-ubuntu/ 的指引进行了配置安装,然后将代码中的 cv2.xfeatures2d.SIFT_create() 改为这个,问题就解决了 :D - King Alawaka

30

25

我认为这并不是“正确”的方法(在Ubuntu上,“正确”的方法似乎是坚持使用损坏和/或过时的OpenCV),但对于我来说,从源代码构建opencv-2.4.6.1可以恢复cv2.SIFT和cv2.SURF。

步骤:

  1. opencv.org下载opencv-2.4.6.1.tar.gz。
  2. 提取源码:

    tar -xf opencv-2.4.6.1.tar.gz -C /tmp
    
  3. 配置源。这将告诉OpenCV在您的主目录中安装到.opencv-2.4.6.1:

  4. cmake -D CMAKE_BUILD_TYPE=RELEASE \
          -D BUILD_PYTHON_SUPPORT=ON \
          -D WITH_XINE=ON \
          -D WITH_OPENGL=ON \
          -D WITH_TBB=ON \
          -D BUILD_EXAMPLES=ON \
          -D BUILD_NEW_PYTHON_SUPPORT=ON \
          -D WITH_V4L=ON \
          -D CMAKE_INSTALL_PREFIX=~/.opencv-2.4.6.1 \
          /tmp/opencv-2.4.6.1
    
  5. 构建和安装:

    cd /tmp/opencv-2.4.6.1
    make -j4
    make install
    
  6. 设置PYTHONPATH(这在bash中有效,其他shell我不清楚):

  7. export PYTHONPATH=~/.opencv-2.4.6.1/lib/python2.7/dist-packages
    

    现在,如果我启动Python并导入cv2(这会产生一个gnome-keyring警告),我就可以使用cv2.SIFT和cv2.SURF了。


我已经尝试过了,但仍然出现相同的错误。是否有可能完全删除OpenCV并且这样做会有所帮助?! - Linda
加载的是新版的cv2还是旧版的cv2?print cv2.__version__会显示什么? - Mårten W
打印cv2.__version__显示$Rev: 4557 $ - Linda
1
@Linda:然后它会加载旧的版本。重新启动Python,尝试使用import os,sys,接着输入os.chdir(os.path.expanduser('~/.opencv-2.4.6/lib'))sys.path.append(os.path.expanduser('~/.opencv-2.4.6.1/lib/python2.7/dist-packages')),然后检查它加载的是哪个版本。应该是新的版本。 - Mårten W
好的,现在它正在工作!谢谢(但它仍然是$Rev: 4557 $!我是否总是需要将这些行放入我的代码中?有没有可能永久修复它?顺便说一下:它是os.chdir(os.path.expanduser('~/.opencv-2.4.6.1/lib')) - Linda
显示剩余2条评论

9
对于Debian用户来说,创建自己的libopencv-nonfree软件包非常“容易”。
我按照Python的OpenCV教程进行操作,但是在我的Debian系统中,SIFT和SURF模块缺失。并且,Debian没有可用的包含SIFT和SURF等模块的非免费软件包。
这些模块由于许可问题而被剥离出软件包......
我以前从未为Debian创建过软件包(添加新模块等),但是我遵循了Debian教程中的一些简单步骤,并尝试和猜测了一些东西,经过1天的努力,哇......我得到了一个工作正常的libopencv-nonfree2.4 deb软件包和正确绑定的Python模块。
(我不知道是否还需要安装新构建的python-opencv软件包或仅需要非免费软件包...我重新安装了两者,得到了一个带有所有必要非免费模块的工作正常的Python OpenCV库!)
好的,这里是:
!这是针对libopencv 2.4的!
!您可以执行除安装之外的所有步骤,如同普通用户一样!
我们需要从Debian存储库获取编译和创建新软件包所需的构建基础和一些工具。
sudo apt-get install build-essential fakeroot devscripts

在你的个人主目录中创建一个文件夹并进入该文件夹:
cd ~ && mkdir opencv-debian
cd opencv-debian

下载所需的软件包:

apt-get source libopencv-core2.4

并下载所有必需的依赖包来构建新的opencv

apt-get build-dep libopencv-core2.4

这将下载所需的源代码并创建一个名为“opencv-2.4.9.1+dfsg”的目录。

切换到该目录:

cd opencv-2.4.9.1+dfsg

现在你可以通过输入以下命令来测试包是否无需修改即可构建:

fakeroot debian/rules binary

这需要花费很长时间!这一步应该在没有错误的情况下完成。现在你在opencv-debian目录中有很多.deb软件包。
接下来我们对包定义进行一些修改,让Debian构建非自由模块和软件包!
切换到opencv-debian目录并下载正确的OpenCV源代码...在我的例子中是OpenCV 2.4.9之类的版本。
我从https://github.com/Itseez/opencv/releases获取了我的版本。
wget https://codeload.github.com/Itseez/opencv/tar.gz/2.4.9

这将会下载opencv-2.4.9.tar.gz文件。
解压缩该存档:
tar -xzvf opencv-2.4.9.tar.gz

这将解压原始源代码到名为opencv-2.4.9的目录中。

现在将非自由模块从原始源代码复制到Debian源代码中:

cp -rv opencv-2.4.9/modules/nonfree opencv-2.4.9.1+dfsg/modules/

好的,现在我们已经有了非自由模块的源代码,但这对于Debian来说还不够...我们需要修改一个文件并创建一个新文件。

我们需要编辑Debian控制文件,并在文件末尾添加一个新的部分: (我在这里使用mcedit作为编辑器)

mcedit opencv-2.4.9.1+dfsg/debian/control

或使用您选择的任何其他编辑器

并添加此部分:

Package: libopencv-nonfree2.4
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: OpenCV Nonfree Modules like SIFT and SURF
 This package contains nonfree modules for the OpenCV (Open Computer Vision)
 library.
 .
 The Open Computer Vision Library is a collection of algorithms and sample
 code for various computer vision problems. The library is compatible with
 IPL (Intel's Image Processing Library) and, if available, can use IPP
 (Intel's Integrated Performance Primitives) for better performance.
 .
 OpenCV provides low level portable data types and operators, and a set
 of high level functionalities for video acquisition, image processing and
 analysis, structural analysis, motion analysis and object tracking, object
 recognition, camera calibration and 3D reconstruction.

现在我们创建一个名为libopencv-nonfree2.4.install的新文件。
touch opencv-2.4.9.1+dfsg/debian/libopencv-nonfree2.4.install

并编辑:

mcedit opencv-2.4.9.1+dfsg/debian/libopencv-nonfree2.4.install

并添加以下内容:
usr/lib/*/libopencv_nonfree.so.*

好的,现在重新创建软件包:

cd opencv-2.4.9.1+dfsg

首先进行清理:

fakeroot debian/rules clean

并构建:

fakeroot debian/rules binary

完成之后,您将获得一个全新的构建和一个名为libopencv-nonfree2.4.deb的新软件包!

现在以root身份安装:

dpkg -i libopencv-nonfree2.4.deb
dpkg -i python-opencv.deb

并测试!

import cv2
import numpy as np
from matplotlib import pyplot as plt

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

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

corners = cv2.goodFeaturesToTrack(gray,16,0.05,10)
corners = np.int0(corners)

for i in corners:
    x,y = i.ravel()
    cv2.circle(img,(x,y),90,255,3)

plt.imshow(img),plt.show()

祝你玩得愉快!


这对我在Ubuntu 14.04上也起作用。我现在可以在Python中使用cv2.sift了。 - David DeWert

6

在 OpenCV 3.x 中,SIFT() 和 SURF() 已经不再存在了。为了解决这个问题,需要卸载所有的 OpenCV 版本。

python -m pip uninstall opencv-python

python -m pip uninstall opencv-contrib-python

接下来,使用以下命令和Python(3.x)安装opencv-contrib以包含sift()和surf()函数:

python -m pip install opencv-contrib-python==3.4.2.16

那么您可以使用

标签。

sift = cv2.xfeatures2d.SIFT_create()

谢谢您先生!这是一项巨大的贡献。 - mLstudent33
这就是它所需要的,至少在Windows上是这样。 - john k
它在我的RPI 4上运行良好,只需要修改为Python3。但在Windows上无法工作。在Windows上,它会显示版本未找到:“python3 -m pip install opencv-contrib-python==3.4.2.16” - Whois7pi

5
作为Anaconda用户,我想找到一两个适当的命令来解决这个问题。幸运的是,这个答案帮了我大忙。对于conda 4.5.11(使用conda -V检查Anaconda版本),我执行了以下步骤:
# Python version does not matter, most likely, check yourself
conda create -n myenv python=3.6     
conda activate myenv
conda install -c menpo opencv

这将安装OpenCV 2.4.11。Anaconda的另一个命令conda install -c menpo opencv3将安装OpenCV3,但是Python必须降级到2.7。若要使用Python3安装OpenCV3,请使用下面的方法(由于第一个链接):

conda create -n myenv python  
pip install opencv-python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16

检查 SIFT:

conda activate myenv
python
>>> cv2.xfeatures2d.SIFT_create()
<xfeatures2d_SIFT 000002A3478655B0>

我刚刚选择了Ubuntu,并使用pip3而不是pip来检查安装步骤。对于版本3.4.2.16,一切都很顺利。但是版本4.0.0.21限制了使用SIFT,并要求从源代码进行编译才能使用SIFT。 - A.Ametov

4

以下是2020年9月我使用的方法:

  1. Remove previous versions:
    pip uninstall opencv-python
    pip uninstall opencv-contrib-python
    
  2. Install this particular version (3.4.2.16 was no longer available)
    pip install opencv-python==3.4.2.17
    pip install opencv-contrib-python==3.4.2.17
    
  3. Create the detectors with:
    import cv2
    sift = cv2.xfeatures2d.SIFT_create()
    surf = cv2.xfeatures2d.SURF_create()
    

3

SHIFT更改为ORB,我认为这是由于版本不相关导致的问题,ORBSHIFTSURF的有效且更好的替代品。

当我使用 cv2.SHIFT() 时,也遇到了同样的问题。

错误:AttributeError: 'module'对象没有属性'SIFT'

现在对我来说完全正常,请尝试这个:

ORB = cv2.ORB()


2
自从我编译了OpenCV之后,发现了这个问题,所以我只需要执行以下操作(在我的OpenCV构建目录中):
make opencv_nonfree
sudo make install

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