描述子与匹配:从 BRIEF 到 ORB

核心02-特征与匹配预计 25 分钟描述子ORBBRIEF汉明距离匹配

前置知识点

kp-007 尺度空间与 SIFT

一句话定义

描述子把关键点邻域编码成固定长度向量(SIFT 的浮点 128 维,BRIEF/ORB 的 256 位二值串),匹配即在高维空间中找最近邻,ORB 用「旋转对齐 + 学习式选点」把二值描述子做到又快又稳。

为什么重要

特征点定位只解决「在哪」,描述子与匹配解决「两地是不是同一处」——SLAM 前端、AR 跟踪、拼接、物体识别全依赖这一步;ORB 因免专利、可在 CPU 上数百 FPS 运行,是嵌入式视觉的事实标准。

直观类比

关键点像地图上的红点,描述子是给每个红点写的「特征指纹卡」;匹配就是两份游客名单互相对指纹:浮点指纹用欧氏距离比相似度,二值指纹只需逐位异或数不同(汉明距离),后者恰好对应 CPU 的一条指令,快几十倍。

前置知识

kp-007(关键点、主方向、描述子概念)。

核心概念

原理与机制

BRIEF 每一位是一个符号函数:选一对像素 (p, q),若 I(p) < I(q) 记 1 否则记 0;256 个随机点对即得指纹。其抗噪弱点由 ORB 三方面修复:先用 FAST+主方向把比较点对整体旋转,消除旋转敏感;用统计方法从 205000 个候选点对里选出方差大、相关性低的 256 对,使每一位都「信息量大且互不冗余」;对描述子各位置做去均值处理降低亮度敏感性。匹配阶段用暴力法(小规模)或 FLANN/词袋索引(大规模);ratio test 依赖「正确匹配的最近邻会显著优于次近邻、错误匹配则两者接近」这一统计事实。

公式与模型

τ(p; x, y) = 1 若 I(p + x) < I(p + y),否则 0 f_BRIEF(p) = ( τ1, τ2, …, τ256 ) d_hamming(f1, f2) = popcount( f1 XOR f2 ) ratio test: d(f1, 最近邻) / d(f1, 次近邻) < 0.75

图示

实线为歧义匹配(最近邻与次近邻接近,被 ratio test 拒绝) 虚线为可靠匹配

实例与案例

无人机视觉定位:在算力受限机载板上用 ORB 跟踪地面特征,CPU 占用仅为 SIFT 的十分之一量级。图像去重与以图搜图:海量库用 ORB + 词袋倒排索引做粗筛。SLAM 前端(如 ORB-SLAM 系列)把 ORB 特征同时用于跟踪、建图与回环检测,是该描述子工程价值的最佳注脚。

import cv2
orb = cv2.ORB_create(nfeatures=1000, fastThreshold=20)
kps2, d2 = orb.detectAndCompute(gray2, None)
bf = cv2.BFMatcher(cv2.NORM_HAMMING)
good = [m for m, n in bf.knnMatch(d1, d2, k=2) if m.distance < 0.75 * n.distance]

常见误区

与其他知识点的关系

kp-009 对本站产出的匹配做几何清洗;kp-014 的 SLAM 前端、kp-023 的 Siamese 跟踪都以「稳定匹配」为起点;深度时代匹配可由 SuperPoint 等网络端到端学习,但工程默认仍是 ORB/SIFT。

自测题

  1. BRIEF 为什么快?快在哪一步?

答案要点:每位只是一次像素比较,距离是异或 + popcount,全部落在 CPU 原生指令上,无浮点乘加。

  1. ratio test 为什么能剔除歧义匹配?

答案要点:正确匹配的最近邻应显著近于次近邻;错误匹配时前两名距离接近,比值接近 1,据此拒绝。

  1. ORB 相对 BRIEF 补了哪三件事?

答案要点:主方向旋转对齐(旋转不变)、统计选点(区分度与低冗余)、描述子去均值(亮度稳健)。

延伸阅读

相关知识点

kp-023 单目标跟踪:相关滤波与 Siamesekp-014 三维重建与视觉 SLAM 概览