视觉SLAM学习打卡【11】-尾述

到目前为止,视觉SLAM14讲已经到了终章,历时一个半月,时间有限,有些地方挖掘的不够深入,只能在后续的学习中更进一步。接下来,会着手ORB-SLAM2的开源框架,同步学习C++。

视觉SLAM学习打卡【11】-尾述

  • 一、回环检测
    • 1.实现方法
    • 2.词袋模型步骤
      • (1)生成字典Word
      • (2)生成词袋Bag-of-Words(BoW)
      • (3)相似度计算
  • 二、建图
    • 1.单目稠密重建
      • (1)极线搜索与块匹配
      • (2)高斯分布的逆深度滤波器
      • (3)像素梯度的问题
    • 2.RGB-D稠密建图
    • 3.八叉树地图
    • 4.实时三维重建
  • 三、SLAM的开源方案
    • 1. MonoSLAM
    • 2. PTAM(Parallel Tracking and Mapping)
    • 3. ORB-SLAM(Oriented FAST and Rotated BRIEF SLAM)
    • 4. LSD-SLAM(Large Scale Direct monocular SLAM)
    • 5. SVO(Semi-direct monocular Visual Odometry)
    • 6. RTAB-MAP(Real-Time Appearance-Based Mapping)
    • 7.视觉+惯性导航SLAM
    • 8.语义SLAM
  • 四、特征点法能构建稠密地图吗?

一、回环检测

1.实现方法

  • 对任意两幅图像都做一些特征匹配(检测数量太大)
  • 随机抽取历史数据并进行回环检测(可能漏掉回环,检测效率不高)
  • 基于视觉里程计的几何关系(存在累计误差)
  • 基于外观(主流方法)——词袋模型

2.词袋模型步骤

调用DBoW3::Vocabulary对象的构造函数后,输出结果:

vocabulary info:Vocabulary:k=10,L=5,Weighting=tf-idf,Scoring=L1-norm,Number of words=4983
  • k=10,L=5——上述生成字典采用K叉树(深度为5,每次分叉为10),每个叶子节点对应一个单词.
  • Weighting=tf-idf——TF-IDF(Term Frequence-Inverse Document Frequence / 词频-逆文档频率)
    √ TF:某单词在一幅图像中经常出现,它的区分度就高; T F i = n i n . TF_{i}=\frac{n_{i}}{n}. TFi=nni.(图像A中单词wi出现了ni次,一共出现的的单词次数为n)
    √ IDF:某单词在字典中出现频率越低,分类图象时区分度越高。 I D F i = log ⁡ n n i . \mathrm{IDF}_{i}=\log\frac{n}{n_{i}}. IDFi=lognin.(某叶子节点wi的特征数量为ni,字典中所有特征数量为n)
    √ 权重Weighting等于TF与IDF的乘积 η i = T F i × I D F i . \eta_{i}=TF_{i}\times IDF_{i}. ηi=TFi×IDFi.
  • Scoring=L1-norm——计算不同图像的差异,进行相似度计算.

(1)生成字典Word

  • 随机选取k个中心点(特征点)
  • 对每一个特征点,计算它与每一个中心点的距离(描述子算汉明距离),取最小的作为它的类(单词“Word”)
  • 重新计算每个类的中心点
  • 如果每个类的中心点变化很小,则算法收敛,退出(所有的类/ Word 构成字典);否则返回第二步

(2)生成词袋Bag-of-Words(BoW)

某幅图像A中,单词 wi 和其对应权重 η i \eta_i ηi 组成的向量 v 对组成它的BoW. A = { ( w 1 , η 1 ) , ( w 2 , η 2 ) , … , ( w N , η N ) } = d e f v A A=\{(w_{1},\eta_{1}),(w_{2},\eta_{2}),\ldots,(w_{N},\eta_{N})\}\stackrel{\mathrm{def}}{=}v_{A} A={(w1,η1),(w2,η2),,(wN,ηN)}=defvA

(3)相似度计算

