SLAM面试笔记(2) - ORB-SLAM2

news2024/11/14 1:10:21

目录

1 四叉树实现特征点均匀化分布

2  Bow词袋模型

2.1 什么是词袋?

2.2 词袋在ORB-SLAM2中的作用

2.3 离线训练字典树流程

3 ORB-SLAM的跟踪方法

3.1 恒速模型跟踪

3.2 重定位跟踪

3.3 参考关键帧跟踪


持续更新中...

1 四叉树实现特征点均匀化分布

参考文章:VSLAM系列原创04讲 | 四叉树实现ORB特征点均匀化分布:原理+代码_节点

第1步:首先确定初始的节点(node)数目,一般刚开始的时候只有一个节点,也是四叉树的根节点。假如我们目标是均匀的选取 25 个特征点,那么后面我们就需要分裂出25个节点,然后从每个节点中选取一个代表性的特征点。

第2步:节点第1次分裂,1个根节点分裂为4个节点。落在多个节点区域范围内的特征点被多个节点共享。然后统计每个节点里包含特征点的数目,如果某个节点里特征点数目为 0,则删掉该节点,如果某个节点里特征点数目为 1,则该节点不再进行分裂。判断此时的节点总数是否超过设定值 25,如果没有超过则继续对每个节点分裂。

第3步:对上一步得到的 4 个节点分别进行一分为四的操作。

第4步:超过需要提取 25 个特征点数目的需求时停止分裂。对所有节点按照内部包含的特征点数目进行排列,优先分裂特征点数目多的节点,这样做的目的是使得特征密集的区域能够更加细分。对于包含特征点较少的节点,有可能因为提前达到要求而不再分裂。

第5步:上一步中我们已经得到了所需要的 25 个节点,只需要从每个节点中选出角点响应值最高的特征点,作为该节点的唯一特征点,该节点内其他低响应值的特征点全部删掉。这样我们就得到了均匀化后的、需要数目的特征点。

2  Bow词袋模型

2.1 什么是词袋?

        词袋(Bag-of-Words,BoW),目的是用“图像上有哪几种特征”来描述一幅图像。例
如,我们说某张照片中有一个人、一辆车;而另一张中有两个人、一只狗。根据这样的描述,就
可以度量这两幅图像的相似性。再具体一些,我们要做以下三步:   

  1. 确定“人”“车”“狗”等概念一对应于BoW中的“单词”(Wod),许多单词放在一起,组成了“字典”(Dictionary)
  2. 确定一幅图像中出现了哪些在字典中定义的概念一我们用单词出现的情况(或直方图)描述整幅图像。这就把一幅图像转换成了一个向量的描述。
  3. 设计一定的计算方式,就能确定图像间的相似性。例如可以通过下式计算α,b的相似性:

        其中:范数取L1范数,即各元素绝对值之和。请注意在两个向量完全一样时,我们将得到1;完全相反时(a为0的地方b为1)得到0。这样就定义了两个描述向量的相似性,也就定义了图像之间的相似程度。

2.2 词袋在ORB-SLAM2中的作用

  1. 用于加速特征匹配。用暴力匹配对两张图像中提取的特征点进行匹配的方法,不仅非常慢,而且容易出现错误匹配。通过词袋搜索匹配,只需要比较同一个节点下的特征点,因相当于提前对相似的特征点进行了区域划分,缩小了搜索范围,提高了搜索效率也减少很多错误匹配。
  2. 用于闭环检测。闭环检测的核心就是判断两张图像是不是同一个场景,也就是判断图像的相似性。 

2.3 离线训练字典树流程

        使用词袋模型的前提的需要离线训练字典树(Vocabulary Tree),我们也可以用别人训练好的字典,离线训练字典的流程如下: 

  1. 准备好足够数量的图像数据集。数据集最好涵盖不同光照、不同场景、不同天气和不同季节等条件下拍摄的图像集合,种类尽量多而不重复
  2. 遍历以上所有的训练图像,对每张图像提取 ORB 特征点。
  3. 建立字典树。
  4. 根据每个单词在训练集中出现的频率给其赋予一定的权重,其在训练集中出现的次数越多,说明辨别力越差,赋予的权重就越低

