ORB-SLAM2与OpenMVS对接实现三维重建

2023-05-16

详细介绍如何实现ORB-SLAM2与OpenMVS的对接过程,打通上下游实现三位重建,二话不说先干图

对于学SLAM的同学对ORB-SLAM2可能并不陌生,系统框架清晰明了,代码风格清新脱俗,几乎都快成为入门SLAM的必修课了。三维重建结构分为SFM和MVS这两个部分,常见的三维重建方法如图所示

对于学过SLAM的同学看到这可能就觉得不舒服了,对于SLAM和三位重建这俩同宗师兄弟竟然都不给介绍介绍,这那说的过去,确实对与SLAM,我们所理解的实时定位与建图其实他同样可以充当Sturt form Motion的角色,为MVS提供初始的相机位姿与稀疏点云。

本文以ORB-SLAM2与OpenMVS为例,详细介绍对接过程:
ORB-SLAM2位姿导出
为与OpenMVS进行对接本次进对ORB-SLAM2进行部分修改,使之可以为OpenMVS提供稀疏点云、关键帧的位姿、内参,以及稀疏点云在各个View中的可见性。

主要更改如下

  • 在Map文件下增添如下函数
public:    
    void Save(const string &filename,const cv::MatSize image_size);
    void SaveMapPoint(ofstream &f, MapPoint* mp);
    void SaveKeyFrame(ofstream &f, KeyFrame* kf);
protected:
std::vector<int> KeyId;
  • 在System下增加:
void System::SaveMap(const string &filename,const cv::MatSize image_size);
  • 在mono_tum.cc或者orbslam的其他Examples中对System::SaveMap(const string &filename,const cv::MatSize image_size)这个函数进行调用即可。
SLAM.SaveMap("../Examples/output/sfm.txt",im.size);

通过ORB-SLAM2 我们最终生成了sfm.txt这个保存相机位姿以及稀疏点云的文档,他的文件结构如下图所示

数据集地址: https://vision.in.tum.de/data/datasets/rgbd-dataset/download#freiburg1_plant
以下是我们运行数据集的效果

sfm.txt的文件内容为:

ORB-SLAM2导出位姿验证

在与OpenMVS 进行对接之前,一定确保自己导出的信息是准确的,可以将相机三位空间坐标点以及相机在空间中的位置保存成ply、obj等三维格式,在meshlab中进行查看,或者如果你用的rgb-d相机的话,同样可以将深度图、rgb图一同投影下来,在meshlab下进行查看

下面则是我们根据得到的数据开始对OpenMVS进行初始化
OpenMVS初始化
为与SLAM进行对接,我们加入了read_pose.cpp、read_pose.h这两个c++文件,目的是对SLAM导出的位姿和稀疏点云进行读取,并对OpenMVS进行初始化。
主要核心函数有

bool load_scene(string file,Scene &scene);
bool read_mvs_pose(string file,MVSPOSE &mvs_pose);
bool save_pointcloud_obj(string name, vector<POINT3F> points,int num_keyframes,RGB color)

我们只需要在DensifyPointCloud.cpp下 对加入函数如下

// load and estimate a dense point-cloud
#define use_custom_pose
#ifdef use_custom_pose
    if(!load_scene(string(MAKE_PATH_SAFE(OPT::strInputFileName)),scene))
		return EXIT_FAILURE;
#else
	if (!scene.Load(MAKE_PATH_SAFE(OPT::strInputFileName)))
		return EXIT_FAILURE;
#endif

即可实现我们的初始化操作
对接结果
一下分别为稠密重建后的深度图融合、mesh重构、mesh优化以及问题贴图效果

InterfaceDensifyPointCloud接口理解
Scene.image中包含 尺度 分辨率 name 以及相关连的相机(这个platforms里面放置的是相机的内参和位姿)
在platforms中包含相机的内参 位姿
Camera类中包含相机ID 分辨率 相机内参,通过Read函数对stream进行读取自身参数
Image类这里包含图片ID,外参,相关连的相机,图片name以及稀疏点在当前图片的投影点

IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME

Point类中 点的ID,位置,颜色,以及当前点的可见图像id
首先明确一点,我们SLAM的内容要如实的传入到Scene这个类中

