不能在OpenCV中使用SURF,SIFT

时间:2013-09-01 19:09:53

标签: python opencv sift surf

我正在尝试像

这样简单的事情
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()

ERROR:

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

如果我采用SURF它可行,因为SURF位于dir(cv2),但如果我也采用cv2.BFMatcher()我也会遇到同样的错误...所以它丢失了我的确有添加它,但我不知道如何。

21 个答案:

答案 0 :(得分:54)

有关此问题的最新信息(截至2015年9月),请咨询this page

这里有关于这个问题的大部分信息已经过时了。

pyimagesearch所说的是,由于专利问题,SURF / SIFT被移至opencv_contrib

对于安装,还有一个nice page,告诉您如何使用opencv_contrib和Python支持安装opencv,以便获得SURF / SIFT。

请注意,API也发生了变化。现在它是这样的:

sift = cv2.xfeatures2d.SIFT_create()

在我找到上述页面之前,我也遭遇了不少。但是列出的页面在帮助安装和解释错误方面做得非常好。

答案 1 :(得分:52)

有一个点源使这很容易。

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

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

    pip install opencv-contrib-python
    
  3. SIFT用法:

    import cv2
    sift = cv2.xfeatures2d.SIFT_create()
    

答案 2 :(得分:28)

仅供参考,自3.0.0开始,SIFT和朋友在位于https://github.com/Itseez/opencv_contrib的contrib repo中,默认情况下不包含在opencv中。

答案 3 :(得分:22)

我认为这远非“正确”的做法(Ubuntu上的“正确”方式似乎是坚持破坏和/或过时的OpenCV),但对我来说,构建opencv-2.4.6.1来自source带回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:

    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
    
  4. 构建并安装:

    cd /tmp/opencv-2.4.6.1
    make -j4
    make install
    
  5. 设置PYTHONPATH(这在bash中有效,我对其他shell没有任何线索):

    export PYTHONPATH=~/.opencv-2.4.6.1/lib/python2.7/dist-packages
    
  6. 现在,如果我启动python并导入cv2(对我来说,这会产生一个gnome-keyring警告),我有cv2.SIFT和cv2.SURF可用。

答案 4 :(得分:8)

对于debian用户来说,它很容易&#39;创建自己的libopencv-nonfree包。

我遵循了python的opencv教程,但是在我的debian中,缺少SIFT和SURF模块。并且没有非免费软件包可用于debian,包括SIFT和SURF等。

由于许可证问题,他们被从包装中剥离了....

我从来没有为debian创建过一个包(添加一个新的模块等)但是我在debian教程中遵循了一些小步骤并尝试了一下,并且在一天之后,瞧...我工作了一个libopencv -nonfree2.4 deb包和一个带有正确绑定的python模块。

(我不知道我是否还需要安装新构建的python-opencv软件包或只安装非自由软件...我重新安装了两个软件包并获得了一个包含所有必需的非自由模块的python opencv库!)

好的,这是:

!这是针对libopencv 2.4的!

!除了作为普通用户安装外,您可以执行所有步骤!

我们需要构建的essesntials和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

这将下载所需的源并创建一个名为&#34; opencv-2.4.9.1 + dfsg&#34;

的目录

切换到该目录:

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来说还不够......我们需要修改1个文件并创建一个新文件

我们必须编辑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

et voila ...过了一段时间,你有一个新的内置和一个新包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()

玩得开心!

答案 5 :(得分:4)

在opencv3.x中,SIFT()和SURF()不再存在。

卸载所有opencv版本

python -m pip uninstall opencv-python

python -m pip uninstall opencv-contrib-python

在安装opencv-contrib之后,使用以下给定命令和python(3.x)来包含sift()和surf()

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

然后您可以使用

sift = cv2.xfeatures2d.SIFT_create()

答案 6 :(得分:2)

因为当我发现这个问题时我已经编译了opencv,所以我所要做的就是(来自我的opencv构建目录):

make opencv_nonfree
sudo make install

答案 7 :(得分:2)

作为Anaconda用户,我想找到一个或两个适当的命令来解决该问题。幸运的是,这个answer有所帮助。对于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的另一个command conda install -c menpo opencv3将安装OpenCV3,但是Python必须降级到2.7。要使用Python3安装OpenCV3,请使用next(由于第一个链接):

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>

答案 8 :(得分:1)

按照此安装步骤

http://jayrambhia.com/blog/install-opencv-2-4-in-ubuntu-12-04-precise-pangolin/

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local
    -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON 
    -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON 
    -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON ..

使用此命令将库安装到/ usr / local / lib。

答案 9 :(得分:1)

