视觉SLAM14讲笔记-第7讲-视觉里程计1

2023-11-19

图像特征点

特征点由关键点描述子两部分组成。我们说的特征点具有旋转不变性,都是指的是特征点的描述子具有旋转不变性,而描述子指的是一个点周围的特征,一般由一个向量组成,描述一个点附近的特征(比如45度方向是亮的,135度方向是暗的等)
比较著名的图像特征点包括SIFT、SURF、ORB等。
ORB提取速度比较快,所以在特征点法来获得视觉里程计一般使用ORB算子。

特征匹配

当特征点数量很大时,暴力匹配法的运算量将变得很大,特别是当我们想要匹配一个帧和一张地图的时候。OpenCV中我们会用到快速近似最临近(FLANN)算法来处理这个匹配问题,目前已经比较成熟也已经集成到OpenCV中。

计算相机之间的相对位姿

1.当相机为单目时,我们只知道2D的像素坐标,因而问题是根据两组2D点来估计运动,该问题用对极几何来解决。
2.当相机为双目,RGB-D时,或者通过某种方法得到了距离信息,那么问题就是根据两组3D点估计运动。该问题通常用icp来解决。
3.如果有3D点及其在相机的投影位置,也能估计相机的运动。该问题通过PnP求解。

2D-2D

图像运动解析中最出名的就是对极约束。它以公式简洁著称,本质矩阵如下:
E = t ∧ R E = t^{\wedge}R E=tR
t是平移变量,R是旋转变量。可以理解为本质就是t和R。

基础矩阵就是加上相机内参矩阵K,如下:
F = K − T E K − 1 F=K^{-T}EK^{-1} F=KTEK1

本质矩阵的求解使用的是8点法,细节这里不再展开复述,使用的公式如下:
x 2 T E x 1 = p 2 T F p 1 = 0 x_2^{T}Ex_1=p_2^{T}Fp_1 = 0 x2TEx1=p2TFp1=0

单应矩阵的引出
当在所有特征点都在同一个平面上,例如相机看到的棋盘格,无人机俯视看到的地面等。两个不同姿态下的相机,看到同一个平面的特征时,这两张图像之间的旋转平移关系(R和t)可以用单应矩阵表示。
单应矩阵可以使用4点法来求解,这里不再复述,使用的公式如下:
p 2 = H p 1 p_2 = Hp_1 p2=Hp1

三角测量的引出:
在SLAM中,我们主要用三角化来估计像素点的距离。
按照对极几何中的定义,设 x 1 x_1 x1, x 2 x_2 x2为两个特征点的归一化坐标,那么他们满足:
s 1 x 1 = s 2 R x 2 + t s_1x_1 = s_2Rx_2+t s1x1=s2Rx2+t
现在我们已经知道了R,t,想要求解的是两个特征点的深度 s 1 s_1 s1 s 2 s_2 s2。如果要算 s 2 s_2 s2,那么先对上式两侧左乘一个 x 1 ∧ x_1^{\wedge} x1,得:
s 1 x 1 ∧ x 2 = 0 = s 2 x 1 ∧ R x 2 + x 1 ∧ t s_1x_1^{\wedge}x_2 = 0 = s_2x_1^{\wedge}Rx_2+x_1^{\wedge}t s1x1x2=0=s2x1Rx2+x1t
可以根据上式直接求解 s 2 s_2 s2

三角化的矛盾:
平移太小,则三角化精度不够,而平移过大,会导致匹配失效。

3D-2D:PnP:(Perspective-n-Point):透视n点法
是最重要的姿态估计方法!
是最重要的姿态估计方法!
是最重要的姿态估计方法!
重要的事情说3遍。
PnP是求解3D到2D点对运动的方法。它描述了当知道n个3D空间点及其投影位置时,如何估计相机的位姿。前面说到,2D-2D的对极几何方法需要8个或8个以上的点对,且存在着初始化、纯旋转和尺度的问题。然而。如果两张图像中其中一张特征点的3D位置已知,那么最少只需3个点对(需要知道一个额外点验证结果)就可以估计相机运动。特征点的3D位置可以由三角化或者RGB-D相机的深度图确定。因此,在双目或RGB-D的视觉里程计中,我们可以直接使用PnP估计相机运动。而在单目视觉里程计中,必须先进行初始化,然后才能使用PnP。3D-2D方法不需要使用对极约束,又可以在很少的匹配点中获得较好的运动估计,是最重要的一种姿态估计方法。

