OpenCV Python – ORB和BFmatcher使用两个图像的关键点进行匹配
要匹配两个图像的关键点,我们使用 ORB (Oriented FAST and Rotated BRIEF)来检测和计算特征关键点和描述符,并使用 Brute Force 匹配器来匹配两个图像中的描述符。
步骤
要使用ORB特征检测器和Brute Force匹配器匹配两个图像的关键点,可以按照以下步骤进行 –
- 导入所需的库 OpenCV 、 Matplotlib 和 NumPy 。确保您已经安装了它们。
-
使用 cv2.imread() 方法读取两个输入图像作为灰度图像。指定图像的完整路径。
-
使用默认值初始化ORB对象 orb ,使用 orb=cv2.ORB_create() 。
-
使用 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 numpy as np
import cv2
from matplotlib import pyplot as plt
# 读入两张灰度图像
img1 = cv2.imread('left02.jpg',0)
img2 = cv2.imread('left14.jpg',0)
# 初始化ORB检测器
orb = cv2.ORB_create()
# 使用ORB算法检测和计算关键点和描述符
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)
# 创建BFMatcher对象
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# 匹配描述符
matches = bf.match(des1,des2)
# 打印(matches)
# 按照距离排序
matches = sorted(matches, key = lambda x:x.distance)
# 绘制前50次匹配
img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:50], None, flags=2)
plt.imshow(img3),plt.show()
输出结果
执行代码后,将会产生以下 输出结果 :
例子
在这个例子中,我们使用ORB算法检测和计算输入图像的关键点和描述符,并使用暴力匹配器匹配描述符。同时,我们绘制最好的50个关键点匹配。在这个例子中,我们传递了 flags=0 给 drawMatches() 函数来绘制匹配结果。
# 导入所需的库
import numpy as np
import cv2
import matplotlib.pyplot as plt
# 将两个输入图像读取为灰度图像
img1 = cv2.imread('left02.jpg', 0)
img2 = cv2.imread('left14.jpg', 0)
# 初始化ORB检测器
orb = cv2.ORB_create()
# 使用ORB检测并计算关键点和描述符
(kp1,des1) = orb.detectAndCompute(img1, None)
(kp2,des2) = orb.detectAndCompute(img2, None)
# 创建BFMatcher对象
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# 匹配描述符
matches = bf.match(des1,des2)
# 按距离排序。越短的距离越好
matches = sorted(matches, key=lambda val: val.distance)
# 绘制出前50个匹配点
out = cv2.drawMatches(img1, kp1, img2, kp2, matches[:50], None, flags=0)
plt.imshow(out), plt.show()
输出
在执行时,它将产生以下 输出 −
注意两个示例中绘制在输出图像中的关键点之间的差异。