安装Python opencv

pip install opencv-python

,而不是使用..

cv2.SIFT()

使用

cv2.SIFT_create()

使用下面的 opencv-python 的工作代码

import cv2
img1 = cv2.imread('yourimg.png',0)
sift = cv2.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1,None) #keypoint and descriptors
...

您还可以安装“ opencv-contrib-python”并使用“ cv2.xfeatures2d.SIFT_create()”,但这取决于您。 使用python软件包 opencv-contrib-python

的有效代码
import cv2
img1 = cv2.imread('yourimg.png',0)
sift = cv2.xfeatures2d.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1,None) #keypoint and descriptors

谢谢

答案 10 :(得分:1)

  1. 安装OpenCV-Contrib

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

  3. sift.something()

这是安装Contrib的简单方法。

答案 11 :(得分:1)

这是2020年9月对我有用的东西:

  1. 删除以前的版本:
    pip uninstall opencv-python
    pip uninstall opencv-contrib-python
    
  2. 安装此特定版本(3.4.2.16不再可用)
    pip install opencv-python==3.4.2.17
    pip install opencv-contrib-python==3.4.2.17
    
  3. 使用以下方法创建检测器:
    import cv2
    sift = cv2.xfeatures2d.SIFT_create()
    surf = cv2.xfeatures2d.SURF_create()
    

答案 12 :(得分:1)

只需将opencv的版本更改为3.4.2.16即可。由于已获得专利,因此无法在较新的版本中使用。

答案 13 :(得分:1)

只需将SHIFT更改为ORB, 我认为它的发生是因为版本不相关, ORB SHIFT SURF 的高效且更好的替代。

因为我在使用cv2.SHIFT()时也遇到相同的问题

  

错误:AttributeError:“模块”对象没有属性“ SIFT”

现在它完全适合我,请尝试以下操作:

ORB = cv2.ORB()

答案 14 :(得分:0)

以上建议的解决方案都不适合我。我使用Anaconda,发现opencv版本3.3.1仍启用了Sift。如果要在隔离的conda环境中进行测试,请尝试以下来自@ A.Ametov的答案的启发性

conda create -n testenv opencv=3.3.1     
conda activate testenv

conda activate myenv
python
#Check version of opencv being used
>>> import cv2
>>> cv2.__version__
#Check if Sift is available
>>> cv2.xfeatures2d.SIFT_create()
<xfeatures2d_SIFT 000002A3478655B0>

答案 15 :(得分:0)

自2020年6月起,我认为此版本(pip install -U opencv-contrib-python==3.4.2.16)仍在工作。因此,请安装并享受。

答案 16 :(得分:0)

以下页面提供了相对较好的指南,需要进行一些更正:https://cv-tricks.com/how-to/installation-of-opencv-4-1-0-in-windows-10-from-source/

在步骤8中,当您为项目选择生成器(用于构建的工具)时,如果需要,请不要忘记在第二个字段中指定x64。否则,您将得到LNK1112错误,这是一个链接器错误,如果使用x64编译器创建一个模块,而使用x86编译器创建另一个模块,则会导致该链接器错误。

接下来,在步骤9中选择标志时,不要忘记勾选“ OPENCV_ENABLE_NONFREE”,并设置标志“ OPENCV_EXTRA_MODULES_PATH”标志的路径。路径必须在opencv-contrib-python中设置为“ modules”文件夹。

因此,您需要opencv和opencv-contrib-python才能使用SIFT和SURF。

答案 17 :(得分:0)

您可以以这种方式进行。它也必须为您工作!

第1步:

virtualenv venv 
source venv/bin/activate

第2步:

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

第3步:

import cv2
sift = cv2.xfeatures2d.SIFT_create()

不要使用cv2.SIFT()。它将引发异常。

答案 18 :(得分:0)

更改此

sift = cv2.xfeatures2d.SIFT_create()

通过此

cv2.ORB_create()

答案 19 :(得分:0)

vizzy建议的方法也适用于OpenCV 2.4.8,就像在Ubuntu 14.04 LTS下构建非免费软件包一样。

此依赖项问题可能会阻止安装非免费软件包:

 libopencv-nonfree2.4 depends on libopencv-ocl2.4; however:
  Package libopencv-ocl2.4 is not installed.

易于修复,因为可以从刚刚构建的软件包安装缺少的软件包:

dpkg -i libopencv-ocl2.4_2.4.8+dfsg1-2ubuntu1_amd64.deb

之后安装按照vizzy的回答中所述进行。

答案 20 :(得分:-1)

试试这个

!pip install opencv-contrib-python==4.4.0.44 筛选 = cv2.SIFT_create()