A、B两幅图像的相似度评分公式可以为(L1范数形式): s ( v A − v B ) = 2 ∑ i = 1 N ( ∣ v A i ∣ + ∣ v B i ∣ − ∣ v A i − v B i ∣ ) s(\boldsymbol{v}_A-\boldsymbol{v}_B)=2\sum_{i=1}^N(|\boldsymbol{v}_{Ai}|+|\boldsymbol{v}_{Bi}|-|\boldsymbol{v}_{Ai}-\boldsymbol{v}_{Bi}|) s(vAvB)=2i=1N(vAi+vBivAivBi)(L1范数,也被称为曼哈顿范数,是向量范数的一种计算方式。L1范数等于向量元素的绝对值之和,也可以表示为从原点到向量所在点的曼哈顿距离。)
all in all,字典是单词的集合,字典+权重=词袋

二、建图

地图的用途归纳如下:在这里插入图片描述
在稠密重建中,需要知道每一个像素点的距离:

  • 单目相机-三角化
  • 双目相机-左右目视差计算

上述两种方式称为立体视觉(Stereo Vision),其中,第一种又称为移动视角的立体视觉(Moving Stereo Vision MVS)

  • RGB-D相机直接获得像素距离

1.单目稠密重建

(1)极线搜索与块匹配

在特征点方法中,我们是根据描述子通过特征匹配来确定那个点是匹配点。但是在稠密的限制下,我们不可能对每个点保存描述子,我们只能在极线上找一个与p1长的很像的点,具体来说,我们要沿着极线l2,从一头跑到另一头,在这里面找一个很像的点。请添加图片描述

对极几何和极线搜索的区别

  • 对极几何:已知p1、p2像素坐标,根据本质矩阵E求R、t.
  • 极线搜索:已知R、t和p1像素坐标,求p2像素坐标

单个像素的灰度区分度太低,又没有描述子去描述特征,我们采用块匹配的方法,也就是取p1周围一个w×w的小块,在极线上也取很多的等大小的小块进行比较:

  • SAD(Sum of Absolute Difference / 两小块差的绝对值之和)。 S ( A , B ) S A D = ∑ ∣ A ( i , j ) − B ( i , j ) ∣ . S(\boldsymbol{A},\boldsymbol{B})_{SAD}=\sum|\boldsymbol{A}(i,j)-\boldsymbol{B}(i,j)|. S(A,B)SAD=A(i,j)B(i,j)∣.接近0说明两小块相似
  • SSD(Sum of Squared Distance / 平方和)。 S ( A , B ) S S D = ∑ i , j ( A ( i , j ) − B ( i , j ) ) 2 . S(\boldsymbol{A},\boldsymbol{B})_{SSD}=\sum_{i,j}\left(\boldsymbol{A}(i,j)-\boldsymbol{B}(i,j)\right)^2. S(A,B)SSD=i,j(A(i,j)B(i,j))2.接近0说明两小块相似
  • NCC(Normalized Cross Correlation / 归一化互相关)。 S ( A , B ) N C C = ∑ i , j A ( i , j ) B ( i , j ) ∑ i , j A ( i , j ) 2 ∑ i , j B ( i , j ) 2 . S(\boldsymbol{A},\boldsymbol{B})_{NCC}=\frac{\sum_{i,j}\boldsymbol{A}(i,j)\boldsymbol{B}(i,j)}{\sqrt{\sum_{i,j}\boldsymbol{A}(i,j)^2\sum_{i,j}\boldsymbol{B}(i,j)^2}}. S(A,B)NCC=i,jA(i,j)2i,jB(i,j)2 i,jA(i,j)B(i,j).接近1说明两小块相似

上述3种方法可以进行去均值操作:形成去均值的SSD,去均值的NCC,去均值的SAD

(2)高斯分布的逆深度滤波器

在搜索距离较长的时候,通常会得到一个非凸函数,存在许多峰值,但是真实的对应点只有一个。也就是说对应位置是一个概率表示的位置,所以估计的深度也应该是一个概率值,所以问题就转换到了对不同图像进行极线搜索的时候,估计的深度分布会发生怎样一个变化,这就是深度滤波器请添加图片描述
假设深度值d服从高斯分布,通过信息融合(两个高斯分布的乘积依然是高斯分布),更新原来d的分布。
逆深度:是近年来SLAM研究中出现的一种广泛使用的参数化技巧。假设深度的倒数(逆深度)为高斯分布是有效的,有更好的数值稳定性。

