【代码阅读】MSC-VO

news/2024/7/21 6:55:48 标签: 计算机视觉, 人工智能, 图像处理

MSC-VO是ICRA2022的一篇点线视觉SLAM论文,本身是在ORBSLAM2的基础上改进的,改进的部分在于为SLAM系统引入了线段,并且使用了曼哈顿坐标系与结构化约束进行优化,之前看过的论文记录可以参考链接,年前把线段匹配和均匀化的内容试着做了一下,现在计划看一下这篇文章的代码看一下后续的代码应该如何实现。

一、初始化部分

MSC-VO本身是基于ORBSLAM2的改进,所以基本的代码框架还是ORBSLAM2的那些东西,一个比较大的区别在于MSC-VO更换了数据的内容,将图像换为了深度图,也就是RGBD图像,所以在MSC-VO的代码里面,如果输入内容不是RGBD图像,就会报错。

整个MSC-VO的主函数在Examples文件夹下的RGB-D下的rgbd-tum.cc文件,该文件内部写有整个框架的主函数,通过初始化SLAM对象来调用其余的内容,初始化的部分和ORBSLAM2几乎没有差别,不同之处在于,由于MSC-VO使用的线段约束以及曼哈顿坐标系,在初始化system对象的时候需要补充这两个新增的部分。体现在代码上,system对象在初始化时会初始化一个Tracking对象,而这个对象在初始化时会将线段提取器和曼哈顿坐标系两个对象进行初始化。
在这里插入图片描述
这两个对象属于是MSC-VO中新增的,我们先简单看一下这两个对象的初始化内容。

线段提取器对象

线段提取器对象主要是负责线相关的操作,我们可以看作是线段版的orbextractor对象,该对象在初始化的时候需要指定四个参数:
在这里插入图片描述
四个参数分别为提取线段时的金字塔层数、金字塔的尺度因子、需要提取的线段数量以及线段的最短长度,这些参数来自于RGB-D文件夹下的yaml配置文件,需要我们在控制台运行主函数时给出这个配置文件的位置。根据源代码里面提供的几个配置文件,层数一般设置为1,尺度因子设置为1.2,线段数设置为200,在tum数据集上的最短长度设置为0,而在实际场景数据集中设置为了5。

曼哈顿坐标系对象

曼哈顿坐标系相关的内容在Manhattan.cpp中,需要传入一个opencv的mat对象,该对象在Tracking对象的构造函数内部被创建,初始化为一个3×3的单位矩阵,之后再四个位置填入了相机内参,也就是说在初始化时需要给曼哈顿坐标系对象相机的内参矩阵,这个内参矩阵内部的四个参数来自于配置文件。
在这里插入图片描述
传入的内参矩阵会进行提取并单独存储为对象中的一个属性,除此之外,曼哈顿坐标系对象初始化的过程还将三个坐标轴的相关信息也进行了处理,这一点应该对应于原论文里面初始化曼哈顿坐标系的部分,使用了一个二维的向量进行了处理,粗略初始化了坐标轴的三个方向。
在这里插入图片描述
最后还初始化了一个24维的向量,向量内部每个元素是一个3×3的mat对象,根据注释来看是用于用于去除曼哈顿坐标系线提取中的冗余,但是具体干什么用还没有见到,在后面看到的时候在具体分析。

对象初始化完成之后,根据文件名读取RGBD图像,调用SLAM对象的TrackRGBD函数进行后续的处理。这里稍微补充一下,RGBD的数据集其实是两组图组合出来的,这里拿ORBSLAM使用的那个桌子的数据集来说,下载好的数据集内部其实包括这么几个部分:
在这里插入图片描述
其中rgb文件夹下的图像和我们平时用的单目相机图像是一样的,就是带颜色的相机图像,而depth文件夹则存放了深度图像,这里的深度图实际上是单通道的灰度图,用对应位置上的像素值来表示传感器感知到的深度值,深度图和RGB图像之间用提前存好的关系来进行对齐,从而实现深度的感知。另外之前在魔改Dynaslam的时候用到的也是RGBD图像,当初在处理数据集的时候记得这类RGBD数据集需要一个association文件,这个文件用来实现深度图和RGBD图像的对齐,一般都是用现成的代码来生成,可以参考链接。
在这里插入图片描述

二、Tracking线程

