OpenCV Python – 使用 SIFT 实现两幅图像之间的特征匹配
我们使用尺度不变特征变换 (SIFT) 特征描述符和蛮力特征匹配器来实现两幅图像之间的特征匹配。SIFT用于查找图像中的特征关键点和描述符。蛮力匹配器用于匹配两幅图像中的描述符。
步骤
要使用SIFT特征检测器和蛮力匹配器实现两幅图像之间的特征匹配,您可以按照以下步骤操作:
导入所需的库OpenCV、Matplotlib和NumPy。确保您已安装它们。
使用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()
输出
执行后,它将产生以下输出:

数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP