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


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

步骤

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

  • 导入所需的库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特征检测器和蛮力匹配器匹配两幅图像的关键点。

输入图像

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



示例

在此示例中,我们使用SIFT算法检测两幅输入图像的关键点和描述符,并使用蛮力匹配器匹配描述符。我们还绘制了最佳的 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算法检测两幅输入图像的关键点和描述符,并使用基于蛮力匹配器以及knn匹配描述符。我们还绘制了最佳的 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()

输出

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


更新于: 2022-12-05

8K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.