OpenCV Python – 使用 ORB 和 BFmatcher 匹配两幅图像的关键点

opencvpythonserver side programmingprogramming

为了匹配两幅图像的关键点,我们使用 ORB(Oriented FAST 和 Rotated BRIEF)来检测和计算特征关键点和描述符,并使用 Brute Force 匹配器来匹配两幅图像中的描述符。

步骤

要使用 ORB 特征检测器和 Brute Force 匹配器匹配两幅图像的关键点,您可以按照以下步骤操作 -

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

  • 使用 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 特征检测器和 Brute Force 匹配器匹配两幅图像关键点的示例。

输入图像

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



示例

在此示例中,我们使用 ORB 算法检测两个输入图像的关键点和描述符,并使用 Brute Force 匹配器匹配描述符。我们还绘制了最佳的 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 算法检测两个输入图像的关键点和描述符,并使用 Brute Force 匹配器匹配描述符。我们还绘制了最佳的 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()

输出

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


请注意两个示例中输出图像中绘制的关键点之间的差异。


相关文章