news 2026/10/21 22:04:20

视觉SLAM第7讲|特征点法、对极几何与位姿求解全梳理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
视觉SLAM第7讲|特征点法、对极几何与位姿求解全梳理

视觉SLAM第7讲|视觉里程计(上):特征点法、对极几何与位姿求解全梳理

如果说前面几讲的刚体运动、李群李代数是SLAM的「数学工具包」,那从这一讲开始,我们就正式进入视觉SLAM的核心前端模块——视觉里程计(Visual Odometry, VO)。

简单说,VO的任务就是:输入相邻两帧图像,输出这两帧之间相机的运动。第7讲聚焦最经典、落地性最强的特征点法VO,从特征提取匹配,到对极几何、PnP、ICP,把两帧图像求解相机运动的主流方案一次性讲透。


一、特征点法:先找「标志性像素」再算运动

直接拿整幅图像算运动?像素量太大、光照变化、物体形变都会让结果崩掉。工程界的成熟做法是:先从图像里挑一批「辨识度高、不容易随光照视角变化」的点,靠这些点来算运动。这些点就叫特征点。

1.1 特征点的两个核心部分

  • 关键点(KeyPoint):这个点在图像里的位置、尺度、方向。相当于「地标在哪」。
  • 描述子(Descriptor):这个点周围像素的特征编码,相当于这个地标的「身份证」。两个点描述子越相似,是同一个空间点的概率就越高。

💡通俗解释:就像你在城市里导航,不靠看整条街的每一块砖,只靠几个标志性路口、大楼就能判断自己的位置和运动。特征点就是图像里的「标志性建筑」,大幅压缩计算量,还提升了鲁棒性。

1.2 ORB特征:速度与平衡的王者

ORB全称Oriented FAST and Rotated BRIEF,是目前SLAM领域最常用的实时特征,没有之一。

  1. FAST角点检测
    原理非常直观:比较中心点和周围一圈像素的灰度差,如果有足够多的像素和中心点差值超过阈值,就判定为角点。
    最大优点:极快,适合实时场景;缺点:原生FAST没有方向、没有尺度不变性。
图1:FAST特征点
  1. ORB的改进
    用灰度质心法给每个角点计算主方向,再用图像金字塔做多尺度检测,让ORB具备了旋转不变性和尺度不变性。
图2:使用金字塔可以匹配不同缩放倍率下的图像
  1. BRIEF二进制描述子
    用256位0/1二进制串描述一个特征点。匹配时直接算汉明距离(不同位的数量),速度比浮点描述子快一个数量级。

💡经验之谈:ORB不是精度最高的特征,但一定是同算力下性价比最高的。ORB-SLAM系列能稳定实时运行,很大程度上就是选对了ORB这个特征。

1.3 特征匹配:把两帧的同一个点对上

图3:两帧图像间的特征匹配

匹配就是在两帧特征点里,找出对应同一个空间点的点对。

  • 暴力匹配:逐个计算描述子距离,找最近的那个。精度高但速度慢,特征点少的时候用。
  • FLANN快速匹配:近似最近邻算法,特征点数量大的时候速度优势明显。
  • 匹配筛选:这步比匹配本身还重要。常用比率测试(最近距离/次近邻距离 < 阈值)、交叉匹配,剔除大量误匹配。

💡踩坑提示:匹配不是越多越好。一堆错误的匹配对,会把后面的运动求解直接带偏。优质的几十对匹配,远好于劣质的几百对。

1.4 实践环节

本讲代码演示了两种实现:

  1. 调用OpenCV内置API提取ORB特征、完成匹配;
  2. 手写实现FAST角点检测和BRIEF描述子,从底层理解特征是怎么来的。

二、2D-2D 对极几何:单目两帧算运动的核心

当我们只有两帧单目图像、没有任何先验三维信息时,靠对极几何就能算出相机的相对运动。这是单目VO最底层的理论基础。

2.1 对极约束:五点共面的几何本质

两个相机光心O₁、O₂,空间点P,两帧成像点x₁、x₂,这五个点一定在同一个平面(对极平面)上。这个约束就是对极约束。

图4:对极几何约束

写成矩阵形式就是:
x₂的转置 · E · x₁ = 0

其中:

  • x₁, x₂:两帧点的归一化坐标(像素坐标去掉内参,投影到z=1归一化平面)

💡通俗解释:归一化坐标,就是把像素坐标换算到相机前方1米虚拟平面上的坐标,消除相机镜头焦距的影响。

  • E:本质矩阵(Essential Matrix),只和相机的相对位姿R(旋转)、t(平移)有关。

