《视觉SLAM十四讲》-- 视觉里程计2

文章目录

    • 07 视觉里程计 2
      • 7.1 直接法的引出
      • 7.2 2D 光流
        • 7.2.1 Lucas-Kanade 光流
        • 7.2.1 实践:LK 光流
      • 7.3 直接法
        • 7.3.1 推导过程
        • 7.3.2 直接法的优缺点

07 视觉里程计 2

7.1 直接法的引出

特征点的缺点:

  • 关键点的提取与描述子的计算非常耗时,实时性差;

  • 使用特征点时,忽略了特征点以外的所有信息,而丢弃了部分可能有用的信息;

  • 有时会出现特征缺失的情况,如白墙或者空荡荡的走廊等。

为了克服上述问题,提出了 光流法直接法

光流法:只计算关键点,不计算描述子,采用光流跟踪。

直接法:由光流法演变而来。根据像素灰度信息同时估计相机运动和点的投影,不要求必须为角点,甚至可以是随机点。

7.2 2D 光流

光流描述了像素随时间在图像之间运动的过程。其中,计算部分像素的运动称为 稀疏光流,计算所有像素的运动称为 稠密光流。下面主要介绍以 LK 光流为代表的稀疏光流。
在这里插入图片描述

7.2.1 Lucas-Kanade 光流

(1)我们认为图像是随时间变化的,也就是说图像可以看做时间的函数,那么,一个在 t t t 时刻,位于 ( x , y ) (x, y) (x,y) 处的像素,它的灰度可以写成

I ( x , y , t ) \boldsymbol{I}(x,y,t) I(x,y,t)

首先,引入光流法的基本假设:

灰度不变假设:同一个空间点的像素灰度值,在各个图像中是固定不变的。

(2)对于 t t t 时刻位于 ( x , y ) (x,y) (x,y) 处的像素,在 t + d t t+\mathrm{d}t t+dt 时刻运动到 ( x + d x , y + d y ) (x+\mathrm{d}x,y+\mathrm{d}y) (x+dx,y+dy) 处,根据灰度不变假设

I ( x + d x , y + d y , t + d t ) = I ( x , y , t ) (7-1) \boldsymbol{I}(x+\mathrm{d}x,y+\mathrm{d}y,t+\mathrm{d}t)=\boldsymbol{I}(x,y,t) \tag{7-1} I(x+dx,y+dy,t+dt)=I(x,y,t)(7-1)

对左边进行泰勒展开,并保留一阶项:

I ( x + d t , y + d y , t + d t ) ≈ I ( x , y , t ) + ∂ I ∂ x d x + ∂ I ∂ y d y + ∂ I ∂ t d t (7-2) \boldsymbol{I}(x+\mathrm{d}t,y+\mathrm{d}y,t+\mathrm{d}t)\approx\boldsymbol{I}(x,y,t)+\frac{\partial \boldsymbol{I}}{\partial x}\mathrm{d}x+\frac{\partial \boldsymbol{I}}{\partial y}\mathrm{d}y+\frac{\partial \boldsymbol{I}}{\partial t}\mathrm{d}t \tag{7-2} I(x+dt,y+dy,t+dt)I(x,y,t)+xIdx+yIdy+tIdt(7-2)

由灰度不变,所以

∂ I ∂ x d x + ∂ I ∂ y d y + ∂ I ∂ t d t = 0 (7-3) \frac{\partial \boldsymbol{I}}{\partial x}\mathrm{d}x+\frac{\partial \boldsymbol{I}}{\partial y}\mathrm{d}y+\frac{\partial \boldsymbol{I}}{\partial t}\mathrm{d}t=0 \tag{7-3} xIdx+yIdy+tIdt=0(7-3)

两边同除 d t \mathrm{d}t dt,得

∂ I ∂ x d x d t + ∂ I ∂ y d y d t = − ∂ I ∂ t (7-3) \frac{\partial \boldsymbol{I}}{\partial x}\frac{\mathrm{d}x}{\mathrm{d}t}+\frac{\partial \boldsymbol{I}}{\partial y}\frac{\mathrm{d}y}{\mathrm{d}t}=-\frac{\partial \boldsymbol{I}}{\partial t} \tag{7-3} xIdtdx+yIdtdy=tI(7-3)

