在 Python-OpenCV 中使用 ORB 算法进行特征匹配
ORB是 FAST 关键点检测器和 Brief 描述符的融合,并添加了一些功能以提高性能。 FAST是来自 Accelerated Segment Test的特征,用于从提供的图像中检测特征。它还使用金字塔来产生多尺度特征。现在它不计算特征的方向和描述符,所以这就是 BRIEF 发挥作用的地方。
ORB 使用BRIEF 描述符,但由于BRIEF 在旋转方面表现不佳。所以ORB所做的就是根据关键点的方向旋转BRIEF。使用补丁的方向,找到它的旋转矩阵并旋转BRIEF以获得旋转版本。 ORB 是用于特征提取、计算成本、匹配性能和主要专利方面的 SIFT 或 SURF 算法的有效替代方案。 SIFT 和 SURF 已获得专利,您应该为其使用付费。但 ORB 没有专利。
在本教程中,我们将学习如何找到图像中的特征并将它们与连续视频中的其他图像进行匹配。
算法
- 获取查询图像并将其转换为灰度。
- 现在初始化 ORB 检测器并检测查询图像和场景中的关键点。
- 计算属于两个图像的描述符。
- 使用蛮力匹配器匹配关键点。
- 显示匹配的图像。
下面是实现。
输入图像:
Python3
import numpy as np
import cv2
# Read the query image as query_img
# and train image This query image
# is what you need to find in train image
# Save it in the same directory
# with the name image.jpg
query_img = cv2.imread('query.jpg')
train_img = cv2.imread('train.jpg')
# Convert it to grayscale
query_img_bw = cv2.cvtColor(query_img,cv2.COLOR_BGR2GRAY)
train_img_bw = cv2.cvtColor(train_img, cv2.COLOR_BGR2GRAY)
# Initialize the ORB detector algorithm
orb = cv2.ORB_create()
# Now detect the keypoints and compute
# the descriptors for the query image
# and train image
queryKeypoints, queryDescriptors = orb.detectAndCompute(query_img_bw,None)
trainKeypoints, trainDescriptors = orb.detectAndCompute(train_img_bw,None)
# Initialize the Matcher for matching
# the keypoints and then match the
# keypoints
matcher = cv2.BFMatcher()
matches = matcher.match(queryDescriptors,trainDescriptors)
# draw the matches to the final image
# containing both the images the drawMatches()
# function takes both images and keypoints
# and outputs the matched query image with
# its train image
final_img = cv2.drawMatches(query_img, queryKeypoints,
train_img, trainKeypoints, matches[:20],None)
final_img = cv2.resize(final_img, (1000,650))
# Show the final image
cv2.imshow("Matches", final_img)
cv2.waitKey(3000)
输出: