2014-02-09 59 views
5

我试图运行通过的Ubuntu外壳的最简单的OpenCV的SIFT代码,没有运气SIFT()在OpenCV中不工作

我得到一个错误:

AttributeError: 'module' object has no attribute 'SURF'

代码:

import cv2 
cv2.SIFT() 

我的配置:

  • Ubuntu版本是13.10 64bit
  • “cv2。版“ 2.4.5
  • DIR输出(CV2)是(对于S只信)

    'scaleAdd', 'segmentMotion', 'sepFilter2D', 'setIdentity', 'setMouseCallback', 'setTrackbarPos', 'setUseOptimized', 'setWindowProperty', 'solve', 'solveCubic', 'solvePnP', 'solvePnPRansac', 'solvePoly', 'sort', 'sortIdx', 'split', 'sqrt', 'startWindowThread', 'stereoCalibrate', 'stereoRectify', 'stereoRectifyUncalibrated', 'subtract', 'sumElems'

+1

SIFT和SURF是非自由的,已获专利的算法。一些软件包管理者(例如debian)会给你一个cv2模块,但不包括它们。 – berak

+0

我有额外的配置 - Windows 7与python 2.7和opencv 2.4.6,其中我能够调用SIFT()使用终端和pyDev ...哪些lib导致它在此配置上工作? –

+1

lib将会是opencv_nonfree,但是如果你需要在linux上获得源代码,编译你自己的代码,并且你完成了,那么win上的预编译cv2.pyd可能是静态链接的(所以它已经包含了)。 – berak

回答

2

不这样做最平稳的方式,但它为我工作。

@Berak向我解释说,因为你可以观察关于我的问题的评论,SIFT算法以及FAST算法获得了专利,这意味着它们不是常规opencv安装的一部分。

因此,我搜索了一个python发行版,它将全部发布 - 我找到了一个。所以,我并没有真正解决问题,因为@Berak建议,或者我绕过它使用Python(x,y)

感谢您的帮助,

Ozrad

+0

“不是常规opencv安装的一部分。” - 没有常规的*二进制*分布。它包含在src中,并且PCA的维护者决定是否打包它。 – berak

1

我也有问题,在使用筛选,因为我只有OpenCV的。但是,安装ROS水电之后,我能够使用SIFT/SURF,因为他们来下nonfree的一部分。

0

我跟OpenCV的Python的Windows安装guide。我去尝试使用cv2.SIFT,发现它在这个安装中不可用。

完全removing python 2.7和openCV后,我安装了python(x,y)并包含了openCV。我得到
cv2。 版本
'2.4.8'

和: cv2.SIFT - > cv2.SURF

所以Python(X,Y)不包括SIFT,SURF模块。

+0

让我澄清一下:python在这里不是问题,问题是,非自由模块是否被编译到* cv2.pyd *中。 – berak

2

一个简单的代码,我发现SIFT

import cv2 
import numpy as np 

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

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

img=cv2.drawKeypoints(gray,kp) 

cv2.imwrite('sift_keypoints.jpg',img) 

而且我测试的代码,它的工作原理

1

这是推动我疯了,但从头开始的所有其他的建议,原来你现在可以得到SIFT和SURF只有两个终端命令!

  1. 一定有您的计算机上没有其他的OpenCV ...

    pip uninstall opencv-python 
    
  2. 然后得到的贡献版本(已SIFT和SURF +其他)...

    pip install opencv-contrib-python 
    

应该安装,但请注意,名称略有不同。

import cv2 
sift = cv2.xfeatures2d.SIFT_create() 

!!! PIP画中画万岁! (这只是一个双关语,不是代码的一部分)