首先将数据传入imgaes中

然后将数据传入platforms中

以及poses

对于想对其进行了解的同学可以到Bilibili观看我在计算机视觉life上的分享https://www.bilibili.com/video/BV1yX4y1A7qR?t=1

OpenMVS对SLAM位姿初始化部分已经合并到github: https://github.com/electech6/openMVS_comments

对于想要单独下载更改的文件的可以访问github: https://github.com/WangWen-Believer/ORB_SLAM2-to-OpenMVS

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

ORB-SLAM2与OpenMVS对接实现三维重建 的相关文章

  • Lua 调试(Debug)

    Lua 调试 Debug 参考至菜鸟教程 Lua 提供了 debug 库用于提供创建我们自定义调试器的功能 Lua 本身并未有内置的调试器 xff0c 但很多开发者共享了他们的 Lua 调试器代码 Lua 中 debug 库包含以下函数 x
  • Lua 垃圾回收

    Lua 垃圾回收 参考至菜鸟教程 Lua 采用了自动内存管理 这意味着你不用操心新创建的对象需要的内存如何分配出来 xff0c 也不用考虑在对象不再被使用后怎样释放它们所占用的内存 Lua运行了一个垃圾收集器来收集所有死对象 xff08 即
  • Lua 面向对象(详解)

    Lua 面向对象 xff08 详解 xff09 参考文章 xff1a https blog csdn net linxinfa article details 103254828 https zhuanlan zhihu com p 115
  • Lua实现矩阵的加减乘除

    Lua实现矩阵的加减乘除 参考文章 xff1a https blog csdn net qq 54180412 article details 122943327 https www bilibili com video BV1434y18
  • ubuntu系统配置大恒相机驱动并读取ros话题

    文章目录 0 说明1 安装大恒相机sdk1 1 下载1 2 安装sdk 用于配置ip和调试相机参数 1 电脑网卡配置 网卡固定ip 2 查看相机图像以及配置相机参数 2 安装ros驱动包 注 xff1a 大恒相机官方没ros驱动 2 0 正
  • C++类对象与Lua之间的交互

    C 43 43 类对象与Lua之间的交互 C语言与Lua进行交互 xff0c 我们可以相对轻易的做到 xff0c 但在实际应用中我们更加偏向于使用C 43 43 与Lua进行交互 xff0c 面向对象编程 关于C语言与Lua之间的调用交互实
  • C++与Lua交互实例 -- 矩阵的加减乘除(版本一)

    C 43 43 与Lua交互实例 矩阵的加减乘除 xff08 版本一 xff09 关于lua中封装的类模板以及相关知识可参考以下链接 xff1a https ufgnix0802 blog csdn net article details
  • C++与Lua交互实例 -- 矩阵的加减乘除(版本二)

    C 43 43 与Lua交互实例 矩阵的加减乘除 xff08 版本二 xff09 TIPS xff1a 关于使用矩阵的加减乘除测试C 43 43 与Lua的交互以及下面没讲述到的知识点可以阅读第一版 xff1a https blog csd
  • Windows下LuaBridge2.8的环境配置及简单应用

    Windows下LuaBridge2 8的环境配置及简单应用 LuaBridge2 8下载链接 xff1a https github com vinniefalco LuaBridge tags 关于Lua的环境配置可参考以下链接 xff0
  • Lua 开发过程中常见坑

    Lua 开发过程中常见坑 Lua next span class token keyword return span G span class token punctuation span span class token function
  • 私网与公网地址转换

    私网与公网地址转换 NAT概述NAT功能静态NAT动态NATEASYIP xff08 多个内网地址对一个接口 xff09 PAT端口多路复用 NAT概述 NAT xff08 Network Address Translation xff0c
  • VWmare安装CentOS7及连接Xshell超详细过程(图文)

    VWmare安装CentOS7及连接Xshell超详细过程 xff08 图文 xff09 前言一 准备工作二 安装虚拟机过程 1 选择文件 xff0c 新建虚拟机 2 选择配置类型 3 自定义硬件配置 4 进入系统安装界面 二 连接Xshe
  • rpm与yum

    rpm与yum 前言一 应用程序与命令系统的关系二 典型应用程序的目录结构三 常见的软件封装类型四 rpm 1 概述 2 命令概述 3 查询rpm软件包信息 查询已安装的rpm软件信息 查询未安装的rpm软件包文件中的信息 安装 升级 卸载
  • Linux用户与权限管理

    Linux用户与权限管理 前言一 管理用户账号 1 用户账号概述 用户标识UID xff08 User IDentity xff0c 用户标识号 xff09 用户账号文件 2 用户账号管理 添加用户账号 xff08 useradd xff0
  • yum源仓库

    yum源仓库 前言一 yum介绍一 yum源的提供方式 1 配置本地仓库 2 配置ftp源 三 yum命令 1 yum常用的操作 2 搜索软件包命令 3 安装升级 4 软件卸载 5 yun history命令 总结 前言 yum相对与rpm
  • C++常见问题的总结

    1 C语言跟C 43 43 的关系 xff1a xff08 1 xff09 C语言跟C 43 43 的本质区别 xff1a 1 xff09 c更倾向于面向过程 xff0c c 43 43 是面向过程 43 面向对象 43 泛型编程 2 xf
  • Nginx Rewrite

    Nginx Rewrite 前言一 nginx rewrite概述 1 概述 2 跳转场景 3 跳转实现 4 rewrite实际场景 nginx跳转需要的实现方式 rewrite放在server if location 段中 对域名或参数字
  • Dockerfile概念简介

    Dockerfile概念简介 前言一 dockerfile概念二 Docker镜像的创建 1 基于现有镜像创建 2 基于本地模板创建 3 基于dockerfile创建 dockerfile结构 xff08 四部分 xff09 构建镜像命令
  • 【云原生之k8s】k8s基础详解

    云原生之k8s k8s基础详解 前言一 kubernetes介绍 1 kubernetes简介 2 应用部署方式的演变 二 kubernetes组件 1 kubernetes架构 2 master组件 apiserver controlle
  • 【云原生之k8s】kubeadm搭建k8s集群

    云原生之k8s kubeadm搭建k8s集群 前言一 集群介绍 1 集群搭建方法 2 集群架构 二 集群部署 1 环境部署 所有节点 xff0c 关闭防火墙规则 xff0c 关闭selinux xff0c 关闭swap交换 修改主机名 xf