通过SLAM对象调用TrackRGBD函数,将图像与深度图以及一个时间戳传入到函数中。在TrackRGBD函数中,通过调用mpTracker对象(也就是Tracking线程)的GrabImageRGBD函数来计算位姿,进入这个函数后通过cvtColor来进行通道的转换,将RGB图像转换为灰度图。转换好的图像用于初始化帧对象,由于使用了线段和曼哈顿坐标系,所以一些写法也发生了改变。
在这里插入图片描述
下图为ORBSLAM2代码中对应位置的写法:
在这里插入图片描述
可以看出,构造函数中增加了线段的提取器和曼哈顿距离的相关处理的内容,这几个对象都是在构造Tracking对象的时候进行初始化的,位置在Tracking对象的构造函数中,传入的对象其实就是给Frame对象中的相关属性进行了赋值,并将这些对象中的一些只取出来赋值给Frame对象。赋值结束后,就需要进行特征的提取,不同于ORBSLAM2代码顺序提取的方法,MSC-VO换用了多线程的提取方法,而不再是ORBSLAM2里面顺序提取的方法。这里使用c++里面的线程函数,初始化线程分别指向特征点提取、线段提取以及曼哈顿坐标系的处理,使用join函数来等待指向的函数执行完毕,关于join函数的作用可以参考链接。
在这里插入图片描述
在默认的执行顺序下,第一帧会送入到下面else的分支中调用三个函数进行特征提取,由于使用的是RGBD图像,所以这里的特征提取也有稍微的不同。首先是特征点的提取,在ORBSLAM2的代码中就单纯是用ORBextractor进行提取,而由于现在有了深度信息,所以我们多了一步将深度与特征对齐。
在这里插入图片描述
可以看见377行利用重载的括号,调用了提取特征点的函数,具体提取的部分可以参考ORBextractor.cc中的ORBextractor::operator()函数。提取结果需要经过两个函数的处理,UndistortKeyPoints函数负责畸变校正,ComputeStereoFromRGBD则负责将深度图中对应位置的深度提取出来并和特征点对齐,相当于给特征点填上深度,从而节省了三角化的时间。


http://www.niftyadmin.cn/n/29840.html

相关文章

DFS(五)N皇后

51. N 皇后 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案…

JavaWeb语法八:网络原理初识

目录 1.局域网与广域网 1.1:局域网 1.2:广域网 2:网络基础知识 3.协议分层 3.1:分层的好处 3.2:TCP/IP五层(或四层)模式 4:封装和分用 4.1:封装 4.2&#xff1…

为 TDesignBlazor 添加暗黑模式

本文将讲述我为 TDesignBlazor 开源项目提交 PR 的经历,主要介绍暗黑模式功能的实现以及之后如何在项目中使用。我将会分享我在实现这一功能时遇到的问题,以及我是如何解决这些问题的。我希望通过我的经历能够鼓励更多的人参与开源项目,为 TD…

【GIS】高分辨率遥感影像智能解译

1 绪论 随着航空科技工业的不断成熟与发展,我国遥感卫星研制能力不断攀升,发射数量逐年提高,在轨运行的遥感卫星为社会生产及居民日常生活提供了巨大的支持与便利。我国目前同时在轨运行的遥感卫星数量已超过60颗,每天获取并传回…

游戏启动器:LaunchBox Premium with Big Box v13.1

LaunchBox知道您会喜欢的功能,具有风格的游戏启动器,我们最初将 Launchbox 构建为 DOSBox 的一个有吸引力的前端,但它现在拥有对现代游戏和复古游戏模拟的支持。我们让您的所有游戏看起来都很漂亮。 整理您的游戏收藏 我们不仅漂亮&#xff…

Intellij IDEA导入jar包的方法

目录 方法一 1. 首先新建web项目 2. 拷贝jar包 3. 使拷贝的jar包生效 方法二 1.直接导入jar包

背景颜色和背景图片

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <!--这行代码是告诉浏览器需要使用"utf-8"字符集打开 因为HBuilder工具是采用utf-8编码的 注意&#xff1a;并不是设置当前页面的字符集编码方式--> …

Element-UI的dialog对话组件内的tinymce弹窗被遮挡的解决办法及其它相关注意事项

问题一&#xff1a;tinymce的弹窗被遮挡 问题截图 解决办法 修改层级 注意要写在 <style></style> 中&#xff0c;我当时没注意&#xff0c;写在了 <style scoped></style> 中&#xff0c;死活没反应。 <style> /* 在el-dialog中tinymce z-ind…