2.2 本质矩阵:性质与求解

  • 本质矩阵是3×3矩阵,秩为2,共5个自由度(旋转3个+平移3个,减去1个尺度不确定性)。

💡通俗解释:自由度代表未知量个数。旋转有3个自由度,平移有3个自由度,但单目相机只能判断平移方向,无法判断距离长短,所以减掉1个自由度。

  • 求解方法:八点法,用8对匹配点就可以线性解出本质矩阵。

💡通俗解释:凑齐8组匹配好的特征点,列方程组直接解出E矩阵。

  • 分解:从本质矩阵里可以分解出相机的旋转R和平移t,一共4组解,只有一组深度全为正,就是正确解。

💡经典问题:单目的尺度不确定性
本质矩阵只能确定平移的方向,不能确定长度。你把轨迹和地图同时放大2倍,对极约束依然成立。这是单目天生的问题,所以实际系统里要么用双目/深度相机定尺度,要么用IMU融合恢复尺度。
💡通俗解释:单目相机分不清,是物体离得远尺寸大,还是物体离得近尺寸小,没法直接知道真实距离。

2.3 单应矩阵:平面场景的专属变换

当场景中大部分点都落在同一个平面上(比如地面、墙面),两帧之间的像素变换可以用单应矩阵(Homography)H描述:
x₂ = H · x₁

单应矩阵也是3×3,8个自由度,用四点法即可求解。

💡应用场景:

  1. 纯旋转运动、或者场景是平面时,用单应分解位姿比本质矩阵更稳;
  2. 工程里通常E和H同时算,最后选重投影误差小的那个结果。

2.4 实践:对极约束求解相机运动

代码中演示了两种实现:

  1. 调用OpenCV的findEssentialMat + recoverPose一键求解;
  2. 手写八点法求解本质矩阵,再手动分解出R和t,验证结果。

三、三角测量:算出空间点的三维坐标

算出了相机相对运动,怎么得到特征点的三维坐标?靠三角测量。

原理很直观:两个相机光心分别向各自的成像点作射线,两条射线的交点就是空间点的三维位置。
理想情况下两条射线严格相交;实际有噪声,两条线不相交,就用最小二乘法求解最近点。

💡关键结论:三角测量的精度和基线长度正相关。
基线越长(两帧相机离得越远),深度估计越准;基线极短的时候,深度误差会爆炸。这也是为什么单目启动时深度不准,走一段基线拉开之后精度就上来了。
💡通俗解释:就像人两只眼睛,左右眼分开距离越大,判断物体远近越准;两眼挨在一起,很难判断距离。

实践环节中,会用对极几何算出的位姿,三角化出所有匹配点的深度,验证结果的合理性。


四、3D-2D PnP:SLAM最常用的位姿求解

如果我们已经有了地图点的三维坐标,来了一帧新的2D图像,匹配上之后求当前相机位姿——这就是PnP(Perspective-n-Point)问题。

这是SLAM里最常见的位姿求解场景:地图已经有了,新来一帧,算自己在哪。比2D-2D对极几何用得还要频繁。

4.1 求解方法

  1. 直接线性变换(DLT)
    6对点即可线性求解,直接得到代数解。优点是快,缺点是没有利用几何约束,精度一般。
  2. 最小化重投影误差(主流方案)
    先用DLT给初值,再以重投影误差为目标函数,用非线性优化迭代求精。

💡重投影误差通俗解释:把3D地图点,按照估算出来的相机位置,反向投影到图像上,得到预测像素坐标;拿预测坐标和图像上真实检测到的像素坐标做差值,就是重投影误差。SLAM优化就是不断缩小这个误差。

工程上还有EPnP、UPnP等更高效的解法,OpenCV的solvePnP系列函数都有实现。

4.2 实践:求解位姿

代码演示了两种实现:

  1. 调用OpenCV的solvePnP一键求解;
  2. 手写高斯牛顿法,优化重投影误差求解位姿,从底层理解优化过程。

五、3D-3D ICP:点云匹配求变换

如果两帧都有三维点云(比如双目相机、RGB-D相机、激光雷达),两组3D点之间求刚体变换,就是ICP(Iterative Closest Point)。

5.1 求解方法

  1. SVD分解法
    当两组点已经一一对应好了,直接用SVD分解就能解析解出R和t,一步到位。
  2. 非线性优化法
    点对应不精确的时候,用迭代优化的方式,最小化点到点的距离误差。

💡踩坑提示:ICP的命门是「点对应」。
如果点和点没对应对,ICP会直接收敛到错误的结果。所以实际工程中,一般先靠特征匹配做点对应,再用ICP精修;或者用点到面ICP等改进版本。