随机推荐

  • 【云原生之k8s】k8s管理工具kubectl详解

    云原生之k8s k8s管理工具kubectl详解 前言一 陈述式管理 1 陈述式资源管理方法 2 k8s相关信息查看 查看版本信息 查看节点信息 查看资源对象简写 查看集群信息 配置kubectl自动补全 查看日志 基本信息查看1 查看ma
  • 关于结构体指针与STM32外设的笔记

    96 define RCC RCC TypeDef RCC BASE xff09 96 逐步分解这句代码的含义 RCC TypeDef RCC BAS 其中 RCC BAS定义为 define RCC BASE AHBPERIPH BASE
  • visual studio与visual c++ 6.0的区别

    xfeff xfeff Visual Studio支持多种语言 xff0c Visual C 43 43 6 0 只支持C和C 43 43 Visual C 43 43 6 0 是Visual Studio 6 0的一个组成部分 xff0c
  • GD32F303 移植 FreeRTOS

    文章目录 1 准备工作1 1 软件版本1 2 源码下载1 3 基础工程 3 FreeRTOS 移植3 1 复制需要的内核文件3 2 添加文件到 Keil 工程3 3 添加 FreeRTOSConfig h 内核配置文件3 4 配置任务调度相
  • FreeRTOS 之 heap_4 踩坑之路

    参考博文连接 xff1a FreeRTOS系列 heap 4 c 内存管理分析FreeRTOS Heap 1 2 3 4 5 比较 示例工程代码库地址如下 xff1a GiteeGit 1 问题描述 博主在使用 heap 4 的 pvPor
  • GD32F30x Keil 环境下在 FreeRTOS 任务中使用浮点运算报 HardFault 异常的问题(二)

    文章目录 1 问题描述1 1 环境1 2 问题 2 参考资料3 来龙去脉3 1 定位问题3 2 xPortPendSVHandler3 3 EXC RETURN3 4 寄存器3 5 探索真像3 5 1 浮点任务切换到空闲任务3 5 2 空闲
  • 辛勤劳作

    本文只有在12月27日可以学习到 我对敬业的体会是 xff1a 正在从事的工作就是自己的生命 xff0c 它意味着每周7天 xff0c 每年52周一心扑在上面 写下上面这句话 xff0c 我的泪水差一点儿就涌了出来 14年的寿险生涯 xff
  • 无人机开发资料推荐

    作者 xff1a BlueSky 链接 xff1a https www zhihu com question 30084079 answer 52762050 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c
  • STM32移植使用mbedtls-2.24.0

    STM32移植使用mbedtls 2 24 0 目录 STM32移植使用mbedtls 2 24 0 xff08 1 xff09 关于PolarSSL xff08 2 xff09 mbedtls移植 xff08 3 xff09 移植测试 扫
  • C++中的 ::

    C 43 43 中的双冒号 第一种 xff0c 类作用域 xff0c 用来标明类的变量 函数 Human span class token operator span span class token function setName sp
  • 算法的类型:

    所有的算法可以大概分为以下三种类型 xff1a 1 xff0e 贪婪算法 greedy algorithm 该算法每一步所做的都是当前最紧急 最有利或者最满意的 xff0c 不会考虑所做的后果 xff0c 直到完成任务 这种算法的稳定性很差
  • 平衡三棱柱原理

    先用一个例子来解释角动量守恒 大家一定都知道直升机 xff0c 直升机除了机身上方有一个大的螺旋桨外其尾部也有一个螺旋桨 这个螺旋桨的作用就是用来保持机身不会转动的 xff0c 如果没有它 xff0c 当直升机上方的螺旋桨转动时 xff0c
  • 自抗扰控制(ADRC)

    1 ADRC控制原理和结构 xff08 1 xff09 最速跟踪微分器 TD xff08 2 xff09 扩张状态观测器 ESO xff08 3 xff09 非线性状态误差反馈 NLSEF 2 ADRC控制仿真 xff08 1 xff09
  • 深度学习算法归类

    监督式学习 xff1a 逻辑回归 xff08 Logistic Regression xff09 和反向传递神经网络 xff08 Back Propagation Neural Network xff09 非监督式学习 xff1a Apri
  • DQN代码-ROS-turtlebot3

    DQN代码解析 代码来自turtlebot3 qdn environment stage 4 py 发布话题 xff1a cmd vel 订阅话题 xff1a odom 服务话题 gazebo reset simulation gazebo
  • js 事件流(冒泡、捕获)与绑定事件方法

    一 xff1a 事件流 事件流描述的是从页面中接收事件的顺序 但 IE 的事件流是事件冒泡流 xff0c 而 Netscape Communicator 的事件流是事件捕获流 1 事件冒泡 IE 的事件流叫做事件冒泡 xff0c 即事件开始
  • python获取当前文件的目录与路径

    绝对路径与相对路径概念 从C 写起的叫绝对路径C Users Sa07 PycharmProjects pythonProject 深度学习 mnist识别手写体 path catch py 绝对路径中包含某个项目 xff0c 我们截取到这
  • 微信小程序的校园求职招聘系统uniapp 附源码

    随着现代网络通信技术越来越深入而广泛的应用 xff0c 国内的招聘网站如雨春笋 xff0c 各种各样的招聘网站映入眼帘 网络上五花八门的企业使得应聘者无从下手 企业在选择应聘者时也只能了解基本情况 针对这些情况 xff0c 本网站做出相应调
  • 机械臂雅可比矩阵导数(未验证)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 求解方法二 代码总结 前言 GitHub上边抄的 xff0c 看了几个算法是一样的 xff0c 自己没有验证就拿来用了
  • ORB-SLAM2与OpenMVS对接实现三维重建

    详细介绍如何实现ORB SLAM2与OpenMVS的对接过程 xff0c 打通上下游实现三位重建 xff0c 二话不说先干图 对于学SLAM的同学对ORB SLAM2可能并不陌生 xff0c 系统框架清晰明了 xff0c 代码风格清新脱俗