PnP的计算方法有很多,例如,用3对点估计位姿的P3P、直接线性变换(DLT)、EPnP、UPnP等等。此外,还能用非线性优化的方式,构建最小二乘问题并迭代求解,也就是万金油式的Bundle Adjustment。

这里我们只看一下Bundle Adjustment,学术上也叫光束法平差。

前面说的线性方法,往往是先求相机位姿,再求空间点位置,而非线性优化则是把他们都看成优化变量,放在一起优化。

重投影误差的引出
BA中的残差方程就是重投影误差,考虑n个三维空间点P及其投影p,我们希望计算相机的位姿R,t,它的李代数表示为 ξ \xi ξ
s i [ u i v i 1 ] = K e x p ( ξ ∧ ) [ X i Y i Z i 1 ] s_i {\begin{bmatrix} u_i \\ v_i \\ 1 \end{bmatrix}} = Kexp({\xi}^{\wedge}){\begin{bmatrix} X_i \\ Y_i \\ Z_i \\ 1 \end{bmatrix}} si uivi1 =Kexp(ξ) XiYiZi1

注意这里的 ξ \xi ξ代表的是se(3)。
构建残差方程:
ξ ∗ = a r g m i n 1 2 ∑ i = 1 n ∥ u i − 1 s i K e x p ( ξ ∧ ) P i ∥ 2 {\xi}^{*} = arg min\frac{1}{2}\sum_{i=1}^n \begin{Vmatrix} u_i-\frac{1}{s_i}Kexp({\xi}^{\wedge})P_i \end{Vmatrix}^{2} ξ=argmin21i=1n uisi1Kexp(ξ)Pi 2

首先记变换到相机坐标系下的空间点坐标为 P ′ P^{'} P,并且将其前3维取出来:
P ′ = ( e x p ( ξ ∧ ) P ) 1 : 3 = [ X ′ , Y ′ , Z ′ ] P^{'}=(exp({\xi}^{\wedge})P)_{1:3}={\begin{bmatrix}X^{'},Y^{'},Z^{'} \end{bmatrix}} P=(exp(ξ)P)1:3=[X,Y,Z]

