视觉SLAM十四讲_视觉里程计2


前言

如有侵权,请告知删除

B站一位学姐的SLAM十四讲讲解的笔记.后续在此基础上继续完善.

问题引出:
特征点法 { 理解图像特征点的意义 , 掌握在单幅图像中提取特征点及多幅图像中匹配特征点的方法 理解对极几何的原理 , 利用对极几何的约束 , 恢复出图像之间的摄像机的三维运动 理解如何通过三角化 , 获得二维图像上对应的三维结构 理解 P N P 问题 , 及利用已知三维结构与图像的对应关系 , 求解摄像机的三维运动 . 理解 I C P 问题 . 及利用点云的匹配关系 , 求解摄像机的三维运动 . ​   ⇓   特征点法问题 { 在图像中 提取 特征点并计算特征描述 非常耗时 通过计算描述子距离在不同图像中寻找 匹配 非常耗时 利用通过匹配点信息计算相机位姿 正常 \fbox{特征点法}\begin{cases}\color{#0FB}理解图像特征点的意义,掌握在单幅图像中提取特征点及多幅图像中匹配特征点的方法\\\color{#0FB}理解对极几何的原理,利用对极几何的约束,恢复出图像之间的摄像机的三维运动\\\color{#0FB} 理解如何通过三角化,获得二维图像上对应的三维结构\\\color{#0FB} 理解PNP问题,及利用已知三维结构与图像的对应关系,求解摄像机的三维运动.\\\color{#0FB} 理解ICP问题.及利用点云的匹配关系,求解摄像机的三维运动. ​\end{cases} \\~ \\ \Downarrow \\~\\ \fbox{特征点法问题}\begin{cases} \color{#F00} 在图像中 {\bf{提取}}特征点并计算特征描述 & \color{#F00}非常耗时\\ \color{#F00}通过计算描述子距离在不同图像中寻找{\bf匹配} & \color{#F00}非常耗时\\ 利用通过匹配点信息计算相机位姿&正常 \end{cases} 特征点法 理解图像特征点的意义,掌握在单幅图像中提取特征点及多幅图像中匹配特征点的方法理解对极几何的原理,利用对极几何的约束,恢复出图像之间的摄像机的三维运动理解如何通过三角化,获得二维图像上对应的三维结构理解PNP问题,及利用已知三维结构与图像的对应关系,求解摄像机的三维运动.理解ICP问题.及利用点云的匹配关系,求解摄像机的三维运动.​  特征点法问题 在图像中提取特征点并计算特征描述通过计算描述子距离在不同图像中寻找匹配利用通过匹配点信息计算相机位姿非常耗时非常耗时正常

改进: { 通过其他方式寻找匹配点 ( 描述子 ) 光流 1. 提取可能是随机点的特征点 ; 2. 不去进行匹配 , 直接进行位姿估计 直接法 \fbox{改进:}\begin{cases} 通过其他方式寻找匹配点(\cancel{描述子} )& \color{#00F}光流\\ 1.提取可能是随机点的特征点;2. 不去进行匹配,直接进行位姿估计 &\color{#00F}直接法 \end{cases} 改进:{通过其他方式寻找匹配点(描述子 )1.提取可能是随机点的特征点;2.不去进行匹配,直接进行位姿估计光流直接法


提示:以下是本篇文章正文内容,下面内容仅供参考

一、光流法

一种描述像素随时间在图像之间运动的方法, 本质上是估计像素在不同时刻图像中的运动。(希望解出像素到了下一刻的那个位置)
在这里插入图片描述
{ 稀疏光流 L K 光流为代表 稠密光流 H S 光流为代表 \begin{cases}稀疏光流&{\color{#0F0}LK光流为代表}\\ 稠密光流&{\color{#0F0}HS光流为代表} \end{cases} {稀疏光流稠密光流LK光流为代表HS光流为代表
在视觉SLAM中,可以用光流去追一些特征点,角点(一张图像上的部分像素),所以一般用的都是稀疏光流。

1.1、LK光流

  • 设在t时刻位于(x,y)处的像素的灰度为I(x,y,t) ; 其中I(x,y,t)为 在t时刻,x,y坐标的灰度值
  • 在t+Δt时刻运动了(x+dx,y+dy)处,其灰度值为:I(x+dx,y+dy,t+dt)
    我们想计算dx,dy
  • 假设灰度不变I(x+dx,y+dy,t+dt)=I(x,y,t)
    (是一个理想的假设,实际上可能会不成立)

多元函数 ( x k 1 , x k 2 , . . . . , x k n ) 处的泰勒展开公式 : f ( x 1 , x 2 , . . . . , x n ) = f ( x k 1 , x k 2 , . . . . , x k n ) + ∑ i = 1 n ( x i − x k i ) f x i ′ ( x k 1 , x k 2 , . . . . , x k n ) + 1 2 ! ∑ i , j = 1 n ( x i − x k i ) ( x j − x k j ) f i j ′ ′ ( x k 1 , x k 2 , . . . . , x k n ) + O n 多元函数(x_k^1,x_k^2,....,x_k^n)处的泰勒展开公式:\\ f(x^1,x^2,....,x^n)=f(x_k^1,x_k^2,....,x_k^n)+\sum_{i=1}^n(x^i-x_k^i)f_{x^i}'(x_k^1,x_k^2,....,x_k^n)\\ +\frac{1}{2!}\sum_{i,j=1}^n(x^i-x_k^i)(x^j-x_k^j)f_{ij}^{''}(x_k^1,x_k^2,....,x_k^n)+O^n 多元函数(xk1,xk2,....,xkn)处的泰勒展开公式:f(x1,x2,....,xn)=f(xk1,xk2,....,xkn)+i=1n(xixki)fxi(xk1,xk2,....,xkn)+2!1i,j=1n(xixki)(xjxkj)fij′′(xk1,xk2,....,xkn)+On

I ( x + d x , y + d y , t + d t ) = I ( x , y , t ) 对 t + d t 时刻的灰度进行泰勒一阶展开并保留一阶项 I ( x + d x , y + d y , t + d t ) ≈ I ( x , y , t ) + ∂ I ∂ x d x + ∂ I ∂ y d y + ∂ I ∂ t d t   由灰度不变 ∂ I ∂ x d x + ∂ I ∂ y d y + ∂ I ∂ t d t = 0    ⟹    ∂ I ∂ x d x d t + ∂ I ∂ y d y d t = − ∂ I ∂ t . ⇓ I x u + I y v = − I t   ∂ I ∂ x : 图像在 x 方向上的梯度 I x .   ∂ I ∂ y : 图像在 y 方向上的梯度 I y     ∂ x ∂ t : x 方向的速度 u                     ∂ x ∂ t : y 方向的速度 v                     ∂ I ∂ t : 图像灰度关于时间的变化 I t I(x+dx,y+dy,t+dt)=I(x,y,t)\\ 对t+dt时刻的灰度进行泰勒一阶展开并保留一阶项\\ {\color{#F00} I(x+dx,y+dy,t+dt) ≈I(x,y,t)+\frac{\partial I }{\partial x}dx+\frac{\partial I }{\partial y}dy+\frac{\partial I }{\partial t}dt}\\~\\ 由灰度不变 \qquad \frac{\partial I }{\partial x}dx+\frac{\partial I }{\partial y}dy+\frac{\partial I }{\partial t}dt=0 \implies \frac{\partial I }{\partial x}\frac{dx}{dt}+\frac{\partial I }{\partial y}\frac{dy}{dt}=-\frac{\partial I }{\partial t}.\\ \Downarrow\\{\color{#F00} I_xu+I_yv=-I_t }\\ ~\\ \begin{matrix} \frac{\partial I}{\partial x}: 图像在x 方向上的梯度I_x.\\~\\ \frac{\partial I}{\partial y}: 图像在y 方向上的梯度I_y~\\ ~\\ \frac{\partial x}{\partial t}: x方向的速度u ~~~~~~~~~~~~~~~~~\\~\\ \frac{\partial x}{\partial t}: y方向的速度v ~~~~~~~~~~~~~~~~~\\~\\ \frac{\partial I}{\partial t}: 图像灰度关于时间的变化I_t\\ \end{matrix} I(x+dx,y+dy,t+dt)=I(x,y,t)t+dt时刻的灰度进行泰勒一阶展开并保留一阶项I(x+dx,y+dy,t+dt)I(x,y,t)+xIdx+yIdy+tIdt 由灰度不变xIdx+yIdy+tIdt=0xIdtdx+yIdtdy=tI.Ixu+Iyv=It xI:图像在x方向上的梯度Ix. yI:图像在y方向上的梯度Iy  tx:x方向的速度u                  tx:y方向的速度v                  tI:图像灰度关于时间的变化It


I x u + I y v = − I t {\color{#F00} I_xu+I_yv=-I_t } Ixu+Iyv=It
这里未知量是u和v, 上式为一个二元一次方程,使用一个像素点无法求出
–需要引用额外的约束
(不仅假设像素灰度值不变,而且要假定一个窗口内的像素具有相同的运动)
考虑一个大小为w×w的窗口,则含有w2数量个像素
[ I x I y ] k [ u v ] = − I t k , k = 1 , 2 , . . . , w 2 . [I_x\quad I_y]_k\begin{bmatrix} u\\v \end{bmatrix}=-I_{tk}, \qquad k=1,2,...,w^2. [IxIy]k[uv]=Itk,k=1,2,...,w2.
超定方程,通过最小二乘解出来求得运动u,v
A = [ [ I x , I y ] 1 ⋮ [ I x , I y ] k ] , b = [ I t 1 ⋮ I t k ] .    ⟹    A [ u v ] = − b .    ⟹    [ u v ] ∗ = − ( A T A ) − 1 A T b . A=\begin{bmatrix} [I_x,I_y]_1\\ \vdots[I_x,I_y]_k \end{bmatrix}, b=\begin{bmatrix} I_t1\\ \vdots \\I_{tk} \end{bmatrix}. \implies A\begin{bmatrix} u\\v \end{bmatrix}=-b. \implies \begin{bmatrix} u\\v \end{bmatrix}^*=-(A^TA)^{-1}A^Tb. A=[[Ix,Iy]1[Ix,Iy]k],b= It1Itk .A[uv]=b.[uv]=(ATA)1ATb.

最小二乘解 : A x = − b 则 e = A x + b min ⁡ ∣ ∣ e ∣ ∣ 2 = min ⁡ ( A x + b ) T ( A x + b ) = min ⁡ ( x T A T A x + 2 x T A T b + b T b ) d ∣ ∣ e ∣ ∣ 2 d x = 2 A T A x + 2 A T b = 0 x = − ( A T A ) − 1 A T b 最小二乘解:Ax=-b \qquad则e=Ax+b \qquad \\ \min||e||_2=\min(Ax+b)^T(Ax+b)=\min(x^TA^TAx+2 x^TA^Tb+b^Tb)\\ \frac{d||e||_2}{dx}=2A^TAx+2A^Tb=0\\ x=-(A^TA)^{-1}A^Tb 最小二乘解:Ax=be=Ax+bmin∣∣e2=min(Ax+b)T(Ax+b)=min(xTATAx+2xTATb+bTb)dxd∣∣e2=2ATAx+2ATb=0x=(ATA)1ATb


问题:我们把光流写成了非线性优化问题,就必须假设优化的初始值靠近最优解.才能在一定程度上保证算法的熟练。如果相机运动较快,两章图像差异较为明显,那么单层图像光流法容易达到一个局部最小值。这种情况可以通过图像金字塔来改善。在这里插入图片描述
解决:图像金字塔是指对不同一个图像进行缩放,得到不同分辨率的图像, 如图8-2所示.
流程图:在这里插入图片描述
  由粗至精的好处在于,当原始图像的像素运动较大时,在金字塔顶层的图像看来,运动仍然在一个很小的范围内。例如,原始图像的特征点运动了20个像素,很容易由于图像非凸性导致优化困在极小值里。但现在假设没有缩放倍率0.5倍的金字塔,那么往上两层图像里,像素运动就只有5个像素了,这时结果就明显好于直接在原始图像上优化。
在这里插入图片描述

二、直接法

  • 光流仅估计了像素间的平移,但是没有用到相机本身的集合结构(投影模型)以及考虑相机的旋转和图像的缩放
  • 直接法考虑了这些信息
    在这里插入图片描述

直接法的推导:
已知:三维点在第一个相机坐标系下的三维坐标 P = ( X Y Z ) P=\begin{pmatrix} X\\Y\\Z \end{pmatrix} P= XYZ 两张图像的灰度值; 三维点投影在第一章图像上的像素坐标p1;
未知:图像1到图像2的位姿
假设:灰度不变假设 (光度不变)
目标: min ⁡ T J ( T ) = ∑ i = 1 N e i T e i , e i = I 1 ( p 1. i ) − I 2 ( p 2 , i ) . \min_TJ(T)=\sum^N_{i=1}e_i^Te_i, \qquad e_i=I_1(p_{1.i})-I_2(p_{2,i}). TminJ(T)=i=1NeiTei,ei=I1(p1.i)I2(p2,i).
思想:先初始化一个不准确的位姿,计算p2,根据p2和p1的灰度值差异,不断迭代调整位姿

2.1 公式推导

像素坐标与相机坐标:
p 1 = [ u v 1 ] 1 = 1 Z 1 K P . p 2 = [ u v 1 ] 2 = 1 Z 2 K ( RP+t ⏟ q ) = 1 Z 2 K ( e x p ( ξ ∧ ) P ) 1 : 3 其中 q 是以 p 2 为相机坐标 p_1=\begin{bmatrix} u\\v\\1 \end{bmatrix}_1=\frac{1}{Z_1}KP.\\p_2=\begin{bmatrix} u\\v\\1 \end{bmatrix}_2=\frac{1}{Z_2}K(\underbrace{\fbox{RP+t}}_{\rm q} )=\frac{1}{Z_2}K(exp(\xi^\wedge)P)_{1:3}\\ 其中q是以p_2为相机坐标 p1= uv1 1=Z11KP.p2= uv1 2=Z21K(q RP+t)=Z21K(exp(ξ)P)1:3其中q是以p2为相机坐标
在这里插入图片描述

min ⁡ T J ( T ) = ∑ i = 1 N e i T e i , e i = I 1 ( p 1. i ) − I 2 ( p 2 , i ) . \min_TJ(T)=\sum^N_{i=1}e_i^Te_i, \qquad e_i=I_1(p_{1.i})-I_2(p_{2,i}). TminJ(T)=i=1NeiTei,ei=I1(p1.i)I2(p2,i).
q为了p在第二个相机坐标系下的坐标,u为它的像素坐标
e ( T ) = I 1 ( p 1 ) − I 2 ( u ) , e(T)=I_1(p_1)-I_2(u), e(T)=I1(p1)I2(u),
我们关心误差e是如何随着相机位姿T变化的,需要分析他们的导数关系
∂ e ∂ T = − ∂ I 2 ∂ u ∂ u ∂ q ∂ q ∂ δ ξ \frac{\partial e}{\partial T}=-\frac{\partial I_2}{\partial u}\frac{\partial u}{\partial q}\frac{\partial q}{\partial \delta\xi} Te=uI2quδξq

  • (1) ∂ I 2 ∂ u 为 u 处的像素梯度 \frac{\partial I_2}{\partial u}为u处的像素梯度 uI2u处的像素梯度
  • (2) ∂ u ∂ q 为 投影方程 关于 相机坐标系下的三维点 的导数 , 记 q = ( X Y Z ) \frac{\partial u}{\partial q}为{\color{#00F}投影方程}关于{\color{#00F}相机坐标系下的三维点}的导数,记q=\begin{pmatrix}X\\Y\\Z \end{pmatrix} qu投影方程关于相机坐标系下的三维点的导数,q= XYZ
    u = f x X + c x Z , v = f y Y + c y Z ⟹ ∂ 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 ] u=\frac{f_xX+c_x}{Z}, v=\frac{f_yY+c_y}{Z}\Longrightarrow\frac{\partial u}{\partial q}=\begin{bmatrix} \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{bmatrix}=\begin{bmatrix} \frac{f_x}{Z} &0&-\frac{f_xX}{Z^2}\\~\\ 0&\frac{f_y}{Z}&-\frac{f_yY}{Z^2} \end{bmatrix} u=ZfxX+cx,v=ZfyY+cyqu= Xu XvYuYvZuZv = Zfx 00ZfyZ2fxXZ2fyY
    (3) ∂ q ∂ δ ξ 为变换后的三维点对变换的导数 : ∂ q ∂ δ ξ = [ I , − q ∧ ] . \frac{\partial q}{\partial \delta \xi}为变换后的三维点对变换的导数:\\ \frac{\partial q}{\partial \delta \xi}=[I,-q^\wedge]. δξq为变换后的三维点对变换的导数:δξq=[I,q].
    由(2)和(3)上式可知:
    ∂ 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 ′ ] \frac{\partial u}{\partial \delta \xi}=\begin{bmatrix} \frac{f_x}{Z} & 0&-\frac{f_xX}{Z^2}&-\frac{f_xXY}{Z^2}&f_x+\frac{f_xX^2}{Z^2}&-\frac{f_xY}{Z}\\~\\ 0 & \frac{f_y}{Z} & -\frac{f_yY}{Z^2} &-f_y-\frac{f_yY^2}{Z^2}&\frac{f_yXY}{Z^2}&\frac{f_yX}{Z'} \end{bmatrix} δξu= Zfx 00ZfyZ2fxXZ2fyYZ2fxXYfyZ2fyY2fx+Z2fxX2Z2fyXYZfxYZfyX
    误差相对于李代数的雅可比矩阵:
    J = − ∂ I 2 ∂ u ∂ u ∂ δ ξ . \color{#F00}J=-\frac{\partial I_2}{\partial u}\frac{\partial u}{\partial \delta \xi}. J=uI2δξu.

— 根据使用的图像信息不同,可以分为:
稀疏直接法:     只处理稀疏角点或关键点
半稠密直接法: 使用部分梯度明显的像素
稠密直接法:     使用所有像素


总结

在这里插入图片描述
引用:
视觉SLAM十四讲_视觉里程计

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在《视觉SLAM十四》中,章节安排如下: 1. 数学基础部分:介绍这本书的基本信息,包括自测题。概述SLAM系统的组成和各模块的工作。介绍三维空间运动、李群和李代数、针孔相机模型以及非线性优化。完成一个曲线拟合的实验。 2. SLAM技术部分:解特征点法的视觉里程计,包括特征点的提取与匹配、对极几何约束的计算、PnP和ICP等方法。学习直接法的视觉里程计,包括光流和直接法的原理,并使用g2o实现一个简单的RGB-D直接法。构建一个视觉里程计框架,解决优化和关键帧选择的问题。深入讨论后端优化,包括Bundle Adjustment和位姿图的优化。介绍回环检测和地图构建的方法。最后,介绍当前的开源SLAM项目和未来的发展方向。 另外,对于四元数的学习,可以先了解复平面的概念。复平面是一个用来描述复数的平面,其中实部和虚部分别对应平面的横坐标和纵坐标。了解复平面后,可以开始学习四元数的概念和应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [视觉SLAM十四笔记](https://blog.csdn.net/dada19980122/article/details/111404967)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【视觉SLAM十四】笔记【逐行代码带你解析】【适合纯小白 ps:因为我就是】(持续更新中)](https://blog.csdn.net/R_ichun/article/details/131964588)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值