其中, d x / d t {\mathrm{d}x}/{\mathrm{d}t} dx/dt d y / d t {\mathrm{d}y}/{\mathrm{d}t} dy/dt 分别为像素在 x x x y y y 轴上运动的速度,记为 u u u v v v ∂ I / ∂ x {\partial \boldsymbol{I}}/{\partial x} I/x ∂ I / ∂ y {\partial \boldsymbol{I}}/{\partial y} I/y 分别为图像在 x x x y y y 方向上的梯度,记为 I x \boldsymbol{I}_x Ix I y \boldsymbol{I}_y Iy;把像素灰度对时间的变化量记为 I t \boldsymbol{I}_t It。那么上式写成矩阵形式

[ I x I y ] [ u v ] = − I t (7-4) \left[\begin{array}{ll} \boldsymbol{I}_{x} & \boldsymbol{I}_{y} \end{array}\right]\left[\begin{array}{l} u \\ v \end{array}\right]=-\boldsymbol{I}_{t} \tag{7-4} [IxIy][uv]=It(7-4)

我们希望求出 u u u v v v,但上式是一个二元一次方程,条件不足,因此还需引入额外的约束。假设在一个大小为 w × w w \times w w×w 的图像窗口中,这 w 2 w^2 w2 个像素都具有相同的运动,那么就可以得到 w 2 w^2 w2 个方程:

[ I x I y ] k [ u v ] = − I t k , k = 1 , 2 , . . . , w 2 (7-5) \left[\begin{array}{ll} \boldsymbol{I}_{x} & \boldsymbol{I}_{y} \end{array}\right]_k\left[\begin{array}{l} u \\ v \end{array}\right]=-\boldsymbol{I}_{tk},\quad k=1,2,...,w^2 \tag{7-5} [IxIy]k[uv]=Itkk=1,2,...,w2(7-5)

A = [ [ I x , I y ] 1 ⋮ [ I x , I y ] k ] , b = [ I t 1 ⋮ I t k ] \boldsymbol{A}=\left[\begin{array}{c} {\left[\boldsymbol{I}_{x}, \boldsymbol{I}_{y}\right]_{1}} \\ \vdots \\ {\left[\boldsymbol{I}_{x}, \boldsymbol{I}_{y}\right]_{k}} \end{array}\right], \boldsymbol{b}=\left[\begin{array}{c} \boldsymbol{I}_{t 1} \\ \vdots \\ \boldsymbol{I}_{t k} \end{array}\right] A= [Ix,Iy]1[Ix,Iy]k ,b= It1Itk

A [ u v ] = − b (7-6) \boldsymbol{A}\left[\begin{array}{l} u \\ v \end{array}\right]=-b \tag{7-6} A[uv]=b(7-6)

这又是一个超定方程,采用最小二乘解,即

[ u v ] ∗ = − ( A T A ) − 1 A T b (7-7) \left[\begin{array}{l} u \\ v \end{array}\right]^*=-(\boldsymbol{A}^{\mathrm{T}}\boldsymbol{A})^{-1}\boldsymbol{A}^{\mathrm{T}}\boldsymbol{b} \tag{7-7} [uv]=(ATA)1ATb(7-7)

7.2.1 实践:LK 光流

7.3 直接法

7.3.1 推导过程

如图,已知空间点 P P P 的世界坐标为 [ X , Y , Z ] T [X,Y,Z]^\mathrm{T} [X,Y,Z]T,在两帧图像上的像素坐标分别为 p 1 \boldsymbol{p}_1 p1 p 2 \boldsymbol{p}_2 p2(未知)。
在这里插入图片描述

我们希望求出第一个相机到第二个相机的相对位姿变换,以第一个相机为初始参照系,经旋转和平移 R \boldsymbol{R} R t \boldsymbol{t} t 到第二个相机,有

p 1 = [ u v 1 ] 1 = 1 Z 1 K P \boldsymbol{p}_1=\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]_1=\frac{1}{Z_1}\boldsymbol{KP} p1= uv1 1=Z11KP
p 2 = [ u v 1 ] 2 = 1 Z 2 K ( R P + t ) = 1 Z 2 K ( T P ) 1 : 3 (7-8) \boldsymbol{p}_2=\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]_2=\frac{1}{Z_2}\boldsymbol{K}(\boldsymbol{RP+t})=\frac{1}{Z_2}\boldsymbol{K}(\boldsymbol{TP})_{1:3} \tag{7-8} p2= uv1 2=Z21K(RP+t)=Z21K(TP)1:3(7-8)

