OpenCV Python – 使用ORB和BFmatcher匹配两张图像的关键点
为了匹配两张图像的关键点,我们使用ORB(Oriented FAST 和 Rotated BRIEF)来检测和计算特征关键点和描述符,并使用蛮力匹配器来匹配两张图像中的描述符。
步骤
要使用ORB特征检测器和蛮力匹配器匹配两张图像的关键点,您可以按照以下步骤操作:
导入所需的库OpenCV、Matplotlib和NumPy。确保您已经安装了它们。
使用cv2.imread()方法读取两张输入图像作为灰度图像。指定图像的完整路径。
使用orb=cv2.ORB_create()使用默认值初始化ORB对象orb。
使用orb.detectAndCompute()检测并计算两张输入图像中的关键点'kp1'和'kp2'以及描述符'des1'和'des2'。
创建一个BFmatcher对象,如bf = cv2.BFMatcher(),并使用此BFmatcher对象匹配描述符,如bf.match(des1, des2)。它返回匹配项。按距离顺序对匹配项进行排序。
使用cv2.drawMatches()在原始输入图像上绘制匹配项。
可视化关键点匹配。
让我们看一些使用ORB特征检测器和蛮力匹配器匹配两张图像的关键点的示例。
输入图像
我们在下面的示例中使用以下图像作为输入文件。
示例
在此示例中,我们使用ORB算法检测两张输入图像的关键点和描述符,并使用蛮力匹配器匹配描述符。我们还绘制了最佳的50个关键点匹配。在此示例中,我们将flags=2传递给drawMatches()以绘制匹配项。
# import required libraries import numpy as np import cv2 from matplotlib import pyplot as plt # read two input images as grayscale img1 = cv2.imread('left02.jpg',0) img2 = cv2.imread('left14.jpg',0) # Initiate ORB detector orb = cv2.ORB_create() # detect and compute the keypoints and descriptors with ORB 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) # print(matches) # Sort them in the order of their distance. matches = sorted(matches, key = lambda x:x.distance) # Draw first 50 matches. img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:50], None, flags=2) plt.imshow(img3),plt.show()
输出
执行后,将产生以下输出:
示例
在此示例中,我们使用ORB算法检测两张输入图像的关键点和描述符,并使用蛮力匹配器匹配描述符。我们还绘制了最佳的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('left02.jpg', 0) img2 = cv2.imread('left14.jpg', 0) # Initiate ORB detector orb = cv2.ORB_create() # detect and compute the keypoints and descriptors with ORB (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. Least distance is better matches = sorted(matches, key=lambda val: val.distance) # Draw first 50 matches. out = cv2.drawMatches(img1, kp1, img2, kp2, matches[:50], None, flags=0) plt.imshow(out), plt.show()
输出
执行后,将产生以下输出:
请注意两个示例中输出图像中绘制的关键点之间的差异。