当前位置: 首页 > 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. 关键点总结

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

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

相关文章:

直接法估计相机位姿

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

PHP动态网站建设

如何配置虚拟主机 1. 学习提纲 本地发布与互联网发布:介绍了如何通过本地IP地址和互联网域名发布网站。 虚拟主机配置与访问:讲解了如何配置虚拟主机,并通过自定义域名访问不同的站点目录。 Web服务器配置:详细说明了如何配置A…...

【gRPC】Java高性能远程调用之gRPC详解

gRPC详解 一、什么是gRPC?二、用proto生成代码2.1、前期准备2.2、protobuf插件安装 三、简单 RPC3.1、开发gRPC服务端3.2、开发gRPC客户端3.3、验证gRPC服务 四、服务器端流式 RPC4.1、开发一个gRPC服务,类型是服务端流4.2、开发一个客户端,调…...

数据结构知识学习小结

一、动态内存分配基本步骤 1、内存分配简单示例: 个人对于示例的理解: 定义一个整型的指针变量p(着重认为它是一个“变量”我觉得可能会更好理解),这个变量用来存地址的,而不是“值”,malloc函…...

分布式锁—2.Redisson的可重入锁一

大纲 1.Redisson可重入锁RedissonLock概述 2.可重入锁源码之创建RedissonClient实例 3.可重入锁源码之lua脚本加锁逻辑 4.可重入锁源码之WatchDog维持加锁逻辑 5.可重入锁源码之可重入加锁逻辑 6.可重入锁源码之锁的互斥阻塞逻辑 7.可重入锁源码之释放锁逻辑 8.可重入锁…...

计算机毕业设计SpringBoot+Vue.js球队训练信息管理系统(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

FFmpeg入门:最简单的音视频播放器

FFmpeg入门:最简单的音视频播放器 前两章,我们已经了解了分别如何构建一个简单和音频播放器和视频播放器。 FFmpeg入门:最简单的音频播放器 FFmpeg入门:最简单的视频播放器 本章我们将结合上述两章的知识,看看如何融…...

java 查找两个集合的交集部分数据

利用了Java 8的Stream API&#xff0c;代码简洁且效率高 import java.util.stream.Collectors; import java.util.List; import java.util.HashSet; import java.util.Set;public class ListIntersection {public static List<Long> findIntersection(List<Long> …...

【系统架构设计师】以数据为中心的体系结构风格

目录 1. 说明2. 仓库体系结构风格3. 黑板体系结构风格 1. 说明 1.以数据为中心的体系结构风格主要包括仓库体系结构风格和黑板体系结构风格。 2. 仓库体系结构风格 1.仓库&#xff08;Repository&#xff09;是存储和维护数据的中心场所。2.在仓库风格中&#xff0c;有两种不…...

通过HTML有序列表(ol/li)实现自动递增编号的完整解决方案

以下是通过HTML有序列表(ol/li)实现自动递增编号的完整解决方案&#xff1a; <!DOCTYPE html> <html> <head> <style> /* 基础样式 */ ol {margin: 1em 0;padding-left: 2em; }/* 方案1&#xff1a;默认数字编号 */ ol.default {list-style-type: dec…...

【Python 数据结构 4.单向链表】

目录 一、单向链表的基本概念 1.单向链表的概念 2.单向链表的元素插入 元素插入的步骤 3.单向链表的元素删除 元素删除的步骤 4.单向链表的元素查找 元素查找的步骤 5.单向链表的元素索引 元素索引的步骤 6.单向链表的元素修改 元素修改的步骤 二、Python中的单向链表 ​编辑 三…...

基于 vLLM 部署 LSTM 时序预测模型的“下饭”(智能告警预测与根因分析部署)指南

Alright,各位看官老爷们,准备好迎接史上最爆笑、最通俗易懂的 “基于 vLLM 部署 LSTM 时序预测模型的智能告警预测与根因分析部署指南” 吗? 保证让你笑出猪叫,看完直接变身技术大咖!🚀😂 咱们今天的主题,就像是要打造一个“智能运维小管家”! 这个小管家,不仅能提…...

Java多线程与高并发专题——ConcurrentHashMap 在 Java7 和 8 有何不同?

引入 上一篇我们提到HashMap 是线程不安全的&#xff0c;并推荐使用线程安全同时性能比较好的 ConcurrentHashMap。 而在 Java 8 中&#xff0c;对于 ConcurrentHashMap 这个常用的工具类进行了很大的升级&#xff0c;对比之前 Java 7 版本在诸多方面都进行了调整和变化。不过…...

NL2SQL-基于Dify+阿里通义千问大模型,实现自然语音自动生产SQL语句

本文基于Dify阿里通义千问大模型&#xff0c;实现自然语音自动生产SQL语句功能&#xff0c;话不多说直接上效果图 我们可以试着问他几个问题 查询每个部门的员工数量SELECT d.dept_name, COUNT(e.emp_no) AS employee_count FROM employees e JOIN dept_emp de ON e.emp_no d…...

LeetCode 1328.破坏回文串:贪心

【LetMeFly】1328.破坏回文串&#xff1a;贪心 力扣题目链接&#xff1a;https://leetcode.cn/problems/break-a-palindrome/ 给你一个由小写英文字母组成的回文字符串 palindrome &#xff0c;请你将其中 一个 字符用任意小写英文字母替换&#xff0c;使得结果字符串的 字典…...

计算机视觉|ViT详解:打破视觉与语言界限

一、ViT 的诞生背景 在计算机视觉领域的发展中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;一直占据重要地位。自 2012 年 AlexNet 在 ImageNet 大赛中取得优异成绩后&#xff0c;CNN 在图像分类任务中显示出强大能力。随后&#xff0c;VGG、ResNet 等深度网络架构不…...

//定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果

import java.util.Scanner; public class cha{ public static void main(String[] args){//定义一个方法&#xff0c;把int数组中的数据按照指定的格式拼接成一个字符串返回&#xff0c;调用该方法&#xff0c;并在控制台输出结果//eg&#xff1a; 数组为&#xff1a;int[] arr…...

Python快捷手册

Python快捷手册 后续会陆续更新Python对应的依赖或者工具使用方法 文章目录 Python快捷手册[toc]1-依赖1-词云小工具2-图片添加文字3-BeautifulSoup网络爬虫4-Tkinter界面绘制5-PDF转Word 2-开发1-多线程和队列 3-运维1-Requirement依赖2-波尔实验室3-Anaconda3使用教程4-CentO…...

QT5 GPU使用

一、问题1 1、现象 2、原因分析 出现上图错误&#xff0c;无法创建EGL表面&#xff0c;错误&#xff1d;0x300b。申请不上native window有可能是缺少libqeglfs-mali-integration.so 这个库 3、解决方法 需要将其adb push 到小机端的/usr/lib/qt5/plugins/egldeviceintegrat…...

如何在Spring Boot中读取JAR包内resources目录下文件

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 以下是如何在Spring Boot中读取JAR包内resources目录下文件的教程&#xff0c;分为多种方法及详细说明&#xff1a; 方法1&#xff1a;使用 ClassPathResour…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...