暴力匹配
在关键点计算之后,特征描述符用于详细描绘关键点及其周边像素的信息。这种描述不仅涵盖了关键点本身,还包括了对其有贡献的周围像素点,从而为后续的目标匹配提供依据,并增强了关键点在不同条件下的不变性,例如光照和视角的变化。
暴力匹配是一种直观且直接的方法,通过遍历所有特征点的描述符,计算彼此间的距离,进而根据距离排序,最终选择距离最小的特征点作为匹配对象。尽管这种方法易于理解,但当特征点数量庞大时,其计算成本会显著增加。暴力匹配的主要流程包括:
- 特征点检测:利用SIFT、SURF、ORB等算法,在图像中识别出关键点。这些关键点往往位于图像的显著位置,比如角落或边缘。
- 特征描述:针对每一个识别到的关键点,计算其周围的像素特征描述符。这些描述符是一系列向量,旨在描述关键点附近的图像信息。常用的特征描述算法有SIFT、SURF和ORB等。
- 特征匹配:将一组特征点的描述符与另一组进行对比,通常通过计算描述符之间的距离(如欧氏距离或汉明距离),选取距离最近的特征点作为匹配对象。
- 匹配筛选:对初步匹配结果进行筛选和排序,一般按照距离进行排序,挑选出距离最短的特征点作为最优匹配点。此外,可以通过设置阈值或其他方法排除不稳定的匹配。
- 匹配验证和优化:进一步验证和优化匹配结果,例如采用RANSAC算法进行模型拟合和异常点剔除,以增强匹配的准确性和稳定性。
ORB算法
ORB(Oriented FAST and Rotated BRIEF)算法由Rublee等人在2011年提出,该算法结合了FAST关键点检测器和BRIEF描述符的优点,具有以下特点:
- 计算效率高:与SIFT/SURF相比,ORB在保持旋转不变性的同时,计算速度提升了10至100倍。
- 良好的抗噪能力:通过多尺度金字塔和方向校正技术,提高了特征的稳定性。
- 开源且免费:基于BSD许可,无专利限制,便于广泛使用。
ORB_Create
ORB算法可通过调用cv2.ORB_create()函数进行初始化,其主要参数包括:
orb = cv2.ORB_create(
nfeatures=500, # 最大保留特征点数量
scaleFactor=1.2, # 图像金字塔的缩放比例
nlevels=8, # 金字塔层数
edgeThreshold=31, # 边缘剔除阈值
firstLevel=0, # 金字塔起始层
WTA_K=2, # 生成描述符时使用的点对数
scoreType=cv2.ORB_HARRIS_SCORE, # 关键点的评分方式
patchSize=31 # 计算描述符的区域大小
)
该函数通过构建图像金字塔实现尺度不变性,关键参数有金字塔层数(nlevels)、缩放比例(scaleFactor)和起始层(firstLevel)。
金字塔构建原理
- 缩放比例(scaleFactor):决定每层金字塔的分辨率下降比例,通常设置为1.2,意味着每层图像尺寸为上一层的1/1.2。
- 层级数(nlevels):设定金字塔的总层数,默认为8层,覆盖从原始图像到1/16分辨率的多尺度特征检测。
- 起始层级(firstLevel):指定金字塔的起始层,默认值为0,即从原始图像开始构建。
关键点检测
在每一层金字塔中独立执行FAST角点检测,确保能够捕捉到不同尺寸的特征,并将检测到的关键点位置和尺度映射回原始图像坐标系,支持跨尺度匹配。
角点检测实现
FAST关键点检测的核心在于通过比较中心像素与其周围16个像素的亮度差异来快速识别角点。若连续N个相邻像素的亮度差超过阈值T,则认为该点为角点。在OpenCV中,默认N=12(即FAST-12)。
为了实现旋转不变性,ORB算法采用灰度质心法(Intensity Centroid)计算特征点的方向。具体步骤如下:
- 定义矩:对于以特征点为中心的小图像块B,计算其矩
,其中
表示像素的灰度值。 - 计算质心:质心C的坐标为
,其中
为图像块的总灰度值。 - 确定方向:连接图像块的几何中心O与质心C,方向向量
的角度
即为特征点的主方向。 - 旋转不变性的实现:在生成rBRIEF描述符之前,根据主方向
旋转特征点领域内的采样点对坐标系,使得描述符对图像旋转具备鲁棒性。
检测特征点与描述符
通过调用orb.detectAndCompute(src, mask)函数,可以同时检测图像中的关键点并计算相应的描述符。该函数接受两个参数:
源图像作为输入,可以是灰度或彩色图像。
掩模图像用于定义感兴趣的区域。仅当掩模图像中相应位置的值非零时,才执行特征检测和描述符计算。
该函数返回两个值:
- 关键点:检测到的关键点列表,每个关键点包括其在图像中的坐标及其他属性。
- 描述符:关键点的描述符矩阵,每行代表一个关键点的描述符。
暴力匹配器
创建BFMatcher对象
cv2.BFMatcher_create(normType, crossCheck) 的两个参数分别为:
- normType:可选参数,指定距离度量的类型。默认值为
cv2.NORM_L2,即使用欧氏距离;也可以选择cv2.NORM_L1、cv2.NORM_HAMMING或cv2.NORM_HAMMING2等其他类型。 - crossCheck:可选参数,指示是否执行交叉验证。默认值为
False,表示不执行交叉验证。若设为True,则只有当两个特征点的最佳匹配互为最近邻时,才视为匹配成功。
该函数返回一个暴力匹配器对象,可用于执行特征匹配。
匹配描述符
bf.match(queryDescriptors, trainDescriptors) 的两个参数分别为:
- queryDescriptors:需匹配的图像特征向量。
- trainDescriptors:目标匹配的图像特征向量。
bf.match 的返回值是一个 DMatch 对象列表,每个 DMatch 包含以下属性:
- queryIdx:特征点在其所在图像中的索引。
- trainIdx:匹配特征点在另一图像中的索引。
- distance:描述符间的欧氏距离(数值越小,匹配度越高)。
绘制匹配结果
cv2.drawMatches(src1, kp1, src2, kp2, match, matchMask, flags) 的参数解释如下:
- src1:第一张图像,通常是查询图像或原始图像。
- kp1:第一张图像的关键点列表。
- src2:第二张图像,通常是训练图像或匹配图像。
- kp2:第二张图像的关键点列表。
- match:匹配结果列表,包含匹配的特征点对。
- matchesMask:确定绘制哪些匹配,为空则绘制所有匹配。
- flags:指定绘图选项的标志位。
可用的标志位包括:
cv.DRAW_MATCHES_FLAGS_DEFAULT:默认的绘制模式,将在输出图像上为每个关键点绘制一个小圆圈,圆心即为特征点的位置。cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:此模式下,每个关键点将被绘制成带有大小和方向信息的圆圈,以更详细地展示特征点的属性。cv.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:使用此标志时,函数不会创建新的输出图像矩阵,而是在现有图像上直接绘制。cv.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:启用此标志后,未配对的单个特征点将不会被绘制。


雷达卡


京公网安备 11010802022788号