3 ORB-SLAM的跟踪方法

3.1 恒速模型跟踪

场景:正常情况下,系统使用恒速模型跟踪方法,该函数是用上一帧来跟踪当前帧。

流程:

  1. 首先,更新上一帧的位姿。对于双目或者RGB-D相机,还会生成新的临时地图点(但是这些地图点只是用来跟踪的,不加入地图中,跟踪完成后会进行删除)。
  2. 通过上一帧的位姿以及之前估计的速度估计当前帧的位姿的初始值(十分粗糙,不准确,后面会使用优化)。
  3. 根据相机的模型单目还是双目,设置特征匹配过程中的搜索半径,单目的搜索半径小。
  4. 投影匹配,上一帧3d点投影到当前坐标系下,在该2d点半径th范围内搜索可以匹配的匹配点遍历可以匹配的点,计算描述子距离,记录最小的匹配距离,小于阈值的,再记录匹配点特征方向差值进行方向验证,剔除方向差直方图统计中,方向差值数量少的点对,保留前三个数量多的点对。
  5. 如果找到的匹配点对如果少于20,则扩大搜索半径th=2*th再计算一遍,如果匹配点的数量还是太少,则使用恒速模型跟踪当前帧失败。
  6. 否则,使用PnP进行BA优化,获得较为准确的位姿,统计内点的数量,将外点所对应的地图点进行删除。若内点的数量小于阈值10个匹配点,则跟踪失败,否则,跟踪成功。

3.2 重定位跟踪

场景:如果使用恒速模型跟踪和参考关键帧跟踪也失败了,系统只能进行重定位跟踪。系统为了保证不会跟踪失败,会进行一系列的谨慎的判断操作,实在拯救不了了,才会判定系统重定位失败。使用该函数时,系统已经经历了恒速模型和参考关键帧模型,且已经跳过了上一帧,时间已经花费挺久了,所以这里要加速处理,否则实时性就难以保证。因此系统中主要使用了词袋进行加速处理。

流程:

  1. 首先,通过词袋查找关键帧数据库中与当前帧相似的候选关键帧。
  2. 然后遍历每一个候选关键帧与当前帧通过词袋进行特征点跟踪并通过直方图检查选址一致性,剔除掉不一致的匹配点,获得每一个候选关键帧和当前帧的匹配点个数。若匹配的特征点个数少于15个,则放弃该候选关键帧,否则,通过当前帧与匹配的特征点建立EPnP算法。
  3. 遍历每一个满足阈值要求的EPnP算法,迭代求取当前帧的位姿。
  4. 如果内点的数量少于10个,则跳过当前的候选关键帧。若内点的数量nGood大于10但是小于50个,说明系统还是有可能重定位成功的,那么就用投影的方式将候选关键帧中未匹配的地图点投影到当前帧中,进行匹配,并通过旋转直方图进行筛选,再增加一些匹配关系nadditional。
  5. 如果nGood + nadditional 大于50了,那么就再次进行优化,若内点的数量good 大于30 小于 50, 那么就再次重投影,直到成功为止。经过一些列的操作的目的就是为了拯救系统,让系统跟踪成功。

3.3 参考关键帧跟踪

场景:没有速度信息的时候、刚完成重定位、或者恒速模型跟踪失败后使用,大部分时间不用。只利用到了参考帧的信息。

流程:

  1. 计算当前帧的BoW,通过词袋BoW加速当前帧与参考帧之间的特征点匹配。
  2. 对属于同一node(同一node才可能是匹配点)的特征点通过描述子距离进行匹配,遍历该node中特征点,特征点最小距离明显小于次小距离才作为成功匹配点,记录特征点对方向差统计到直方图
  3. 记录特征匹配成功后每个特征点对应的MapPoint(来自参考帧),用于后续3D-2D位姿优化,通过角度投票进行剔除误匹配。
  4. 将上一帧的位姿作为当前帧位姿的初始值(加速收敛),通过优化3D-2D的重投影误差来获得准确位姿。3D-2D来自第2步匹配成功的参考帧和当前帧,重投影误差 e = (u,v) - project(Tcw*Pw),只优化位姿Tcw,不优化MapPoints的坐标。
  5. 剔除优化后的outlier地图点。

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

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

