第四章:图像特征提取与匹配
图像特征提取与匹配,说白了就是让机器人「看懂」两张图片是不是同一个地方。我做了这么多年SLAM,觉得这步是整套系统的基石。特征找不准,后面的位姿估计、地图构建全是空中楼阁。
今天咱们就聊聊SIFT、SURF、ORB这三种经典特征,以及怎么把它们匹配好、怎么剔除误匹配、最后怎么用词袋模型做回环检测。
4.1 特征点:图像里的「地标」
你想想看,人是怎么认路的?我们会记住路口的招牌、建筑物的轮廓、甚至墙上的涂鸦。对机器人来说,特征点就是这些「地标」。
一个靠谱的特征点,得满足两个条件:重复性和独特性。重复性是说,换个角度、换个光照,还能找到它。独特性是说,这个点得跟周围不一样,别跟谁都长得像。
我早期做项目时吃过亏——在纹理稀疏的走廊里,特征点提取得稀稀拉拉,结果匹配时全是误匹配。后来我学乖了,场景越单调,越要选对特征提取器。
4.2 SIFT:祖师爷级别的特征
SIFT(Scale-Invariant Feature Transform)是2004年Lowe提出的,算是特征提取界的「老前辈」。它的核心思想很简单:在不同尺度空间里找极值点。
具体流程是这样的:
- 尺度空间构建:用高斯金字塔生成不同模糊程度的图像
- 极值点检测:在DoG(Difference of Gaussian)空间找局部极值
- 关键点定位:去掉低对比度的点和边缘响应点
- 方向分配:统计梯度方向,给每个点分配主方向
- 描述子生成:在16×16邻域内统计8方向梯度直方图,生成128维向量
SIFT的优势:对旋转、尺度、光照变化都有很强的鲁棒性。我在一个户外大场景的项目里用过,即使光照从正午变成黄昏,匹配率依然能保持在85%以上。
注意:SIFT是有专利的,商用项目要小心。另外它的计算量很大,在嵌入式设备上跑实时SLAM基本不现实。
4.3 SURF:SIFT的加速版
SURF(Speeded-Up Robust Features)是2006年提出的,说白了就是SIFT的「优化版」。它用积分图像和Hessian矩阵来加速特征检测,描述子也从128维降到了64维。
我记得第一次在笔记本上对比SIFT和SURF,同样一张640×480的图,SIFT要跑200ms,SURF只要80ms。虽然精度稍微降了一点,但实时性提升很明显。
SURF的核心改进:
- 用盒状滤波器近似高斯二阶偏导
- 用积分图像加速卷积计算
- 描述子基于Haar小波响应
不过说实话,现在SURF用得也不多了。ORB出来后,大家更倾向于用那个。
4.4 ORB:实时SLAM的标配
ORB(Oriented FAST and Rotated BRIEF)是2011年提出的,它把FAST角点检测和BRIEF描述子结合了起来,还加了旋转不变性。
为什么ORB在SLAM里这么火?原因很简单:快。我实测过,同样提取1000个特征点,ORB比SIFT快两个数量级。在ORB-SLAM2里,每帧图像的特征提取加匹配,总共也就20-30ms。
ORB的流程:
- 用FAST检测角点(设定阈值,比较周围16个像素)
- 用Harris角点响应排序,保留Top N
- 计算灰度质心,确定主方向
- 用rBRIEF生成二进制描述子(256位)
我的经验:ORB的阈值设置很关键。阈值设得太低,特征点太多、质量差;设得太高,特征点太少、匹配不够。我一般从20开始调,根据场景纹理丰富程度上下浮动。
4.5 特征匹配与误匹配剔除
特征提取完了,接下来就是匹配。最常用的方法是暴力匹配(Brute-Force Matcher)和快速近似最近邻(FLANN)。
暴力匹配就是穷举——每个特征跟另一张图的所有特征算距离。FLANN用KD-Tree或LSH来加速,适合大规模匹配。
但不管用哪种方法,误匹配都是难免的。为什么会这样?因为场景里可能有重复纹理、运动模糊、或者光照变化太大。
这时候就该RANSAC登场了。
RANSAC:误匹配的「清道夫」
RANSAC(Random Sample Consensus)的核心思想是:从匹配点对里随机采样,拟合一个几何模型(比如单应矩阵或基础矩阵),然后看哪些点符合这个模型。
具体步骤:
- 随机选4对匹配点(计算单应矩阵需要4对)
- 用这4对点计算变换矩阵H
- 用H检验所有匹配点,统计内点数量
- 重复N次,保留内点最多的那次结果
- 用所有内点重新优化H
避坑指南:我曾经在一个纹理重复的仓库里做匹配,RANSAC迭代次数设了100次,结果内点率只有30%。后来我把迭代次数提到500次,阈值从3像素调到5像素,内点率才升到70%。记住:迭代次数和阈值要根据场景调,别死用默认值。
4.6 词袋模型与回环检测
回环检测是SLAM里最性感的问题之一。机器人走了一圈,怎么知道自己回到了原点?
词袋模型(Bag of Words, BoW)就是干这个的。它的思路很简单:把图像看成「视觉单词」的集合,通过比较单词出现的频率来判断两张图是否相似。
BoW的构建流程
- 离线训练:用大量图像提取特征,用K-means聚类生成视觉词典
- 图像编码:对每张图,统计每个视觉单词出现的频率,生成词频向量
- 相似度计算:用TF-IDF加权,计算两个词频向量的相似度
- 回环判定:相似度超过阈值,且通过几何验证,就认为是回环
在ORB-SLAM2里,用的就是DBoW2库。它用树状结构组织视觉词典,查询效率很高。我记得有一次在室内场景测试,回环检测的准确率能达到95%以上,召回率也有80%。
注意:词袋模型有个问题——它只关心「有没有」,不关心「在哪里」。所以两张图可能有相似的单词分布,但实际位置完全不同。这就是所谓的「感知歧义」。解决办法是加上几何验证,比如用RANSAC检查匹配点是否满足对极约束。
4.7 知识体系总览
下面这张图把本章的核心逻辑串起来了。从特征提取到匹配,再到回环检测,每一步都有对应的算法和注意事项。
4.8 实践建议
最后给几点我个人的建议:
- 选特征看场景:纹理丰富用ORB,纹理稀疏用SIFT,实时性要求高无脑选ORB
- 匹配别偷懒:暴力匹配虽然慢,但精度高。FLANN适合大规模匹配,但参数要调好
- RANSAC阈值要调:室内小场景用3像素,室外大场景可以放宽到5-8像素
- 回环检测要加验证:别光看词袋相似度,一定要做几何验证,不然容易误检
嗯,这一章的内容就到这儿。特征提取与匹配是SLAM的「眼睛」,眼睛不好使,后面再牛的算法也白搭。下一章咱们聊聊更深入的话题。