我试图在Ubuntu的shell中运行最简单的opencv SIFT代码,但没有成功。
我得到一个错误。
AttributeError: 'module' object has no attribute 'SURF'
代码:
import cv2
cv2.SIFT()
我的配置:
cv2.__version__
是2.4.5'scaleAdd', 'segmentMotion', 'sepFilter2D', 'setIdentity', 'setMouseCallback', 'setTrackbarPos', 'setUseOptimized', 'setWindowProperty', 'solve', 'solveCubic', 'solvePnP'。 'solvePnPRansac', 'solvePoly', 'sort', 'sortIdx', 'split', 'sqrt', 'startWindowThread', 'stereoCalibrate', 'stereoRectify', 'stereoRectifyUncalibrated', 'subtract', 'sumElems' 。
import cv2
sift = cv2.SIFT()
如果你使用的是opencv 3.0或更高版本,这段代码将不起作用。
sift = cv2.xfeatures2d.SIFT_create()
(Only works if you have installed opencv-contrib-python library )
如果你有一个opencv-contrib-python版本> 3.4,那么在不同的 erro下,它将无法工作。
错误。OpenCV(4.1.0) C:\projects\opencv-python\opencv_contrib\modules\xfeatures2d\src\sift.cpp:1207: error: (-213:functionfeature没有实现) 该算法已获专利,在此配置中被排除在外。在函数'cv::xfeatures2d::SIFT::create'中设置 OPENCV_ENABLE_NONFREE CMake 选项并重建库。
最好的解决办法是。
**step 1: pip uninstall opencv-python**
**step 2: pip install opencv-contrib-python==3.4.2.16**
这对我很有效
注:如果你没有使用pip install opencv-python安装opencv,只需删除下载的库,然后按照上面的说明操作即可。
虽然不是最顺畅的方法,但对我来说是有效的。
正如你在我的问题评论中所看到的那样,@Berak 向我解释说,SIFT 算法和 FAST 算法都是专利,这意味着它们不是常规 opencv 安装的一部分。
因此,我搜索了一个python发行版,它将拥有这一切--我找到了一个。所以,我并没有像 @Berak 建议的那样真正解决这个问题,而是使用了 Python(x,y)
谢谢你的帮助。
Ozrad
这是让我疯狂的,但刮所有其他的建议,原来你现在可以得到SIFT和SURF只需两个终端命令!确保你的电脑没有其他opencv。
确保你的电脑上没有其他opencv......
pip uninstall opencv-python
然后得到贡献版(有SIFT和SURF+其他)......
pip install opencv-contrib-python
它应该安装,但注意名字有点不同。
import cv2
sift = cv2.xfeatures2d.SIFT_create()
!!!!Pip pip hurray!! (这只是一个双关语,不是代码的一部分)
我在使用SIFt时也有问题,因为我只有openCV。但是在安装了ROS Hydro之后,我就可以使用SIFTSURF了,因为它们属于非自由部分。
我为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)
我测试了代码,它的工作
你可以很容易地使用它,如下。
sift = cv2.xfeatures2d_SIFT()
keypoints_detector = sift.detect(image=your_grayscale_image, mask=None)