5.2 实践:求解ICP

代码分别实现了SVD解析解和非线性优化迭代解,对比两种方法的结果。


六、方法选择指南

一张表搞懂什么时候用什么方案:

场景首选方法核心输入
两帧都是2D单目,无先验3D对极几何+三角测量像素匹配对
已有3D地图点,新帧是2DPnP3D点+对应2D像素
两帧都是3D点云ICP两组3D点对

七、知识体系全景

视觉里程计 特征点法

特征点基础

关键点 KeyPoint

描述子 Descriptor

ORB特征

FAST角点检测

灰度质心方向

BRIEF二进制描述子

特征匹配

暴力匹配

FLANN快速匹配

匹配筛选 比率测试

2D-2D 对极几何

对极约束

本质矩阵 E

八点法求解

分解R t

尺度不确定性

单应矩阵 H

四点法求解

平面场景适用

三角测量

射线相交

最小二乘求解

基线长度影响精度

3D-2D PnP

直接线性变换 DLT

最小化重投影误差

EPnP 等工程实现

3D-3D ICP

SVD解析解

非线性优化迭代

点对应是关键

工程实践

OpenCV API调用

手写底层实现


小结

第7讲是视觉里程计的核心基石,本质上就是回答一个问题:给你两帧图像/点云,怎么算相机运动。

特征点法是VO里最成熟、最稳的方案,也是入门SLAM的必经之路。当然它也有局限:特征少的场景容易跟丢、只能用稀疏点、计算速度还是不够极致。下一讲我们会介绍另一条路线——直接法与光流,看看不用特征点怎么算运动。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 22:04:15

Linux auditd系统审计实战:规则配置与安全事件追踪方法

auditd安装与基本配置 auditd是Linux内核审计子系统的用户空间守护进程&#xff0c;提供系统级安全审计能力。服务器安全加固场景中&#xff0c;auditd能够记录文件访问、系统调用、用户权限变更等关键操作&#xff0c;是合规审计和入侵检测的基础组件。 在CentOS/RHEL系统上…

作者头像 李华
网站建设 2026/10/21 6:25:36

Claude Haiku 5.5 上线,小模型开始承接量产调用|2026年10月09日

今天技术圈最值得拆的&#xff0c;不是「模型又大了多少」&#xff0c;而是三件工程账同时被摊开&#xff1a;Anthropic 把 Claude Haiku 5.5 的输入价格压到每百万 token 0.10 美元[① MarkTechPost]&#xff1b;一项在生产环境完成的按调用点评估显示&#xff0c;把每个调用点…

作者头像 李华
网站建设 2026/10/20 11:31:07

Java程序员3个月斩获百度38K Offer!零AI背景转战大模型应用

本文分享了一位无AI背景的Java开发如何通过3个月成功转型&#xff0c;获得百度AI Agent应用开发Offer的经验。文章指出&#xff0c;转型关键并非深入算法或啃源码&#xff0c;而是利用Java后端工程优势&#xff0c;学习Prompt工程、RAG、Agent等核心技术&#xff0c;并针对目标…

作者头像 李华
网站建设 2026/10/16 6:56:39

排名滑落不是翻车:给 N2.5-mini 的冷静期说句公道话

排名滑落不是翻车&#xff1a;给 N2.5-mini 的冷静期说句公道话 【免费下载链接】Nex-N2.5-mini 项目地址: https://ai.gitcode.com/hf_mirrors/nex-agi/Nex-N2.5-mini Nex-N2.5 系列发布时的高调&#xff0c;和随后榜单排名被一轮轮刷新的现实&#xff0c;构成了 2025…

作者头像 李华
网站建设 2026/10/16 4:48:05

DC-DC 的开关频率是怎么确定的

一、频率的来源&#xff1a;固定档位、设置电阻与外部时钟固定频率 buck 的开关频率由芯片内部振荡器产生&#xff0c;常见三种设定方式&#xff1a;固定档位。芯片出厂时锁定一档或数档频率&#xff08;如 400kHz 与 2.1MHz 两档&#xff09;&#xff0c;频率精度由内部振荡器…

作者头像 李华
网站建设 2026/10/19 18:00:31

企业越复杂,为什么共识比速度更重要?

当企业越来越复杂&#xff0c;为什么“共识”比“速度”更重要&#xff1f;这个问题我在不同场合被问过很多次。尤其是这几年&#xff0c;很多管理者一提到“共识”就皱眉&#xff0c;觉得那是“低效”“扯皮”“流程冗长”的代名词&#xff1b;一提到“速度”就两眼放光&#…

作者头像 李华