(3)像素梯度的问题

  • 立体视觉对物体纹理的依赖性:对于梯度不明显的像素,由于在块匹配时没有区分性,将难以有效的估计其深度。
  • 像素梯度和极线的关系:当像素梯度与极线夹角较小时,极线匹配的不确定性小;而当夹角较大时,匹配的不确定性变大。在这里插入图片描述

2.RGB-D稠密建图

利用深度相机进行稠密建图是相对简单的,最简单的方法就是根据估算的相机位姿,将深度相机数据转换为点云,拼接之后就得到了一个由离散点组成的点云地图(Point Cloud Map)。在此基础上改进:

  • 三角网格(Mesh)
  • 面片(Surfel)
  • 通过体素(Voxel)建立占据网格地图(Occupancy Map).有许多小的立方体单元(体素)组成,每个体素都包含了其位置信息和属性信息。

3.八叉树地图

在导航中比较常用,本身具有较好的压缩性能的八叉树地图,比较节省存储空间。
在这里插入图片描述

  • 对空间进行划分,每次划分是对空间的三个方向各划一刀,于是会产生八个块,对应到树结构上就是一层产生八个儿子节点,也就是八叉树。整个大方块可以看成是根节点,而最小的块可以看作是“叶子节点”。于是,在八叉树中,当我们由下一层节点往上走一层时,地图的体积就能扩大八倍。体积与深度成指数关系,所以当我们用更大的深度时,建模的体积会增长的非常快。
  • 八叉树可以节省存储,主要是在于当某个方块的所有子节点都被占据或都不被占据时,就没必要展开这个节点。

4.实时三维重建

与SLAM非常相似但又有稍许不同的研究方向:实时三维重建。一种以”建图“为主体,定位居于次要地位的做法。

三、SLAM的开源方案

1. MonoSLAM

  • 第一个实时单目视觉SLAM系统
  • 后端:EKF
  • 前端:特征点法

2. PTAM(Parallel Tracking and Mapping)

  • 实现了定位&建图过程的并行化
  • 第一个使用非线性优化BA

3. ORB-SLAM(Oriented FAST and Rotated BRIEF SLAM)

  • 支持单目、双目、RGB-D三种模式
  • 创新使用三线程完成SLAM:实时跟踪特征点的Tracking线程;局部BA的优化线程(小图);全局位姿图的回环检测和优化线程(大图)。

4. LSD-SLAM(Large Scale Direct monocular SLAM)

  • 将单目直接法运用到半稠密(只估计梯度明显的像素位置)SLAM中

5. SVO(Semi-direct monocular Visual Odometry)

  • 半直接/稀疏直接法:指特征点与直接法的混合使用。SVO跟踪一些关键点(角点,没有描述子),像直接法那样,估计关键点周围的相机运动.
  • 提出深度滤波器的概念,并推导了基于均匀-高斯混合分布的深度滤波器
  • 追求速度和轻量化,舍弃了后端优化和回环检测部分,故称为视觉里程计.

6. RTAB-MAP(Real-Time Appearance-Based Mapping)

  • RGB-D传感器上的SLAM方案,能够在CPU上实时建立稠密的地图
  • 包含:基于特征的视觉里程计;基于词袋的回环检测;后端的位姿图优化;点云和三角网络地图

7.视觉+惯性导航SLAM

  • 使用VIO(Visual-Inertial Odometry,即视觉惯性里程计)
  • IMU和相机互补:IMU为快速运动提供了较好的解决方案(运动过快,相机产生模糊);相机在慢速运动下解决IMU漂移问题.
  • VIO框架定型为2大类:松耦合(IMU和相机各干各的,最后对结果融合)和紧耦合(IMU和相机一起,共同构建运动方程,然后进行状态估计)

8.语义SLAM

  • 把物体识别和视觉SLAM相结合,构建带标签的地图,把标签信息引入BA或优化端的目标函数和约束中.
  • 将SLAM与深度学习、神经网络结合,处理图像.

四、特征点法能构建稠密地图吗?

在学习SLAM过程中,由于对该领域了解尚浅,产生了片面的认识:特征点法和直接法均可以重建稀疏地图,半稠密、稠密地图无描述子,仅可采用直接法。

