不能在OpenCV中使用SURF,SIFT

问题描述 投票:47回答:12

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

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()我得到相同的错误...所以它失踪了,我必须添加它,但我不知道如何。

python opencv sift surf
12个回答
24
投票

我认为这远非“正确”的做法(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: 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

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


1
投票

在opencv3.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()

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的回答中的说明进行安装。


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>

0
投票

改变这个:

sift = cv2.xfeatures2d.SIFT_create()

这样:

cv2.ORB_create()

0
投票

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


56
投票

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

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

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

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

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

sift = cv2.xfeatures2d.SIFT_create()

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


56
投票

有一个点源使这很容易。

  1. 如果您安装了另一个版本的opencv-python,请使用此命令将其删除以避免冲突: pip uninstall opencv-python
  2. 然后使用以下命令安装contrib版本: pip install opencv-contrib-python
  3. SIFT用法: import cv2 sift = cv2.xfeatures2d.SIFT_create()

28
投票

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


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的!

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

我们需要构建的essentials和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来说还不够......我们需要修改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()

玩得开心!


2
投票

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

make opencv_nonfree
sudo make install

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>

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。


1
投票
  1. 安装OpenCV-Contrib
  2. import cv2 sift = cv2.xfeatures2d.SIFT_create()
  3. sift.something()

这是安装Contrib的简便方法。

© www.soinside.com 2019 - 2024. All rights reserved.