70

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

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它是因为它SURF是 indir(cv2)但如果我也接受它cv2.BFMatcher(),我会得到同样的错误......所以它丢失了,我必须添加它,但我不知道如何添加它。

4

22 回答 22

84

有一个 pip 源可以很容易地做到这一点。

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

    pip uninstall opencv-python
    
  2. 然后用这个安装contrib版本:

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

    import cv2
    sift = cv2.xfeatures2d.SIFT_create()
    
于 2017-11-30T03:44:51.990 回答
63

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

此处有关此问题的大多数信息已过时。

pyimagesearch 的意思是,SURF/SIFT 是opencv_contrib因为专利问题而被转移到的。

对于安装,还有一个不错的页面,告诉您如何安装 opencvopencv_contrib和 Python 支持,以便获得 SURF/SIFT。

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

sift = cv2.xfeatures2d.SIFT_create()

在我找到上述页面之前,我也遭受了相当大的痛苦。但是列出的页面在帮助安装和解释问题方面做得很好。

于 2015-09-23T09:28:32.987 回答
30

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

于 2014-09-02T15:18:07.627 回答
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 中:

    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 可用。

于 2013-09-03T10:36:47.307 回答
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 来说还不够……我们需要修改 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

等等……过了一会儿,你有了一个全新的包 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()

玩得开心!

于 2014-12-29T18:58:41.467 回答
6

在 opencv3.x SIFT() & SURF() 不再存在。为此

卸载所有opencv版本

python -m pip uninstall opencv-python

python -m pip uninstall opencv-contrib-python

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

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

那么你可以使用

sift = cv2.xfeatures2d.SIFT_create()
于 2019-08-11T03:09:00.377 回答
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,请使用 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>
于 2019-01-05T10:30:02.690 回答
3

只需更改SHIFTORB,我认为它会因为不相关的版本而发生, ORBSHIFTSURF的有效和更好的替代品。

因为我在使用 cv2.SHIFT() 时也面临同样的问题

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

现在它完全适合我,请试试这个:

ORB = cv2.ORB()

于 2019-09-19T13:02:38.483 回答
2

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

make opencv_nonfree
sudo make install
于 2014-10-20T01:39:16.437 回答
2

这就是 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()
    
于 2020-09-19T12:42:53.913 回答
2

安装 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

谢谢

于 2020-09-21T12:12:38.087 回答
1

按照这个安装操作

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。

于 2014-02-23T11:41:01.863 回答
1
  1. 安装 OpenCV-Contrib

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

  3. sift.something()

这是安装 Contrib 的简单方法。

于 2018-07-30T18:10:31.283 回答
1

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

于 2019-08-27T06:44:01.920 回答
1

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

步骤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() 。它会引发异常。

于 2019-12-05T19:33:17.107 回答
1

由于专利到期,现在恢复正常的opencv了!检查这个: https : //docs.opencv.org/4.5.4/da/df5/tutorial_py_sift_intro.html 只要你的opencv版本是4.4.0+!

于 2021-12-06T19:55:35.530 回答
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 的回答中的说明进行安装。

于 2015-01-04T19:28:36.403 回答
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>
于 2019-03-03T01:50:50.440 回答
0

改变这个

sift = cv2.xfeatures2d.SIFT_create()

通过这个

cv2.ORB_create()
于 2019-05-12T06:29:52.940 回答
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。

于 2020-03-02T15:10:22.807 回答
0

根据 2020 年 6 月,我想这个版本 ( pip install -U opencv-contrib-python==3.4.2.16) 仍然有效。所以安装它并享受。

于 2020-06-05T06:52:27.173 回答
-1

尝试这个

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

于 2021-02-19T19:41:07.703 回答