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

7

我正在尝试使用特征匹配的代码,其中使用了SURF()函数。执行时出现错误,提示“AttributeError: 'module' object has no attribute 'SURF'”。

我该如何下载此模块以及修复Python(Windows)中的此错误?

4个回答

10
你可以尝试使用ORB(方向快速旋转特征)作为open cv中SURF的替代品。它几乎和SURF和SIFT一样好用,并且是免费的,而SIFT和SURF则被专利保护,不能商业使用。
你可以在opencv-python文档中了解更多信息这里

下面是示例代码,以供您参考

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()

1
它能在OpenCV 2.7或2.4中工作吗?因为我使用ORB时遇到了相同的错误。 - pallavi
我已经在OpenCV 3.0中使用过它。 - Ahmed
1
与此同时,几年后,openCV的聪明人们提出了另一个解决方案。实际上有两个,KAZE和AKAZE。值得一看。 - Kevin Kuyl
FYI,SIFT的专利已经过期,因此已从contrib存储库移动到主存储库。 https://answers.opencv.org/question/227302/what-is-the-patent-status-of-surfsift/ - Diarmaid O Cualain

0

首先

pip install opencv-contrib-python

然后使用这个技巧创建筛选对象

sift = cv2.xfeatures2d.SIFT_create()

我不知道那个...要试一下! - user1767754
1
SIFT 和 SURF 不再包含在 OpenCV 版本>= 3 中。 如果您想使用它们,必须手动编译带有contrib模块和打开 OPENCV_ENABLE_NONFREE CMake 标志的 OpenCV。 - dab0bby

0
根据此消息,SIFT专利已过期。 https://github.com/opencv/opencv/issues/16736[SIFT to main directory]1 SIFT现在应该已经被实现在主要的opencv存储库中了。至少cv.SIFT_create()初始化对我来说是有效的。我使用的是opencv版本4.5.5
示例用法与其他描述符或检测器的可能组合(替代detectAndCompute()函数)。
import cv2 as cv
MAX_FEATURES = 5500
GOOD_MATCH_PERCENT = 0.03

def find_matches(im1, im2, detector_type: str, descriptor_type: str):
    # Convert images to grayscale
    im1Gray = cv.cvtColor(im1, cv.COLOR_BGR2GRAY)
    im2Gray = cv.cvtColor(im2, cv.COLOR_BGR2GRAY)

    # init detector
    if detector_type == 'sift':
            detector = cv.SIFT_create(MAX_FEATURES)
    elif detector_type == 'fast':
            detector = cv.FastFeatureDetector_create()
    # ... ORB etc.
    # init descriptor
    if descriptor_type == 'sift':
            descriptor = cv.SIFT_create(MAX_FEATURES)

    keypoints1 = detector.detect(im1Gray, None)
    keypoints2 = detector.detect(im2Gray, None)

    # find descriptors with descriptor SIFT
    keypoints1, descriptors1 = descriptor.compute(im1Gray, keypoints1)
    keypoints2, descriptors2 = descriptor.compute(im2Gray, keypoints2)

    # BFMatcher object
    matcher = cv.BFMatcher(cv.NORM_L1, crossCheck=True)
    matches = list(matcher.match(descriptors1, descriptors2))

    # Sort matches by score
    matches.sort(key=lambda x: x.distance, reverse=False)
    # Remove not so good matches
    numGoodMatches = int(len(matches) * GOOD_MATCH_PERCENT)
    matches = matches[:numGoodMatches]

    # Draw top matches
    imMatches = cv.drawMatches(
        im1, keypoints1, im2, keypoints2, matches, None)
    cv.imwrite("matches.jpg", imMatches)

0
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接