简体   繁体   English

如何在 OpenCV for Python 中使用 surf 和 sift 检测器

[英]How to use surf and sift detector in OpenCV for Python

I was trying a code for feature matching which uses the function SURF().我正在尝试使用函数 SURF() 进行特征匹配的代码。 Upon execution it gives an error saying "AttributeError: 'module' object has no attribute 'SURF'".执行时它会给出一个错误,说“AttributeError:'module' object has no attribute 'SURF'”。

How can I download this module for Python (Windows) and fix this error?如何为 Python (Windows) 下载此模块并修复此错误?

You can try ORB (Oriented FAST and Rotated BRIEF) as an alternate to SURF in open cv.您可以在 open cv 中尝试ORB (Oriented FAST and Rotated Brief)作为 SURF 的替代。 It almost works as good as SURF and SIFT and it's free unlike SIFT and SURF which are patented and can't be used commercially.它几乎和 SURF 和 SIFT 一样好用,而且它是免费的,不像SIFTSURF专利的,不能用于商业用途。
You can read about it more in opencv-python documentation here您可以在此处的opencv-python 文档中了解更多信息

Here's the sample code for your ease这是为您提供方便的示例代码

import cv2
from matplotlib import pyplot as plt

img1 = cv2.imread('text.png',cv2.COLOR_BGR2GRAY) # queryImage
img2 = cv2.imread('original.png',cv2.COLOR_BGR2GRAY) # trainImage
# Initiate SIFT detector
orb = cv2.ORB_create()

# find the keypoints and descriptors with SIFT
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)
# create BFMatcher object
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# Match descriptors.
matches = bf.match(des1,des2)

# Sort them in the order of their distance.
matches = sorted(matches, key = lambda x:x.distance) 
# Draw first 10 matches.
img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:10],None, flags=2)

plt.imshow(img3),plt.show()

At first首先

pip install opencv-contrib-python

and then use this hack to create sift object然后使用此 hack 创建 sift 对象

sift = cv2.xfeatures2d.SIFT_create()
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('simple.jpg',0)
# Initiate FAST object with default values
fast = cv.FastFeatureDetector_create()
# find and draw the keypoints
kp = fast.detect(img,None)
img2 = cv.drawKeypoints(img, kp, None, color=(255,0,0))
# Print all default params
print( "Threshold: {}".format(fast.getThreshold()) )
print( "nonmaxSuppression:{}".format(fast.getNonmaxSuppression()) )
print( "neighborhood: {}".format(fast.getType()) )
print( "Total Keypoints with nonmaxSuppression: {}".format(len(kp)) )
cv.imwrite('fast_true.png',img2)
#Disable nonmaxSuppression
fast.setNonmaxSuppression(0)
kp = fast.detect(img,None)
print( "Total Keypoints without nonmaxSuppression: {}".format(len(kp)) )
img3 = cv.drawKeypoints(img, kp, None, color=(255,0,0))
cv.imwrite('fast_false.png',img3)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM