当前位置: 首页 > news >正文

直接法估计相机位姿

引入

在前面的文章:运动跟踪——Lucas-Kanade光流中,我们了解到特征点法存在一些缺陷,并且用光流法追踪像素点的运动来替代特征点法进行特征点匹配的过程来解决这些缺陷。而这篇文章要介绍的直接法则是通过计算特征点在下一时刻图像中的位置来进一步缩短算法计算时间。

直接法估计相机位姿的推导

直接法求解相机运动
直接法通过最小化相邻图像之间的光度误差来优化位姿参数。以下是推导过程:


1. 问题建模

设参考帧图像为 I ref I_{\text{ref}} Iref,当前帧图像为 I cur I_{\text{cur}} Icur,相机的位姿变换为 T ∈ SE ( 3 ) T \in \text{SE}(3) TSE(3),用李代数 ξ ∈ s e ( 3 ) \xi \in \mathfrak{se}(3) ξse(3)参数化。对于参考帧中的每个像素点 p i \mathbf{p}_i pi,其对应的3D点坐标为 P i \mathbf{P}_i Pi,投影到当前帧中的坐标为:
p i ′ = π ( T ⋅ P i ) \mathbf{p}_i' = \pi\left(T \cdot \mathbf{P}_i\right) pi=π(TPi)
其中 π \pi π为投影函数, T = exp ⁡ ( ξ ∧ ) T = \exp(\xi^\wedge) T=exp(ξ)

光度误差定义为:
e i = I cur ( p i ′ ) − I ref ( p i ) e_i = I_{\text{cur}}(\mathbf{p}_i') - I_{\text{ref}}(\mathbf{p}_i) ei=Icur(pi)Iref(pi)
则优化目标是最小化总误差:
min ⁡ ξ ∑ i ∥ e i ∥ 2 \min_\xi \sum_i \| e_i \|^2 ξminiei2


2. 误差函数的导数

误差关于位姿的雅可比矩阵用链式求导为:
∂ e i ∂ ξ = ∂ I cur ∂ p i ′ ⋅ ∂ p i ′ ∂ ξ \frac{\partial e_i}{\partial \xi} = \frac{\partial I_{\text{cur}}}{\partial \mathbf{p}_i'} \cdot \frac{\partial \mathbf{p}_i'}{\partial \xi} ξei=piIcurξpi

(1) 图像梯度项

∂ I cur ∂ p i ′ = [ I x , I y ] \frac{\partial I_{\text{cur}}}{\partial \mathbf{p}_i'} = \left[ I_x, I_y \right] piIcur=[Ix,Iy]
其中 I x , I y I_x, I_y Ix,Iy 为当前帧在 p i ′ \mathbf{p}_i' pi处的图像梯度。

(2) 投影点对位姿的导数

投影函数 p i ′ = π ( exp ⁡ ( ξ ∧ ) P i ) \mathbf{p}_i' = \pi(\exp(\xi^\wedge) \mathbf{P}_i) pi=π(exp(ξ)Pi)的导数为:
∂ p i ′ ∂ ξ = ∂ π ∂ P ′ ⋅ ∂ P ′ ∂ ξ \frac{\partial \mathbf{p}_i'}{\partial \xi} = \frac{\partial \pi}{\partial \mathbf{P}'} \cdot \frac{\partial \mathbf{P}'}{\partial \xi} ξpi=PπξP
其中:

  • P ′ = T ⋅ P i \mathbf{P}' = T \cdot \mathbf{P}_i P=TPi为变换后的3D点。
  • ∂ π ∂ P ′ \frac{\partial \pi}{\partial \mathbf{P}'} Pπ为投影函数对3D点的导数:
    ∂ π ∂ P ′ = [ f x Z ′ 0 − f x X ′ Z ′ 2 0 f y Z ′ − f y Y ′ Z ′ 2 ] \frac{\partial \pi}{\partial \mathbf{P}'} = \begin{bmatrix} \frac{f_x}{Z'} & 0 & -\frac{f_x X'}{Z'^2} \\ 0 & \frac{f_y}{Z'} & -\frac{f_y Y'}{Z'^2} \end{bmatrix} Pπ=[Zfx00ZfyZ′2fxXZ′2fyY]
  • ∂ P ′ ∂ ξ \frac{\partial \mathbf{P}'}{\partial \xi} ξP为李代数扰动模型:
    ∂ P ′ ∂ ξ = [ I 3 × 3 − P ′ ∧ ] \frac{\partial \mathbf{P}'}{\partial \xi} = \begin{bmatrix} \mathbf{I}_{3\times3} & -\mathbf{P}'^{\wedge} \end{bmatrix} ξP=[I3×3P]
    其中 P ′ ∧ \mathbf{P}'^{\wedge} P为3D点的反对称矩阵。

3. 雅可比矩阵推导

结合上述结果,雅可比矩阵为:
J i = [ f x Z ′ 0 − f x X ′ Z ′ 2 f x X ′ Y ′ Z ′ 2 − f x ( 1 + X ′ 2 Z ′ 2 ) f x Y ′ Z ′ 0 f y Z ′ − f y Y ′ Z ′ 2 − f y ( 1 + Y ′ 2 Z ′ 2 ) f y X ′ Y ′ Z ′ 2 − f y X ′ Z ′ ] \mathbf{J}_i = \begin{bmatrix} \frac{f_x}{Z'} & 0 & -\frac{f_x X'}{Z'^2} & \frac{f_x X' Y'}{Z'^2} & -f_x\left(1 + \frac{X'^2}{Z'^2}\right) & \frac{f_x Y'}{Z'} \\ 0 & \frac{f_y}{Z'} & -\frac{f_y Y'}{Z'^2} & -f_y\left(1 + \frac{Y'^2}{Z'^2}\right) & \frac{f_y X' Y'}{Z'^2} & -\frac{f_y X'}{Z'} \end{bmatrix} Ji= Zfx00ZfyZ′2fxXZ′2fyYZ′2fxXYfy(1+Z′2Y′2)fx(1+Z′2X′2)Z′2fyXYZfxYZfyX


4. 优化求解

使用高斯-牛顿法迭代更新位姿:

  1. 计算残差:对每个点计算 e i = I cur ( p i ′ ) − I ref ( p i ) e_i = I_{\text{cur}}(\mathbf{p}_i') - I_{\text{ref}}(\mathbf{p}_i) ei=Icur(pi)Iref(pi)
  2. 构建雅可比矩阵:按上述公式计算每个点的 J i \mathbf{J}_i Ji
  3. 求解增量方程
    H = ∑ i J i T J i , b = − ∑ i J i T e i \mathbf{H} = \sum_i \mathbf{J}_i^T \mathbf{J}_i, \quad \mathbf{b} = -\sum_i \mathbf{J}_i^T e_i H=iJiTJi,b=iJiTei
    Δ ξ = H − 1 b \Delta \xi = \mathbf{H}^{-1} \mathbf{b} Δξ=H1b
  4. 更新位姿
    ξ ← ξ + Δ ξ \xi \leftarrow \xi + \Delta \xi ξξ+Δξ

5. 关键点总结

  • 光度误差:基于灰度不变假设,直接比较像素亮度。
  • 李代数扰动模型:用于计算位姿变化对投影点的影响。
  • 雅可比矩阵:结合图像梯度和几何变换导数,指导优化方向。
  • 多尺度优化:还可以采用图像金字塔提高鲁棒性和收敛性。

通过迭代优化,直接法能够有效估计相机的位姿变化,适用于特征缺失的场景,但对光照变化和初始值敏感。
至此,关于视觉里程计即根据图像信息求解相机位姿变换的知识已经讲解完毕。接下来将进入后端优化的学习。

http://www.lryc.cn/news/547332.html

相关文章:

  • PHP动态网站建设
  • 【gRPC】Java高性能远程调用之gRPC详解
  • 数据结构知识学习小结
  • 分布式锁—2.Redisson的可重入锁一
  • 计算机毕业设计SpringBoot+Vue.js球队训练信息管理系统(源码+文档+PPT+讲解)
  • FFmpeg入门:最简单的音视频播放器
  • java 查找两个集合的交集部分数据
  • 【系统架构设计师】以数据为中心的体系结构风格
  • 通过HTML有序列表(ol/li)实现自动递增编号的完整解决方案
  • 【Python 数据结构 4.单向链表】
  • 基于 vLLM 部署 LSTM 时序预测模型的“下饭”(智能告警预测与根因分析部署)指南
  • Java多线程与高并发专题——ConcurrentHashMap 在 Java7 和 8 有何不同?
  • NL2SQL-基于Dify+阿里通义千问大模型,实现自然语音自动生产SQL语句
  • LeetCode 1328.破坏回文串:贪心
  • 计算机视觉|ViT详解:打破视觉与语言界限
  • //定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果
  • Python快捷手册
  • QT5 GPU使用
  • 如何在Spring Boot中读取JAR包内resources目录下文件
  • 《张一鸣,创业心路与算法思维》
  • SSE 和 WebSocket 的对比
  • es如何进行refresh?
  • Kubespray部署企业级高可用K8S指南
  • 【实战篇】【深度解析DeepSeek:从机器学习到深度学习的全场景落地指南】
  • 优选算法的智慧之光:滑动窗口专题(二)
  • Kylin麒麟操作系统服务部署 | NFS服务部署
  • 7.1.2 计算机网络的分类
  • Spring Cloud Alibaba 实战:轻松实现 Nacos 服务发现与动态配置管理
  • 【数据结构】LRUCache|并查集
  • 智能合约中权限管理不当