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

问题描述 投票:0回答:4

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

如何下载适用于 Python (Windows) 的此模块并修复此错误?

python opencv surf
4个回答
10
投票

您可以尝试使用 ORB(Oriented FAST 和 Rotated Brief)作为 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()

一开始


pip install opencv-contrib-python

然后使用这个 hack 来创建 sift 对象

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)

根据
此来源

0
投票
cv.SIFT_create()
 init 对我有用。我有opencv版本
4.5.5

0
投票

与其他描述符或检测器可能组合的使用示例(替代 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)
    

© www.soinside.com 2019 - 2024. All rights reserved.