第四章:视觉特征提取与匹配(传统方法)

说到视觉定位,特征提取与匹配是绕不开的基础。我刚开始做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 知识体系总览

下面这张图总结了本章的核心逻辑,从特征提取到几何约束,每一步都有对应的应用场景。

视觉特征提取与匹配知识体系 特征提取 特征描述 特征匹配 SIFT:尺度空间极值 SURF:Hessian行列式 ORB:FAST + rBRIEF 128维梯度直方图 64维Haar小波 256位二进制串 暴力匹配 FLANN快速搜索 汉明距离 几何约束 对极几何 | 基础矩阵F | 本质矩阵E | 单应矩阵H 相机位姿估计 三维重建 视觉SLAM初始化

从这张图可以看出来,整个流程是串行的:先提取特征,再生成描述子,然后匹配,最后用几何约束求解位姿。每一步都有多种选择,具体用哪个取决于你的应用场景。

我的建议:如果你是做移动端SLAM,ORB+FLANN+单应矩阵初始化是个不错的组合。如果是做高精度三维重建,SIFT+暴力匹配+基础矩阵更靠谱。没有银弹,只有权衡。

好了,这一章的内容就到这里。特征提取与匹配是视觉定位的基石,理解透了,后面的深度学习方法和端到端定位才能学得更扎实。

专注资料整理