相关文章

SpringBoot实战(十六) 集成Hystrix

目录 一、简介1.Hystrix 的定义?2.Hystrix 的用处?3.Hystrix 的三种状态?4.Hystrix 解决什么问题?5.Hystrix 的设计原理?6.Hystrix 的实现原理? 二、集成 Hystrix1.Maven 依赖2.application.yml简易版&…

【CSS3】CSS3 伪元素选择器 ( 伪元素选择器语法简介 | 伪元素选择器权重计算 | 代码示例 )

文章目录 一、CSS3 伪元素选择器二、CSS3 伪元素选择器权重二、代码示例 一、CSS3 伪元素选择器 CSS3 伪元素选择器 : ::before 选择符 : 在 指定的标签元素内部的 前面 插入内容 ;::after 选择符 : 在指定的标签元素内部的 后面 插入内容 ; CSS3 伪元素选择器注意事项 : con…

QT里的网络通信简介

QTcpSocket类简介 QTcpSocket类提供了一个TCP套接字。TCP(传输控制协议)是一种可靠的、面向流的、面向连接的传输协议。它特别适合数据的连续传输。QTcpSocket是QAbstractSocket的一个子类,它允许您建立TCP连接和传输数据流。有关详细信息&a…

连接器信号完整性仿真教程 二

在连接器信号完整性仿真教程一中Step by Step演示了如何进行连接器信号完整性仿真,看完这片博文后应该可以做类似产品的仿真。如果说,看了这篇博文就学会了连接器信号完整性仿真,那就有点过了。有人也许会说信号完整性仿真难学,不…

利用GPT2 预测 福彩3d预测

使用GPT2预测福彩3D项目 个人总结彩票数据是随机的,可以预测到1-2个数字,但是有一两位总是随机的 该项目紧做模型学习用,通过该项目熟练模型训练调用生成过程. 福彩3D数据下载 https://www.17500.cn/getData/3d.TXT data数据格式 处理后数据格式 每行 2023 03 08 9 7 3 训…

Java入门教程||Java 继承||Java 重写(Override)与重载(Overload)

Java 继承 继承是所有 OOP 语言和 Java 语言不可缺少的组成部分。 继承是 Java 面向对象编程技术的一块基石,是面向对象的三大特征之一,也是实现软件复用的重要手段,继承可以理解为一个对象从另一个对象获取属性的过程。 如果类 A 是类 B …

玩机搞机----mtk芯片机型 另类制作备份线刷包的方式 读写分区等等

前面分享了几期高通和mtk芯片机型备份字库的几种方法教程。这些针对与很多没有线刷包资源的手机机型玩机操作。前面对接一个友商的mtk芯片杂牌机。和另外一个国外mtk芯片级都是来制作线刷包。因为,这些机型没有固件流出。而同一批机型中安卓版本高低不固定。支持的资…

谷歌TAG警告说俄罗斯黑客在乌克兰进行网络钓鱼攻击

与俄罗斯军事情报机构有关的精英黑客与针对乌克兰数百名用户的大批量网络钓鱼活动有关,以提取情报并影响与战争有关的公共言论。 谷歌的威胁分析小组(TAG)正在监测这个名为FROZENLAKE的行为者的活动,该小组表示,这些攻…

3105—IIS部署子站点

一、父站点 1—web.config配置 新增并设定location段落 <configuration><location path"." allowOverride"false" inheritInChildApplications"false"><system.webServer><handlers><add name"aspNetCore"…

科海思除COD树脂,大孔树脂,除COD专用树脂

一、产品介绍 Tulsimer A-722 MP具有控制孔径的大孔强碱性Ⅰ型阴离子交换树脂 Tulsimer A-722 MP 是一款具有便于颜色和有机物去除的控制孔径的&#xff0c;专门开发的大孔强碱性Ⅰ型阴离子交换树脂。 Tulsimer A-722 MP&#xff08;氯型&#xff09;专门应用于去除COD…

Vite与WebPack的对比,及解决了什么痛点,及什么是ESM?