直接法中,由于没有特征点匹配,我们无法知道哪一个 p 1 \boldsymbol{p}_1 p1 p 2 \boldsymbol{p}_2 p2 对应着同一个点。于是,可以通过优化相机位姿,来寻找与 p 1 \boldsymbol{p}_1 p1 更相似的 p 2 \boldsymbol{p}_2 p2。这里优化的是 光度误差 ,也就是两个像素的亮度误差:

e = I 1 ( p 1 ) − I 2 ( p 2 ) (7-9) e=\boldsymbol{I}_1(\boldsymbol{p}_1)-\boldsymbol{I}_2(\boldsymbol{p}_2) \tag{7-9} e=I1(p1)I2(p2)(7-9)

注意,这里的 e e e 是标量。目标优化函数为

min ⁡ T J ( T ) = ∥ e ∥ 2 (7-10) \min_{\boldsymbol{T}}J(\boldsymbol{T})=\|e\|^2 \tag{7-10} TminJ(T)=e2(7-10)

假设一个空间点在各个视角下成像的灰度是不变的,我们有许多个空间点 P i P_i Pi,那么,整个相机位姿估计问题变为

min ⁡ T J ( T ) = ∑ i = 1 N e i T e i , e i = I 1 ( p 1 , i ) − I 2 ( p 2 , i ) (7-11) \min _{\boldsymbol{T}} J(\boldsymbol{T})=\sum_{i=1}^{N} e_{i}^{\mathrm{T}} e_{i}, \quad e_{i}=\boldsymbol{I}_{1}\left(\boldsymbol{p}_{1, i}\right)-\boldsymbol{I}_{2}\left(\boldsymbol{p}_{2, i}\right) \tag{7-11} TminJ(T)=i=1NeiTei,ei=I1(p1,i)I2(p2,i)(7-11)

定义

q = T P \boldsymbol{q=TP} q=TP
u = 1 Z K q \boldsymbol{u}=\frac{1}{Z}\boldsymbol{Kq} u=Z1Kq

那么,误差 e e e 关于 位姿 T \boldsymbol{T} T 的导数为

∂ e ∂ T = ∂ I 2 ∂ u ∂ u ∂ q ∂ q ∂ δ ξ δ ξ (7-12) \frac{\partial e}{\partial \boldsymbol{T}}=\frac{\partial \boldsymbol{I}_2}{\partial \boldsymbol{u}}\frac{\partial \boldsymbol{u}}{\partial \boldsymbol{q}}\frac{\partial \boldsymbol{q}}{\partial \delta\boldsymbol{\xi}}\delta\boldsymbol{\xi} \tag{7-12} Te=uI2quδξqδξ(7-12)

其中, δ ξ \delta\boldsymbol{\xi} δξ T \boldsymbol{T} T 的左扰动。分别看每一项:

(1)第一项 ∂ I 2 / ∂ u {\partial \boldsymbol{I}_2}/{\partial \boldsymbol{u}} I2/u u \boldsymbol{u} u 处的像素梯度;

(2)第二项 ∂ u / ∂ q {\partial \boldsymbol{u}}/{\partial \boldsymbol{q}} u/q,也就是像素坐标关于相机坐标的导数,记 q = [ X , Y , Z ] T \boldsymbol{q}=[X,Y,Z]^\mathrm{T} q=[X,Y,Z]T,则有

∂ u ∂ q = [ ∂ u ∂ X ∂ u ∂ Y ∂ u ∂ Z ∂ v ∂ X ∂ v ∂ Y ∂ v ∂ Z ] = [ f x Z 0 − f x X Z 2 0 f y Z − f y Y Z 2 ] (7-13) \frac{\partial \boldsymbol{u}}{\partial \boldsymbol{q}}=\left[\begin{array}{lll} \frac{\partial u}{\partial X} & \frac{\partial u}{\partial Y} & \frac{\partial u}{\partial Z} \\ \frac{\partial v}{\partial X} & \frac{\partial v}{\partial Y} & \frac{\partial v}{\partial Z} \end{array}\right]=\left[\begin{array}{ccc} \frac{f_{x}}{Z} & 0 & -\frac{f_{x} X}{Z^{2}} \\ 0 & \frac{f_{y}}{Z} & -\frac{f_{y} Y}{Z^{2}} \end{array}\right] \tag{7-13} qu=[XuXvYuYvZuZv]=[Zfx00ZfyZ2fxXZ2fyY](7-13)

(3)第三项 ∂ q / ∂ δ ξ {\partial \boldsymbol{q}}/{\partial \delta\boldsymbol{\xi}} q/δξ 为变换后的三维点对李代数的导数,前面已经推导

