OpenCV Python – 使用 SIFT 实现两幅图像之间的特征匹配

opencvpythonserver side programmingprogramming

我们使用尺度不变特征变换 (SIFT) 特征描述符和 Brute Force 特征匹配器来实现两幅图像之间的特征匹配。SIFT 用于查找图像中的特征关键点和描述符。Brute Force 匹配器用于匹配两幅图像中的描述符。

步骤

要使用 SIFT 特征检测器和 Brute Force 匹配器实现两幅图像之间的特征匹配,您可以按照以下步骤操作 -

  • 导入所需的库 OpenCV、MatplotlibNumPy。确保您已经安装了它们。

  • 使用 cv2.imread() 方法将两个输入图像读取为灰度图像。指定图像的完整路径。

  • 使用 sift=cv2.SIFT_create() 以默认值启动 SIFT 对象。

  • 使用 sift.detectAndCompute() 检测并计算两个输入图像中的关键点 'kp1' 和 'kp2' 以及描述符 'des1' 和 'des2'。

  • 创建 BFmatcher 对象 bf = cv2.BFMatcher() 并使用此 BFmatcher 对象作为 bf.match(des1, des2) 匹配描述符。它返回匹配项。根据距离对匹配项进行排序。

  • 使用 cv2.drawMatches() 在原始输入图像上绘制匹配项。

  • 我们也可以选择性地使用 BFmatcher 对象方法 bf.knnMatch(des1,des2, k=2) 匹配描述符。对匹配项应用比率测试以获得最佳匹配项。使用 cv2.drawMatchesKnn() 绘制匹配项。

  • 可视化关键点匹配项。

让我们看一些使用 SIFT 特征检测器和 Brute Force 匹配器匹配两幅图像关键点的示例。

输入图像

我们在以下示例中使用以下图像作为输入文件。



示例

在此示例中,我们使用 SIFT 算法检测两个输入图像的关键点和描述符,并使用 Brute Force 匹配器匹配描述符。我们还绘制了最佳的 50 个关键点匹配。在此示例中,我们将 flags=2 传递给 drawMatches() 以绘制匹配。

# import required libraries import numpy as np import cv2 import matplotlib.pyplot as plt # read two input images as grayscale img1 = cv2.imread('bmw.jpg',0) img2 = cv2.imread('bmw-rotated.jpg',0) # Initiate SIFT detector sift = cv2.SIFT_create() # detect and compute the keypoints and descriptors with SIFT kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = sift.detectAndCompute(img2,None) # create BFMatcher object bf = cv2.BFMatcher() # Match descriptors. matches = bf.match(des1,des2) # sort the matches based on distance matches = sorted(matches, key=lambda val: val.distance) # Draw first 50 matches. out = cv2.drawMatches(img1, kp1, img2, kp2, matches[:50], None, flags=2) plt.imshow(out), plt.show()

输出

执行时,它将产生以下输出


示例

在此示例中,我们使用 SIFT 算法检测两个输入图像的关键点和描述符,并使用基于 Brute Forcematcherknn 匹配描述符。我们还绘制了最佳的 50 个关键点匹配。在此示例中,我们将 flags=0 传递给 drawMatches() 以绘制匹配。

# import required libraries import numpy as np import cv2 import matplotlib.pyplot as plt # read two input images as grayscale img1 = cv2.imread('bmw.jpg',0) # queryImage img2 = cv2.imread('bmd-rotated.jpg',0) # trainImage # Initiate SIFT detector sift = cv2.SIFT_create() # detect and compute the keypoints and descriptors with SIFT kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = sift.detectAndCompute(img2,None) # create BFMatcher object bf = cv2.BFMatcher() matches = bf.knnMatch(des1,des2, k=2) # Apply ratio test good = [] for m,n in matches: if m.distance < 0.1*n.distance: good.append([m]) # cv2.drawMatchesKnn expects a list of lists as matches. img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=0) plt.imshow(img3),plt.show()

输出

执行时,它将产生以下输出



相关文章