特征点法本身并不能直接构建稠密地图。特征点法主要是通过提取和匹配图像中的特征点来进行定位与建图。它主要关注的是稀疏的特征点,这些点可能不足以构成稠密地图。稠密地图通常需要更多的像素级信息,而不仅仅是特征点。
然而,通过结合其他方法或技术,特征点法可以在一定程度上用于构建稠密地图。例如,可以利用特征点法得到的稀疏地图作为初始估计,然后通过插值或其他方法扩展为稠密地图。另外,也可以使用深度相机或其他传感器来获取更多的深度信息,结合特征点法来实现稠密地图的构建

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

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

相关文章

AI 文献综述工具

find sources that support this statement:

【日常记录】【CSS】SASS循环的使用

文章目录 1、引言2、安装3、举例4、参考链接 1、引言 目前在任何项目框架中,都会有css 预处理器,目前一般使用 sass、less 这俩其中之一,它可以简化css的书写 Sass 是一款强化 CSS 的辅助工具,它在 CSS 语法的基础上增加了变量 (v…

代码随想录-算法训练营day15【二叉树02:层序遍历、翻转二叉树、对称二叉树】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第六章 二叉树 part02今日内容: ● 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树 2 详细布置 层序遍历 看完本篇可以一口气刷十道题,试一试, 层序遍历并不难,大…

作业4.17

1.总结串口的发送和接收功能使用到的函数 发送: HAL_StatusTypeDef HAL_UART_Transmit( UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout ) 接受: HAL_StatusTypeDef HAL_UART_Receive_IT( UART_HandleTypeDef *…

【Java探索之旅】掌握数组操作,轻松应对编程挑战

🎥 屿小夏 : 个人主页 🔥个人专栏 : Java编程秘籍 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、数组巩固练习1.1 数组转字符串1.2 数组拷贝1.3 求数组中的平均值1.4 查找数组中指…

python怎么判断整数

isinstance()函数 可以用来判断变量的类型,它返回的是一个布尔值,False or True。 >>>isinstance("123",str) >>>Flase >>>isinstance(123,int) >>>True >>>isinstance({123},list) >>&g…

Pytest测试用例中的mark用法(包含代码示例与使用场景详解)

在软件开发中,测试是确保代码质量和功能稳定性的重要环节。Python作为一门流行的编程语言,拥有丰富的测试工具和框架,其中pytest是其中之一。pytest提供了丰富的功能来简化测试用例的编写,其中的mark功能允许我们对测试用例进行标…

逻辑回归模型-逻辑回归算法原理-逻辑回归代码与实现-笔记整合

通过一段时间的学习,总算把逻辑回归模型弄清楚了 《老饼讲解-机器学习》www.bbbdata.com中是讲得最清晰的,结合其它资料,整理一个完整的笔记如下,希望能帮助像我这样入门的新人,快速理解逻辑回归算法原理和逻辑回归实…

校园智能水电预付费管理系统

校园智能水电预付费管理系统是一种专为学校水电资源管理而设计的智能化系统,旨在提供全面的水电资源管理解决方案,满足校园管理者对水电资源管理的需求。该系统整合了先进的智能技术和云计算,为校园管理者提供了实时监控、自动计费、节能管理…

Pytest精通指南(15)Parametrize之设置别名和解决中文乱码

文章目录 前言使用ids参数设置别名解决别名乱码方式一解决别名乱码方式二 前言 前有文章讲解了fixture函数中使用ids参数给测试用例函数设置别名; 查漏补缺连接:待定 当使用pytest.mark.parametrize来参数化我们的测试函数时,也可以使用ids参…

高标准化及可扩展的产品能力,助力声通科技运营效率不断提升

高标准化及可扩展的产品能力对企业发展具有重要意义,有助于企业提高运营效率、增强市场竞争力,并推动企业实现规模化发展。上海声通信息科技股份有限公司(下文称:声通科技或公司)作为我国领先的企业级全栈交互式人工智…

重生奇迹mu恶魔来袭副本

在游戏重生奇迹mu中,恶魔来袭副本是玩家能够组队通过的副本。但是因为手游组队的不方便性,部分玩家对其还是非常苦手。而今天,我们就给大家讲解一下这个游戏的双人通关攻略。 1、挂机找怪手动输出 (1)对于普通剧情副本而言,挂机…