第四章:视觉特征提取与匹配(传统方法)
说到视觉定位,特征提取与匹配是绕不开的基础。我刚开始做SLAM那会儿,用的还是SIFT,那时候GPU还不普及,跑一帧图像要几百毫秒。现在回想起来,真是又慢又幸福——慢是因为算力有限,幸福是因为SIFT确实稳。
这一章,我们聊聊传统方法里的三剑客:SIFT、SURF、ORB。别觉得它们过时了,很多工业场景里,传统方法依然比深度学习靠谱。你想想看,一个嵌入式设备上跑深度学习特征提取,功耗和延迟都扛不住。
4.1 SIFT:尺度不变特征变换
SIFT是2004年Lowe提出的,到现在快20年了,依然是特征提取的标杆。它的核心思想很简单:在不同尺度空间里找极值点。
关键步骤:
- 尺度空间构建:用高斯金字塔模拟图像的多尺度
- 极值点检测:在DoG(高斯差分)空间找局部极值
- 关键点定位:去掉低对比度和边缘响应点
- 方向分配:统计梯度方向直方图,给每个点分配主方向
- 描述子生成:在16x16邻域内计算8方向梯度直方图,形成128维向量
我个人的经验:SIFT的128维描述子虽然鲁棒,但匹配时计算量很大。我在做三维重建项目时,5000个特征点暴力匹配要花1秒多。后来改用FLANN索引,速度提升了10倍。
4.2 SURF:加速版SIFT
SURF是SIFT的改进版,2006年提出。它用Hessian矩阵的行列式检测特征点,用Haar小波响应生成描述子。
SURF vs SIFT:
| 对比项 | SIFT | SURF |
|---|---|---|
| 检测方法 | DoG极值 | Hessian行列式 |
| 描述子维度 | 128维 | 64维(默认) |
| 旋转不变性 | 强 | 较强 |
| 速度 | 慢 | 快3-5倍 |
避坑指南:我曾经在纹理稀疏的场景里用SURF,结果特征点数量不够,导致匹配失败。后来我学乖了——纹理少的地方,优先用SIFT或者加大阈值。
4.3 ORB:实时应用的王者
ORB是2011年提出的,结合了FAST角点检测和BRIEF描述子。它的特点是快,非常快。在手机上跑30fps毫无压力。
ORB的核心改进:
- FAST角点:检测速度快,但缺乏方向信息
- rBRIEF描述子:在BRIEF基础上加入旋转不变性
- 二进制描述子:用汉明距离匹配,比欧氏距离快一个数量级
为什么ORB适合SLAM?因为SLAM需要实时性。我记得在ORB-SLAM2里,每帧提取1000个ORB特征点只需要20ms左右,而SIFT要200ms以上。
4.4 特征匹配:暴力匹配 vs FLANN
特征匹配说白了就是找两幅图像里最像的特征点对。有两种主流方法:
暴力匹配(Brute-Force):
- 原理:对每个特征点,计算与所有候选点的距离
- 复杂度:O(n²),n是特征点数量
- 适用场景:特征点少(<1000)或精度要求高
FLANN(快速最近邻搜索):
- 原理:构建KD树或LSH索引,加速搜索
- 复杂度:O(n log n)
- 适用场景:特征点多(>1000)或实时性要求高
注意:FLANN虽然快,但有时会漏掉正确的匹配。我建议在精度要求高的场景(比如三维重建)用暴力匹配+交叉验证,在实时场景(比如VIO)用FLANN。
4.5 对极几何与基础矩阵
对极几何描述的是两幅图像之间的几何约束。核心是基础矩阵F,它把左图的点映射到右图的极线上。
基础矩阵F的性质:
- 3x3矩阵,秩为2
- 自由度为7
- 满足极线约束:x'^T F x = 0
怎么求F?最常用的是八点法。我做过实验,在噪声大的场景里,八点法容易受外点影响。后来改用RANSAC+八点法,鲁棒性好了很多。
4.6 本质矩阵与单应矩阵
本质矩阵E:是基础矩阵在归一化坐标下的特例。它包含了相机的旋转和平移信息。
- E = t^× R
- 自由度为5(3旋转+3平移,去掉尺度)
- 用于已知内参的场景
单应矩阵H:描述的是平面场景下的点对应关系。
- H是3x3矩阵,自由度为8
- 当场景近似平面或相机纯旋转时,用H更合适
- 求解方法:DLT(直接线性变换)
我的选择策略:在SLAM初始化时,我会同时计算F和H,然后根据得分选择哪个模型更合适。如果场景是平面(比如桌面),H的得分会更高;如果是非平面场景,F更靠谱。
4.7 知识体系总览
下面这张图总结了本章的核心逻辑,从特征提取到几何约束,每一步都有对应的应用场景。
从这张图可以看出来,整个流程是串行的:先提取特征,再生成描述子,然后匹配,最后用几何约束求解位姿。每一步都有多种选择,具体用哪个取决于你的应用场景。
我的建议:如果你是做移动端SLAM,ORB+FLANN+单应矩阵初始化是个不错的组合。如果是做高精度三维重建,SIFT+暴力匹配+基础矩阵更靠谱。没有银弹,只有权衡。
好了,这一章的内容就到这里。特征提取与匹配是视觉定位的基石,理解透了,后面的深度学习方法和端到端定位才能学得更扎实。