一、简要 ESM&#xff0c;是指构成ESM规范的一系列的JavaScript特性或者API 1、首先要明确的是&#xff0c;Vite跟WebPack的优势只在开发环境。当把包部署到了生产环境后&#xff0c;大家都是一样的&#xff0c;甚至webpack的兼容性可能会更好。 这也是为什么有人提出&#x…

图像描述算法排位赛:SceneXplain 与 MiniGPT4 谁将夺得桂冠?

如果你对图像描述算法的未来感到好奇&#xff0c;本场“图像描述算法排位赛”绝对是你不能错过的&#xff01;在这场较量中&#xff0c;SceneXplain 和 MiniGPT-4 将会比试&#xff0c;谁将摘得这场比赛的桂冠&#xff1f; 背景介绍 在上篇文章中&#xff0c;我们介绍了图像描述…

C++类与对象—上

本期我们来学习类与对象 目录 面向过程和面向对象初步认识 类的引入 访问限定符 类的定义 封装 类的作用域 类的实例化 this指针 C语言和C实现Stack的对比 面向过程和面向对象初步认识 C 语言是 面向过程 的&#xff0c; 关注 的是 过程 &#xff0c;分析出求解问题的…

研究生考试 之 计算机网络第七版(谢希仁) 第一章 课后答案

研究生考试 之 计算机网络第七版(谢希仁) 第一章 课后答案 目录 研究生考试 之 计算机网络第七版(谢希仁) 第一章 课后答案 一、简单介绍 二、计算机网络第七版(谢希仁) 第一章 课后答案 1、 计算机网络向用户可以提供哪些服务&#xff1f; 2、 试简述分组交换的要点。 3…

人工神经网络

&#x1f351; CV专栏 1. 单个神经元 &#x1f351; 神经网络 即 模型 &#x1f364; 输入 四个参数 --> 结果 &#x1f351; 模型训练(学习) 例子 &#x1f351; 模型的输入x 乘 权值ω 减去阈值θ --> 激活函数 f &#x1f351; 输出 yi &#xff08;向下传递 或 直…

一步步带你学习Python编程:从零开始的查缺补漏

在快节奏的生活中&#xff0c;很难找到时间来学习新的技能。但有时候&#xff0c;我们会突然发现自己有一些空闲时间&#xff0c;而又不想虚度光阴。无聊的时候&#xff0c;我们可以选择学习一项新技能来充实自己。最近&#xff0c;我就因为有些无聊&#xff0c;决定重新学习Py…

linux实现网络程序

1️⃣ 在linux下&#xff0c;通过套接字实现服务器和客户端的通信。 2️⃣ 实现单线程、多线程通信。或者实现线程池来通信。 3️⃣ 优化通信&#xff0c;增加守护进程。 有情提醒&#xff0c;类里面默认的函数是内联。内联函数在调用的地方展开&#xff0c;没有函数地址&…

【Springboot系列】Springboot整合Swagger3不简单

1、缘由 Swagger是一个根据代码注解生成接口文档的工具&#xff0c;减少和前端之间的沟通&#xff0c;前端同学看着文档就可以开发了&#xff0c;提升了效率&#xff0c;之前很少写swagger&#xff0c;这次自己动手写&#xff0c;还是有点麻烦&#xff0c;不怎么懂&#xff0c;…

外网SSH远程连接linux服务器「cpolar内网穿透」

文章目录 视频教程1. Linux CentOS安装cpolar2. 创建TCP隧道3. 随机地址公网远程连接4. 固定TCP地址5. 使用固定公网TCP地址SSH远程 转载自内网穿透工具的文章&#xff1a;无公网IP&#xff0c;SSH远程连接Linux CentOS服务器【内网穿透】 本次教程我们来实现如何在外公网环境下…

OpenGL入门教程之 纹理

引言 我们已经了解到&#xff0c;我们可以为每个顶点添加颜色来增加图形的细节&#xff0c;从而创建出有趣的图像。但是&#xff0c;如果想让图形看起来更真实&#xff0c;我们就必须有足够多的顶点&#xff0c;从而指定足够多的颜色。这将会产生很多额外开销&#xff0c;因为每…