相机投影模型相对于 P ′ P^{'} P
s ∗ u = K P ′ s*u = KP^{'} su=KP

展开可以得到
u = f x X ′ Z ′ + c x u=f_x{\frac{X^{'}}{Z^{'}}}+c_x u=fxZX+cx
u = f y Y ′ Z ′ + c y u=f_y{\frac{Y^{'}}{Z^{'}}}+c_y u=fyZY+cy

在定义了中间变量后,我们对 ξ ∧ \xi^{\wedge} ξ左乘扰动量 δ ξ \delta{\xi} δξ,然后考虑e的变化关于扰动量的导数。利用链式法则,可以列写如下:
ϑ e ϑ δ ξ = lim ⁡ δ ξ → 0 e ( δ ξ ⨁ ξ ) δ ξ = ϑ e ϑ P ′ ϑ P ′ ϑ δ ξ \frac{\vartheta{e}}{\vartheta{\delta\xi}} = \lim_{{\delta{\xi}{\to}0}}{\frac{e({\delta{\xi}{\bigoplus}{\xi}})}{\delta{\xi}}}= \frac{\vartheta e}{\vartheta P^{'}} \frac{\vartheta P^{'}}{\vartheta {\delta} {\xi}} ϑδξϑe=δξ0limδξe(δξξ)=ϑPϑeϑδξϑP

这里写一下误差关于投影点的导数
ϑ e ϑ P ′ = − [ ϑ u ϑ X ′ ϑ u ϑ Y ′ ϑ u ϑ Z ′ ϑ v ϑ X ′ ϑ v ϑ Y ′ ϑ v ϑ Z ′ ] \frac {\vartheta e} {\vartheta P^{'}} = - \begin{bmatrix}\frac{\vartheta u}{\vartheta X^{'}} & \frac{\vartheta u}{\vartheta Y^{'}} &\frac{\vartheta u}{\vartheta Z^{'}} \\ \frac{\vartheta v}{\vartheta X^{'}} & \frac{\vartheta v}{\vartheta Y^{'}} & \frac{\vartheta v}{\vartheta Z^{'}} \end{bmatrix} ϑPϑe=[ϑXϑuϑXϑvϑYϑuϑYϑvϑZϑuϑZϑv]

后面关于误差关于李代数及空间点的导数,细节不再复述。经过这个步骤,我们推导出了观测相机方程关于相机位姿与特征点的两个导数矩阵。它们之分重要,能够在优化过程中提供重要的梯度方向,指导优化的迭代。

3D-3D:ICP

假设我们有一组配对好的3D点(比如我们对两幅RGB-D图像进行了匹配),我呢就可以使用ICP求解。
ICP的求解也分为两种方式:利用线性代数的求解(主要是SVD),以及利用非线性优化的方式求解。这里不再一一复述。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

视觉SLAM14讲笔记-第7讲-视觉里程计1 的相关文章

  • css 实现相关案例

    css 实现相关案例 抽屉案例 带吸附箭头
  • ES删除数据

    ES删除数据 注意 删除数据请谨慎执行 删除大于 日期的 其他场景可参照执行 DeleteQuery deleteQuery new DeleteQuery deleteQuery setIndex es中 index deleteQuer
  • ORACLE数据库备份管理-rman备份到NFS

    1 相关案例 1 df h无法正常显示文件系统挂载情况 使用如下命令进行处理 umount f nfsdir 2 节点启动出现问题 询问是否包含nfs服务 将分享节点nfs服务重启 1 案例1从linux linux 实施脚本如下 mkdi
  • LeetCode 237. 删除链表中的节点

    题目链接 点击这里 Definition for singly linked list public class ListNode int val ListNode next ListNode int x val x class Solut

随机推荐

  • 深度学习(一)深度学习的概念

    什么是深度学习 深度学习是机器学习与神经网络 人工智能 图形化建模 优化 模式识别和信号处理等技术融合后产生的一个领域 深度学习网路是神经网络革命性的发展 人们甚至认为可以用它来创建更加强大的预测模型 深度学习的分类 深度学习使用多层机器学
  • CMakeLists中条件判断: if()-endif()成对出现

    缺少endif 时提示代码块opening is not closed 1 if if xxx 要缩进 endif 2 if else if xxx 要缩进 else xxx 要缩进 endif
  • Windows RuntimeError: Distributed package doesn‘t have NCCL built in问题

    问题描述 python在windows环境下dist init process group backend rank world size 处报错 RuntimeError Distributed package doesn t have
  • Serilog + SQL Server 动态分表记录日志

    Serilog SQL Server 分表记录日志 Serilog SQL Server 动态分表记录日志 依赖包 安装依赖包 配置 appsettings json 配置 Program cs Serilog SQL Server 动态分
  • visio 科学图形包_Gnuplot科学绘图(三十九)——地图及圆圈数据图

    Gnuplot科学绘图 系列内容Gnuplot科学绘图 三十一 曲线色彩填充 Gnuplot科学绘图 三十二 填充风格Gnuplot科学绘图 三十三 柱状图Gnuplot科学绘图 三十四 阶梯图Gnuplot科学绘图 三十五 数据平滑Gnu
  • element-ui中日期区间组件

    elementui中日期组件使用 最长只能选择3个月 不限制禁用日期 描述 时间组件代码 描述 点击 确定 按钮进行验证 点击 清空 按钮 清空输入框中的数据 时间范围不能超过3个月 并添加快捷选择今天 最近一周 最近一月 最近3个月 以下
  • js正则 年龄只能为正数,不能为负数,且不能超过150

    需求 要对输入的年龄加条件限制 不能任意输入 只能为正数 不能输入小数 负数
  • 正则表达式(日期、金额、特殊字符)_java语言

    正则表达式 java 正则表达式在线测试网站 个人觉得还算精确 http tool chinaz com regex 备注 如有错误 希望留言指出 虚心请教 金额格式 正数 包含至多2位小数 第1种形式 校验金额格式是否正确 正数 包含至多
  • Android OpenCv 提取图像的RGB三原色分割图像Split Core.split

    基础知识 如果你还不了解 图片 是如何存储的 建议先去看这篇文章 关于三通道彩色图像的存储方式理解 函数简析 我们都知道 彩色图片每个像素点都对应三个值 如 R G B Core split 这个函数则是帮我们这三个值分开 即分别提取 R
  • VUE3快速上手--知识点

    本文是根据B站尚硅谷的视频 尚硅谷Vue2 0 Vue3 0全套教程 全网最新最强vuejs从入门到精通 Vue3部分形成的笔记 一 简介 2020年9月18日 Vue js发布3 0版本 代号 One Piece 海贼王 Vue3相比Vu
  • fileinclude (攻防世界web)

    题目 从题目页面可得到对我们有用的信息 flag存放在了flag php中 并且还知道了当前页面的绝对路径 分析完当前页面能够获取到的所有信息后 查看页面源代码试试 发现得到了主页的php源码 分析以上源码 可知其中 lan为我们可控的 并
  • CentOS安装mariadb

    1 安装 root localhost yum install mariadb mariadb server 2 启动并自启 root ecs 3f21 systemctl enable mariadb now 3 查看启动状态 root
  • CLIP 改进工作

    Contents 图像分类 IJCV 2022 Learning to prompt for vision language models Introduction Context Optimization CoOp Experiments
  • Quartz定时任务详解

    一 添加依赖
  • android Instrumentation

    Android提供了一系列强大的测试工具 它针对Android的环境 扩展了业内标准的JUnit测试框架 尽管你可以使用JUnit测试Android工程 但Android工具允许你为应用程序的各个方面进行更为复杂的测试 包括单元层面及框架层
  • VUE中用原生JS实现触底加载数据

    VUE中用原生JS实现触底加载数据 在vue开发过程中使用第三方组件是不可避免的 但是第三方样式的css样式属实头痛 所以我选择原生JS的写法完成了触底加载 1 定义data page 1 页数 limit 10 每页数据条数 flag t
  • 单项选择题标准化考试系统

    单项选择题标准化考试系统 学校将大一上学期期末的c语言课程设计放进下学期开学 我选取的c课程设计题目是 单项选择题标准化考试系统 参考了csdn一些大佬的文章 终于做出来了 接下来 我将与大家一起浏览该系统 系统还有很多不足之处 欢迎提建议
  • 向顺序表插入新元素且不破坏其顺序性的高效率算法

    向顺序表L插入新元素x时可以由最后一个元素开始遍历 在遍历的同时进行移位赋值操作 如当遍历到的元素L elem i 比x大时 将L elem i 后移在下个元素的位置 而其所在位置则由x占有 当遍历到的元素L elem i 比x小时 则跳出
  • VS 2008配置Winpcap环境

    写在前面的话 这篇博客主要是写给小白看的 因为自己也是一个小白 之前从没有接触过网络嗅探器这些东西 如果说基础的话就是学习过计算机网络 对于计算机网络有一点点了解 再就是对于编程语言基础语法还算熟悉吧 这学期选修了网络攻击与防范这门课程 老
  • 视觉SLAM14讲笔记-第7讲-视觉里程计1

    图像特征点 特征点由关键点和描述子两部分组成 我们说的特征点具有旋转不变性 都是指的是特征点的描述子具有旋转不变性 而描述子指的是一个点周围的特征 一般由一个向量组成 描述一个点附近的特征 比如45度方向是亮的 135度方向是暗的等 比较著