∂ q ∂ δ ξ = [ I , − q ∧ ] (7-14) \frac{\partial \boldsymbol{q}}{\partial \delta \boldsymbol{\xi}}=\left[\boldsymbol{I},-\boldsymbol{q}^{\wedge}\right] \tag{7-14} δξq=[I,q](7-14)

将后两式合并(见式(6-43)),得

∂ u ∂ δ ξ = [ f x Z 0 − f x X Z 2 − f x X Y Z 2 f x + f x X 2 Z 2 − f x Y Z 0 f y Z − f y Y Z 2 − f y − f y Y 2 Z 2 f y X Y Z 2 f y X Z ] (7-15) \frac{\partial \boldsymbol{u}}{\partial \delta \boldsymbol{\xi}}=\left[\begin{array}{cccccc} \frac{f_{x}}{Z} & 0 & -\frac{f_{x} X}{Z^{2}} & -\frac{f_{x} X Y}{Z^{2}} & f_{x}+\frac{f_{x} X^{2}}{Z^{2}} & -\frac{f_{x} Y}{Z} \\ 0 & \frac{f_{y}}{Z} & -\frac{f_{y} Y}{Z^{2}} & -f_{y}-\frac{f_{y} Y^{2}}{Z^{2}} & \frac{f_{y} X Y}{Z^{2}} & \frac{f_{y} X}{Z} \end{array}\right] \tag{7-15} δξu=[Zfx00ZfyZ2fxXZ2fyYZ2fxXYfyZ2fyY2fx+Z2fxX2Z2fyXYZfxYZfyX](7-15)

于是,推导出误差关于李代数的雅克比矩阵:

J = − ∂ I 2 ∂ u ∂ u ∂ δ ξ (7-16) \boldsymbol{J}=-\frac{\partial \boldsymbol{I}_2}{\partial \boldsymbol{u}}\frac{\partial \boldsymbol{u}}{\partial \delta \boldsymbol{\boldsymbol{\xi}}} \tag{7-16} J=uI2δξu(7-16)

采用迭代优化的方法求解出式(7-11)的最优解。

7.3.2 直接法的优缺点

(1)直接法优点

  • 可以省去计算特征点、描述子的时间;

  • 只需要像素梯度即可,不需要特征点;

  • 可构件半稠密乃至稠密地图,这是特征点法做不到的。

(2)直接法缺点

  • 非凸性;

  • 单个像素没有区分度:选点少时效果较差,一般用 500 个点以上;

  • 灰度不变假设是很强的假设,相机会自动调整曝光参数、或者光照变化,都会使得图像整体亮度发生变化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/139035.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

辐射骚扰整改思路及方法:对差模电流的影响?|深圳比创达电子EMC

同样的分析可以应用在差模电流的情况,唯一不同的是,两根导线的磁场分布是相反的,磁场互相抵消,由于导线中的电流大小相等,产生的磁场H大小相同,在互相靠近的情况下,在磁环内的两个感应磁场大小相…

C盘可以格式化吗?正确答案在这里!

“我一直有个比较好奇的问题,我的电脑中病毒了,我想将c盘进行格式化操作,但是c盘中是有比较多重要文件的,在这种情况下,c盘可以格式化吗?怎么格式化c盘呢?” 面对各种电脑情况,可能不…

Python实现cpu密集型多线程

问题: 想通过以下代码实现多线程 class ThreadTest(threading.Thread):def __init__(self, num, *args, **kwargs):super(ThreadTest, self).__init__(*args, **kwargs)self.num numprint(num)def run(self):print(self.num)print(time.time())if __name__ &quo…

postman连接数据库

参考:https://blog.csdn.net/qq_45572452/article/details/126620210 1、安装node.js 2、配置环境变量 3、安装xmysql连接数据库cmd窗口输入"npm install -g xmysql"后回车cmd窗口输入"xmysql"后回车,验证xmysql是否安装成功(下图代表安装成功)…

编程最佳外挂:批量数据分析与可视化,CodeGeeX工具箱一键完成

ChatGLM3代模型的Code Interpreter能力,本周已经在VSCode里的CodeGeeX插件产品中,以开发者工具箱的产品形态上线。 下图以VSCode插件为例:在CodeGeeX的侧边栏,和智能问答AskCodeGeeX并列出现的工具箱标签,用户登录后就…

区块链拆分

随着区块链技术的发展和普及,去中心化钱包逐渐成为数字货币领域的重要工具。去中心化钱包不仅具有高度安全性和隐私保护能力,还可以通过智能合约和开源技术实现定制化功能。本文将探讨去中心化钱包定制开发的基本概念、优势、流程和前景。 一、去中心化钱…

