不能在OpenCV中使用SURF,SIFT

Lin*_*nda 52 python opencv surf sift

我正在尝试一个简单的事情

detector = cv2.SIFT()
Run Code Online (Sandbox Code Playgroud)

并得到这个错误的错误

detector = cv2.SIFT()
AttributeError: 'module' object has no attribute 'SIFT'
Run Code Online (Sandbox Code Playgroud)

我不明白,因为安装了cv2.

cv2.__version__

$Rev: 4557 $
Run Code Online (Sandbox Code Playgroud)

我的系统是Ubuntu 12.04.

也许某人有同样的问题,可以帮助我.

编辑:

长话短说,testypypypy.py:

import cv2

detector = cv2.SIFT()
Run Code Online (Sandbox Code Playgroud)

错误:

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

如果我认为SURF它是有效的,因为SURF它在,dir(cv2)但如果我也采取cv2.BFMatcher()我得到相同的错误...所以它失踪了,我必须添加它,但我不知道如何.

小智 62

有一个点源使这很容易.

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

    pip uninstall opencv-python
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后使用以下命令安装contrib版本:

    pip install opencv-contrib-python
    
    Run Code Online (Sandbox Code Playgroud)
  3. SIFT用法:

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

  • 当我这样做时,我得到:错误: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编译的 (9认同)
  • 这就像一个魅力.不知道为什么这不赞成. (7认同)
  • 截至2019年4月,最新版本(v4.0.0.21)抱怨(@whiteShadow指出)。您可以安装旧版本的`pip install -U opencv-contrib-python == 3.4.0.12`来避免这种情况。 (6认同)
  • 截至2019年9月,@ Falcon的建议对我有用。基本上卸载`opencv-python`并安装`opencv-contrib-phython`的版本3.4.2.16` (3认同)
  • 听说SIFT专利这个月或者下个月就到期了,也许OpenCV又会回来。 (3认同)
  • 完美 - 最简单的解决方案 - 谢谢! (2认同)

小智 57

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

这里关于这个问题的大多数信息已经过时了.

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

对于安装,还有一个很好的页面,告诉您如何安装opencv opencv_contrib和Python支持,以便获得SURF/SIFT.

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

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

在我找到上述页面之前,我也遭受了相当多的困扰.但是列出的页面在帮助安装和解释错误方面做得非常好.

  • cv2.xfeatures2d.SIFT_create()< - 感谢你指出这一点. (7认同)
  • @lysdexia你怎么得到`cv2.xfeatures2d.SIFT_create()`工作?它仍然给我`AttributeError:'模块'对象没有属性'xfeatures2d'`.你是如何安装opencv和opencv_contriv的?我做了'pip install python-opencv`以及OP中链接的页面的后续步骤. (3认同)
  • 这似乎是一个相当漫长的过程,另一方面,执行pip install python-opencv和pip install opencv-contrib-python可立即解决问题。 (2认同)

Spe*_*hal 28

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


Mår*_*n W 23

我认为这远非"正确"的做法(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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  4. 构建和安装:

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

    export PYTHONPATH=~/.opencv-2.4.6.1/lib/python2.7/dist-packages
    
    Run Code Online (Sandbox Code Playgroud)

现在,如果我启动python并导入cv2(对我来说,这会产生一个gnome-keyring警告),我有cv2.SIFT和cv2.SURF可用.


viz*_*zzy 8

对于debian用户来说,"轻松"创建自己的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
Run Code Online (Sandbox Code Playgroud)

在您的家中创建一个目录并切换到该目录:

cd ~ && mkdir opencv-debian
cd opencv-debian
Run Code Online (Sandbox Code Playgroud)

下载所需的包:

apt-get source libopencv-core2.4
Run Code Online (Sandbox Code Playgroud)

并下载所有需要的依赖包以构建新的opencv

apt-get build-dep libopencv-core2.4
Run Code Online (Sandbox Code Playgroud)

这将下载所需的源并创建一个名为"opencv-2.4.9.1 + dfsg"的目录

切换到该目录:

cd opencv-2.4.9.1+dfsg
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过键入以下内容来测试是否构建包而无需修改:

fakeroot debian/rules binary
Run Code Online (Sandbox Code Playgroud)

这将需要很长时间!这一步应该没有错误,你现在在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
Run Code Online (Sandbox Code Playgroud)

这将下载opencv-2.4.9.tar.gz

提取存档:

tar -xzvf opencv-2.4.9.tar.gz
Run Code Online (Sandbox Code Playgroud)

这会将原始源解压缩到名为opencv-2.4.9的目录中

现在将非自由模块从原始源复制到debian源:

cp -rv opencv-2.4.9/modules/nonfree opencv-2.4.9.1+dfsg/modules/
Run Code Online (Sandbox Code Playgroud)

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

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

mcedit opencv-2.4.9.1+dfsg/debian/control
Run Code Online (Sandbox Code Playgroud)

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

并添加此部分:

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.
Run Code Online (Sandbox Code Playgroud)

现在我们创建一个名为libopencv-nonfree2.4.install的新文件

touch opencv-2.4.9.1+dfsg/debian/libopencv-nonfree2.4.install
Run Code Online (Sandbox Code Playgroud)

并编辑:

mcedit opencv-2.4.9.1+dfsg/debian/libopencv-nonfree2.4.install
Run Code Online (Sandbox Code Playgroud)

并添加以下内容:

usr/lib/*/libopencv_nonfree.so.*
Run Code Online (Sandbox Code Playgroud)

好吧,就是这样,现在再次创建包:

cd opencv-2.4.9.1+dfsg
Run Code Online (Sandbox Code Playgroud)

先清理一下:

fakeroot debian/rules clean
Run Code Online (Sandbox Code Playgroud)

并建立:

fakeroot debian/rules binary
Run Code Online (Sandbox Code Playgroud)

et voila ...过了一会儿你有一个新的内置和一个新包libopencv-nonfree2.4.deb!

现在以root身份安装:

dpkg -i libopencv-nonfree2.4.deb
dpkg -i python-opencv.deb
Run Code Online (Sandbox Code Playgroud)

并测试!

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()
Run Code Online (Sandbox Code Playgroud)

玩得开心!


Pri*_*pta 6

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

卸载所有 opencv 版本

python -m pip uninstall opencv-python

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

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

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

然后你可以使用

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


A.A*_*tov 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
Run Code Online (Sandbox Code Playgroud)

这将安装 OpenCV 2.4.11。Anaconda 的另一个命令 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
Run Code Online (Sandbox Code Playgroud)

检查 SIFT:

conda activate myenv
python
>>> cv2.xfeatures2d.SIFT_create()
<xfeatures2d_SIFT 000002A3478655B0>
Run Code Online (Sandbox Code Playgroud)