去掉左边0_SLAM从0到1——11. 视觉里程计VO内容框架

49fc051ef5076db74ab4058a3bcc13a8.png

「本文是之前学习VO 部分整理的思维导图,笔记写入之后均折叠了起来,正文中采用markdown格式展开,可看到笔记内容」

放上来的目的其实是方便自己查阅笔记,同样给有需要的同学提供一点思路。

整体上的结构分为5部分,包括常用特征点介绍、运动估计、深度估计、光流法、直接法。按照这个顺序可以比较好的回忆和串联内容,建议的阅读方式为:主要看思维导图,遇到不清楚的地方去下文找笔记和具体内容。

3b55ada063fb348b24996326b50e8d54.png

# 视觉里程计VO## 常见特征点### ORB
- 关键点:Oriented FAST
- 检测亮度变化明显处
- 步骤
- ①像素p_{i}的亮度I_{p_{i}}
- ②阈值T
- ③半径=3,16个像素点
- ④预处理:1,5,9,13至少三个满足阈值条件
- ⑤连续12个像素点满足阈值条件
- ⑥灰度质心计算方向
- 描述子:BRIEF(二进制)
- ORB特征点提取
- 1. 提取FAST角点
- 方向问题:计算灰度质心
- 尺度问题:构建图像金字塔
- 2. 计算BRIEF描述子
- 特征点匹配
- 二进制描述子
- 汉明距离
<2*最小距离 || < 阈值
- 浮点类描述子
- 欧氏距离### SIFT
尺度不变特征变换(Scale invariant feature Transform,SIFT)https://blog.csdn.net/songzitea/article/details/13627823
- 原理相关
- 高斯差分 DOG
- 对各层图像进行不同程度的高斯滤波后形成DOG金字塔
- 特征的特点
- 具有图像尺度
- 具有旋转不变形
对应着下方求关键点方向:为每一个特征点都计算了方向,后面的操作都在各个点的方向上进行,保证了旋转不变形
- 对光照变化也具有一定程度的不变性
- 目标是解决低层次特征提取
- 可减少低由遮挡、杂乱和噪声引起的低提取概率
- 缺点
- ①实时性低
- ②特征点少
- ③对边缘光滑的图像有时无能为力
- 步骤
可以看到计算量很大,因此实时性不容易满足
SIFT算法建立一幅图像的金字塔,在每一层进行高斯滤波并求取图像差(DOG)进行特征点的提取
- 1. 尺度空间极值检测
- ①由原图像生成图像金字塔
- ②关键点初步探查
非极大值抑制
通过检测不同层之间的图像的极值点来进行关键点的初步探查。
过程很简单,就是与周围的像素点进行比较,当大于或小于所有相邻点时,即为极值点。下图中的X不仅要跟周围的O进行比较,还要跟上一层和下一层的9x2个O进行比较,才能确定是否是极值点。
- ③拟合真正极值点
使用泰勒展开式
- 2. 关键点定位
- ①去除低对比度特征点
- ②去除不稳定边缘相应点
- 3. 求取特征点方向
利用关键点邻域像素的梯度方向分布特性,我们可以为每个关键点指定方向参数方向,从而使描述子对图像旋转具有不变性,我们通过求每个极值点的梯度来为极值点赋予方向。
对于在DOG金字塔检测到的关键点,采集所在图像3σ邻域窗口内像素的梯度和方向特征,并进行统计。取幅值最高的方向为主方向,超过峰值百分之80的方向为辅方向。
- 4. 求描述子描述关键点
为了保证特征向量具有旋转不变性,需要将坐标轴旋转到关键点的方向。
- 5. 生成特征匹配点
将特征点邻域分为几个区块,计算八个方向的梯度方向直方图。这里有16个区域,所以生成了16x8=128个维度的数据。在进行统计之前,还要进行一次高斯加权,特征点附近的区域权值大,相反权值小。### SURF
Speeded Up Robust Featureshttps://blog.csdn.net/songzitea/article/details/16986423
- 与SIFT相似
- 是SIFT加强版,同时加速的具有鲁棒性的特征
- SIFT:较稳定,检测特征点更多,但复杂度较高
- SURF:运算简单,效率高,运算时间短
- SIFT先利用非极大抑制,再用到Hessian矩阵进行滤除;SURF先用Hessian矩阵,再进行非极大抑制。
- 特征
- 采用了harr特征
- 采用了积分图像integral image概念
- 步骤
SURF使用Hessian Matrix进行特征点的提取,所以海塞矩阵是SURF算法的核心
- ①构建海塞矩阵
由于我们的特征点需要尺度无关性,所以在进行Hessian矩阵构造前,需要对其进行高斯滤波。
- ②尺度空间生成
图像的尺度空间是这幅图像在不同解析度下的表示。
在进行高斯模糊时,SIFT的高斯模板大小是始终不变的,只是在不同的octave之间改变图片的大小。
而在SURF中,图片的大小是一直不变的,不同的octave层得到的待检测图片是改变高斯模糊尺寸大小得到的,同一octave中的图片用到的高斯模板尺度也不同。
- ③非极大抑制初步确定特征点和精确定位特征点
将经过hessian矩阵处理过的每个像素点与其3维领域的26个点进行大小比较,如果它是这26个点中的最大值或者最小值,则保留下来,当做初步的特征点。
然后,采用3维线性插值法得到亚像素级的特征点,同时也去掉那些值小于一定阈值的点,增加极值使检测到的特征点数量减少,最终只有几个特征最强点会被检测出来。
- ④确定特征点主方向
在SURF中,不统计其梯度直方图,而是统计特征点领域内的Harr小波特征。
即以特征点为中心,计算半径为6s(S为特征点所在的尺度值)的邻域内,统计60度扇形内所有点在x(水平)和y(垂直)方向的Haar小波响应总和(Haar小波边长取4s),并给这些响应值赋高斯权重系数,使得靠近特征点的响应贡献大,而远离特征点的响应贡献小,然后60度范围内的响应相加以形成新的矢量,遍历整个圆形区域,选择最长矢量的方向为该特征点的主方向。这样,通过特征点逐个进行计算,得到每一个特征点的主方向。
- ⑤构造描述子## 由匹配点估计相机运动### 单目相机:2D-2D
- 对极约束
- x_{2}^{T}*E*x_{1} = p_{2}^{T}*F*p_{1} = 0
- 本质矩阵 E = t^R
- ①内在性质:奇异值为[σ,σ,0]
- ②不同尺度下等价:尺度等价性
- ③由于②,自由度为6-1=5个
- 基础矩阵 F = K^{-T}*E *K^{-1}
- 单应矩阵 H = R - t*n^{T}/d
- 描述两个平面映射关系
- 用于特殊情况:特征点位于同一平面
- 求解方法:直接线性变换 DLT
- 求解步骤
- 1. 根据配对点计算 E 或者 F
- 2. 根据 E or F or H 计算 R 和 t
实际中往往同时估计E/F/H,选择重投影误差最小的作为最终的运动估计矩阵
- ①由于自由度为5,最少用5对点求解
- ②常用8点法,即8对点
- ③对 E 进行奇异值分解(SVD)
- ④由于E的尺度不变形,直接取奇异值矩阵Σ=diag (1, 1, 0)
- 存在问题
- 尺度不确定性
- 来源于对 t 归一化
这么做的起因是E具有尺度等价性,因此 t 也具有尺度等价性,令其为1即称为归一化。
- 初始化
以 t 为单位1,计算相机运动和特征点的3D位置
- 纯旋转问题
- 单目SLAM初始化必须有平移
若平移t=0,那么E也将为0,就没法求解了
- 多余8对点
- 最小二乘解决
- 随机采样一致性(实际中采用)
可处理带错误匹配的数据,适用于误匹配时### 3D-2D
最重要的姿态(运动)估计方法。
3D位置可以由三角测量或者RGB-D深度图获得
- 无需使用对极约束
- PnP
(Perspective-n-Point)
- 使用情况
- 双目orRGB-D:直接使用
- 单目:必须经过初始化
- 求解方法
- DLT 直接线性变换
- ①使用齐次坐标P, x
P=(X, Y, Z, 1)
x=(u, v, 1):投影点用归一化坐标
- ②定义增广矩阵T
T = [ R | t]
显然包含了平移和旋转信息
- ③线性展开s*x = T*P
- ④对于R,从上面求解的T中去除左边3*3矩阵块进行分解
- P3P
使用3对配对点估计位姿
注意:
3D点的坐标是在世界坐标系中;
2D点坐标是在相机坐标系中
- ①三角形相似+余弦定理
- ②求解方程组,得到3D点在相机坐标系中的坐标
- ③利用3D-3D解法求解
- EPnP
Efficient PnP
- BA 非线性优化
Bundle Adjustment;
捆集调整/光束法平差
- 相机位姿与3D位置一起优化
优化变零即相机位姿(R, t)和特征点3D位置
- ①定义误差项 e =
e = u - KTP/s
被称为重投影误差
- ②构建最小二乘问题 T = arg min ||……||^{2}
- ③获得误差对于优化变零的雅克比矩阵
误差对于相机位姿李代数的雅克比矩阵
误差对于特征点3D位置的雅克比矩阵
- ④选择优化算法求解:GN/LM等
- 使用g2o实现BA优化
- ①声明图优化器
- ②配置优化求解器和梯度下降方法
- ③根据估计得到的特征点,将位姿和空间点放入图中
- ④调用优化函数进行求解### 双目、RGB-D:3D-3D
- 使用情况:匹配好的3D点对
未出现相机模型,在3D-3D情况下,与相机并没有关系
- 求解:ICP
ICP(Iterative Closest Point) 迭代最近点
这里说的ICP问题是指:已有特征匹配的情况下进行位姿估计的问题
- 线性代数求解:SVD
- 推导:定义误差项
e_{i} = p_{i} - ( R*p_{i}^{ ' } + t )
注意这里不要使用李群中的变换矩阵T
- 推导:构建最小二乘问题
- 推导:添项、展开、等价
- ICP的SVD求解步骤
- ①计算两组点质心位置,再计算各点去质心坐标
质心位置:p, p_{ ' }
q_{i} = p_{i} - p
q_{i}^{ ' } = p_{i}^{ ' } - p^{ ' }
- ②根据最小二乘优化问题计算 R
R^{*} = arg min ∑||q_{i} - R*q_{i}^{ ' } ||^{2}
- R的求解要用到SVD
- ①令W = ∑q_{i}*q_{i}^{ ' T }
- ②对W进行SVD:W = U*∑*V^{T}
- ③则R = U*V^{T}
- ③由得到的 R 计算 t
t = p - R*p^{ ' }
- 非线性优化:BA
- 以迭代方式寻找最优
- 求解步骤(类似PnP)
- ①以李代数表示位姿,构建目标函数
- ②推导雅克比矩阵(使用李代数扰动模型)
- ③选择优化算法求解
- 求解特点
- 存在无穷多解情况:失效
- 存在唯一解情况
- 极小值解即为全局最优解
- 意味着ICP求解可任意选定初值
- 实际使用中:混用PnP和ICP
- 特征点深度已知:
- 建模3D-3D误差
- 特征点深度未知:
- 建模3D-2D重投影误差## 由相机运动估计特征点空间位置### 三角测量
- 思路来源
- 单目SLAM无法通过单张图像获得像素深度信息
- 三角测量用于估计点的深度
- 步骤
- ①由对极约束得到了相机运动后
- ②再由相机运动估计特征点空间位置
- 定义
- ①在不同位置对同一个路标点进行观察
- ②从观察到的位置推断路标点深度
- 求解
- ① s_{2}*x_{2} = s_{1}*R*x_{1} + t
- ②已知R, t,求解s_{1}, s_{2}
- 两侧左乘x_{2}^{^}
- ①式等于0,求解s_{1}## 光流法### 光流
- 描述了像素在图像中的运动
- 分类
- 稠密光流
- 稀疏光流
- LK光流### 以LK光流为例
- 灰度不变假设
- 思路
- 下一时刻灰度等于之前的灰度
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) = 0
写成矩阵形式:
[I_x I_y] * [u v]_T = -I_t
- 某一窗口内的像素具有相同的运动
- 用途效果
常用于追踪角点。可以加速基于特征点法的视觉里程计算法。
- 多层光流法
构造图像金字塔,从顶层向底层进行计算,由粗至精的计算思路,相当于是:在顶层是粗略定位,往下做是不断精细化像素点。## 直接法### 思路
直接根据像素灰度信息获得相机运动和对应点的投影,因此不知道在第二幅图像中哪个 p_2 对应着 p_1 。此时我们根据估计的相机位姿来找 p_2 ,当估计的位姿不好时, p_2 与 p_1 会有明显不同(灰度不变假设),这时我们通过构造优化问题,不断调整位姿以减小像素灰度差别。### 分类
- 稀疏直接法
速度最快,只能计算稀疏的重构
- 半稠密直接法
只是用带有梯度的像素点
- 稠密直接法
计算所有像素点### 优缺点
- 优点
- 无需计算特征点及描述子,节省时间
- 只要求有像素梯度,无需特征点
- 可构建(半)稠密地图
- 缺点
- 非凸性问题带来的局部极小问题
- 单个像素不具备区分度
- 需要灰度不变假设,实际难以满足

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教程:如何实现Java OAuth 2.0以使用GitHub和Google登录

将Google和GitHub OAuth登录添加到Java应用程序的指南 我们添加到Takipi的最新功能之一是3rd party登录。 如果您像我一样懒惰&#xff0c;那么我想您也希望跳过填写表单和输入新密码的操作 。 只要有权限&#xff0c;许多人都希望使用第三方登录&#xff0c;只要他们要求的权…

柔性太阳能电池pdf_房车旅行如何做到电力无忧,那就选择一套合适的太阳能供电系统吧...

“旅行途中房车电力够不够用&#xff1f;”是众多车友在购买房车时会考虑的因素之一。而房车外部供电方式一般有三种&#xff1a;电网供电、发电机发电和太阳能发电&#xff0c;其中太阳能发电因其结构简单、体积小且轻、易安装、维护简单、寿命长不易损坏、一次性投资、循环利…

POJ 3617

题意&#xff1a;给定长度为N的字符串S&#xff0c;现要构造一个字符串T&#xff08;起初为空串&#xff09;。任意进行一下的一种操作&#xff1a; 1>从S的头部删除一个字符&#xff0c;加到T的尾部 2>从S的尾部删除一个字符&#xff0c;加到T的尾部 目的使T的字典序最小…

echarts的词云图表类型有哪些_数据可视化之常见12种图表类型分析

数据可视化有众多展现方式&#xff0c;不同的数据类型要选择适合的展现方法&#xff0c;今天友创云天就整理分析了几种常见的类型&#xff0c;给大家提供参考。1.饼图饼图是一个划分为几个扇形的圆形统计图表。每个扇形的弧长&#xff08;以及圆心角和面积&#xff09;大小&…

使用Spring Boot和注释支持配置Spring JMS应用程序

1.简介 在以前的文章中&#xff0c;我们学习了如何使用Spring JMS配置项目。 如果查看有关使用Spring JMS进行消息传递的文章介绍 &#xff0c;您会注意到它是使用XML配置的。 本文将利用Spring 4.1版本中引入的改进 &#xff0c;并仅使用Java config来配置JMS项目。 在这个示…

室内主题元素分析图_2020届室内设计专业优秀毕业设计作品展(五)

“环”食疗养生空间概念设计△建筑外立面▲LOGO前 言每当人们提及健康时&#xff0c;人们的反应往往是运动、睡眠和饮食。现代的青年上班族&#xff0c;又因为快节奏的生活&#xff0c;工作压力大&#xff0c;饮食的不规律&#xff0c;生活不良习性的增加&#xff0c;导致了各…

C++输入cin详解

C输入cin详解 输入原理&#xff1a; 程序的输入都建有一个缓冲区&#xff0c;即输入缓冲区。一次输入过程是这样的&#xff0c;当一次键盘输入结束时会将输入的数据存入输入缓冲区&#xff0c;而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的&#xf…

时间序列的截尾和拖尾_R语言:时间序列(一)

01 解决什么问题在社会活动中经常可见按照时间顺序记录下来的随机事件观察值&#xff0c;例如每年死亡人数序列&#xff0c;每年糖尿病发病人数序列&#xff0c;医院门诊每日诊治病例数序列。这类数据的特性是相邻时间点的观察值之间具有明显的相关性&#xff0c;这一特性不同于…

JVM崩溃时:如何调查最严重错误的根本原因

当应用程序崩溃时&#xff0c;您可以学到什么&#xff1f; 我认为&#xff0c;“后见之明是20 /”是最喜欢的短语之一托马斯罗梅尔 &#xff0c;工程ZeroTurnaround的副总裁。 好吧&#xff0c;我实际上不确定在他的短语中占什么位置&#xff0c;但是我已经听过他几次说了。 鉴…

常用个人密码管理软件

http://www.williamlong.info/archives/3100.html转载于:https://www.cnblogs.com/svennee/p/4099358.html

查看网口命令_20个常用Linux命令

今天总结几个非常常用的Linux命令,其中有几个在面试中很可能问相关命令的原理,比如后台运行命令。希望对大家有所帮助,最好自己去尝试在Linux操作系统中实践一下。 1、查看目录以及权限 在windows中,使用dir查看当前目录中文件。在Linux中使用ls(list)查看当前目录文件。 w…

中统计字符串长度的函数_SQL Server中的字符串分割函数

您是否知道从SQL Server 2016开始&#xff0c;系统就内置STRING_SPLIT函数&#xff0c;该函数用于将字符串分隔的变量拆分为一个可用列表。 对于经常需要分割字符串的技术人员&#xff0c;建议您查看此功能。 STRING_SPLIT是一个表值函数&#xff0c;它返回由定界符分隔的字符串…

JBoss BPM Suite快速指南–将外部数据模型导入BPM项目

您正在从事一个大型项目&#xff0c;在企业中开发规则&#xff0c;事件和流程以满足关键业务需求。 部分要求指出&#xff0c;某个业务部门将提供您的数据模型供您利用。 不会在JBoss BPM Suite数据建模器中设计此数据模型&#xff0c;但是在从业务中心仪表板处理规则&#x…

卸载 流程_一款适合于windows端的卸载神器 彻底清理残留软件

今天给大家介绍的是一款适合于Windows端的软件卸载神器---Uninstall&#xff0c;可以彻底清理残留软件。它的卸载流程是这样的&#xff0c;首先会使用软件本身的默认卸载程序进行卸载&#xff0c;卸载完成后再次扫描软件残留的一些残余文件及注册表之类的&#xff0c;可以完美的…

十三水算法php_基于PHP+Redis令牌桶限流

一 、场景描述在开发接口服务器的过程中&#xff0c;为了防止客户端对于接口的滥用&#xff0c;保护服务器的资源&#xff0c; 通常来说我们会对于服务器上的各种接口进行调用次数的限制。比如对于某个 用户&#xff0c;他在一个时间段&#xff08;interval&#xff09;内&…

Java REST JAX-RS 2.0 –如何处理日期,时间和时间戳记数据类型

无论是X-Form-Urlencoded还是JSON HTTP发布到REST资源端点&#xff0c;对于与日期或时间相关的数据都没有特定的“数据类型”。 大多数开发人员会将这些数据发布为“字符串”&#xff0c;或者只是将它们转换为Unix时间戳值&#xff08;例如1435061152&#xff09;。 但是&#…

html中给div设置的属性怎么样才能拿得到_HTML与CSS结合的三种方式:优先级比较...

所谓实践出真知&#xff0c;只有自己动手去做了&#xff0c;才能得到正确的结论。首先我们看看三种结合方式&#xff1a;通过link标签引入外部css文件通过style标签通过style属性很长一段时间我受这个一段话影响&#xff1a;在html文件中&#xff0c;代码的执行顺序是从外到内&…

Quartz作业调度框架及时间表达式的含义和语法

Quartz 是一个开源的作业调度框架&#xff0c;它完全由 Java 写成&#xff0c;并设计用于 J2SE 和 J2EE 应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。本系统结合通过 Spring 来集成 Quartz 。 Quartz 下载地址 &#x…

spring mvc mysql 实例_Spring+Mybatis+SpringMVC+Maven+MySql搭建实例

一、准备工作1. 首先创建一个表&#xff1a;CREATE TABLE t_user (USER_ID int(11) NOT NULL AUTO_INCREMENT,USER_NAME char(30) NOT NULL,USER_PASSWORD char(10) NOT NULL,USER_EMAIL char(30) NOT NULL,PRIMARY KEY (USER_ID),KEY IDX_NAME (USER_NAME)) ENGINEInnoDB AUTO…

daocloud创建mysql_GitHub - DaoCloud/php-apache-mysql-sample

如何开发一个 PHP MySQL 的 Docker 化应用目标&#xff1a;基于典型的 LAMP 技术栈&#xff0c;用 Docker 镜像的方式搭建一个 Linux Apache MySQL PHP 的应用 。创建 PHP 应用容器因所有官方镜像均位于境外服务器&#xff0c;为了确保所有示例能正常运行&#xff0c;DaoCl…