YOLOv8 营业执照提取 统一社会信用代码、企业名称

目录 背景 尝试一:整图OCR识别,然后正则匹配 尝试二:利用显著特征,直接传统方法定位,切出来识别 尝试三:yolov8训练一个统一社会信用代码、企业名称位置检测 ​编辑 效果 模型信息 项目 ​编辑 代…

(六)Spring源码解析:Spring AOP源码解析

一、AOP概念 Aspect:切面 给业务方法增加到功能,切面泛指交叉业务逻辑。上例中的事务处理、日志处理就可以理解为切面。常用的切面是通知(Advice)。实际就是对主业务逻辑的一种增强。 Pointcut:切入点 切入点指声明的…

springcloudalibaba入门详细使用教程

目录标题 一、简介二、SpringCloud Alibaba核心组件2-1、Nacos (配置中心与服务注册与发现)2-2、Sentinel (分布式流控)2-3、RocketMQ (消息队列)/RabbitMq/kafka2-4、Seata (分布式事务)2-5、Dubbo (RPC) 三、为什么大家看好 Spring Cloud Alibaba3-1、阿里巴巴强大的技术输出…

【每日一题】307. 区域和检索 - 数组可修改-2023.11.13

题目: 307. 区域和检索 - 数组可修改 给你一个数组 nums ,请你完成两类查询。 其中一类查询要求 更新 数组 nums 下标对应的值另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的 和 &#xff0c…

智能井盖传感器具有什么效果?

智能井盖传感器与智慧城市之间有着密切的关联,两者之间属于相辅相成的状态,对于城市的现代化和城市生命线建设有助力作用。智能井盖传感器是其中一个重要的组成环节,它们帮助城市改变原有的生活和生态环境,为政府部门完善城市基础…

【机器学习】 朴素贝叶斯算法:原理、实例应用(文档分类预测)

1. 算法原理 1.1 朴素贝叶斯方法 朴素贝叶斯方法涉及一些概率论知识,我们先来复习一下。 联合概率:包含多个条件,并且所有的条件同时成立的概率,公式为: 条件概率:事件A在另一个事件B已经发生的前提下发…

工作十年+的测试应该具备什么能力?

大概是2014年的时候,我开始接触面试工作,就是从应聘者转为面试官,记得印象深刻的是面试了一位做了8年的测试。对方气场很足,嗯,毕竟那时的我还只是一个3、4年经验的小测试,相反,印象深刻的并不是…

Mysql基本知识

1.SQL分类 DDL【data definition language】 数据定义语言,用来维护存储数据的结构 代表指令: create, drop, alter DML【data manipulation language】 数据操纵语言,用来对数据进行操作 代表指令: insert,delete,up…

十四、W5100S/W5500+RP2040树莓派Pico<NetBIOS>

文章目录 1 前言2 简介2 .1 什么是NetBIOS?2.2 NetBIOS的优点2.3 NetBIOS工作原理2.4 NetBIOS应用场景 3 WIZnet以太网芯片4 NetBIOS网络设置示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 随着…

单片机定时器讲解和实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、计数器是什么?二、单片机定时器结构2.1***两个8位如何合成16位,16位如何分成两个8位***2.2 计数器的位数组合?2.3 定时功…

C# OpenCvSharp 基于直线检测的文本图像倾斜校正

效果 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp;namespace OpenCvSharp_基于直线检测的文本图像…

基于若依的ruoyi-nbcio流程管理系统增加读取节点扩展属性的方法

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 我们的在流程设计器里会根据需要再不同的节点增加扩展属性,如何动态读取这些扩展属性&#xff…

一文了解芯片测试项目和检测方法 -纳米软件

芯片检测是芯片设计、生产、制造成过程中的关键环节,检测芯片的质量、性能、功能等,以满足设计要求和市场需求,确保芯片可以长期稳定运行。芯片测试内容众多,检测方法多样,今天纳米软件将为您介绍芯片的检测项目都有哪…

下载并安装DevEco Studio 3.1,初尝鸿蒙编程

摘自华为官网 DevEco Studio 3.1配套支持HarmonyOS 3.1版本及以上的应用及服务开发,提供了代码智能编辑、低代码开发、双向预览等功能,以及轻量构建工具DevEco Hvigor 、本地模拟器,持续提升应用及服务开发效率。 下载 官网下载地址 HUAWEI…
最新文章