原有环境配置:windows python3.8 opencv4.4.0
使用opencv实现SIFT和SURF算法的时候,代码疯狂报错,网上找了很多方法,这里做一个小小的总结,希望能帮助其他人少走一些弯路。
就opencv4.4.0这个版本来说,SIFT方法已经可以直接使用了,具体参考该博客:https://blog.csdn.net/Gordon_Wei/article/details/88920411
我们需要进行的改进是将:
cv2.xfeatures2d.SIFT_create()
改为:
cv2.SIFT_create()
其他函数的用法参考官方网站:https://docs.opencv.org/4.4.0/index.html
但是另一个问题出现了,SURF算法仍然无法使用,于是开始思考更换opencv的版本,但是在cmd中pip版本时显示无法找到该版本的opencv,查询之后发现python3.8与opencv3.4.2.16不匹配,于是在3.8的基础上又安装了python3.6,参考链接:https://blog.csdn.net/qq_38463737/article/details/109492394
个人认为,该博客的题目应改为 在已有python3.8的基础上安装python3.6
激活python3.6之后,在anaconda的控制台输入:
pip install opencv-python == 3.4.2.16
pip install opencv-contrib-python == 3.4.2.16
安装成功,截图如下:
接下来尝试运行SIFT和SURF算法进行特征点检测:
def sift(img):
start = time.time()
sift = cv2.xfeatures2d.SIFT_create()
keypoints = sift.detect(img, None)
img2 = img.copy()
img2 = cv2.drawKeypoints(img, keypoints, img2, color=(0,0,255))
end = time.time()
cv2.imshow('Detected SIFT keypoints', img2)
cv2.waitKey(0)
return end - start
def surf(img):
start = time.time()
surf = cv2.xfeatures2d.SURF_create()
keypoints = surf.detect(img, None)
img2 = img.copy()
img2 = cv2.drawKeypoints(img, keypoints, img2, color=(0,0,255))
end = time.time()
cv2.imshow('Detected SURF keypoints', img2)
cv2.waitKey(0)
return end - start
image = cv2.imread("test.jpg")
print('sift_time:', sift(image))
print('surf_time:', surf(image))
运行成功: