BundleFusion代码框架讲解

背景:前面用了几篇文章来记录和总结了,我在研究bundlefusion过程中遇到的一些问题以及解决方法,本来想实现给bundlefusion输入先验轨迹,然后让其根据给定的轨迹进行重建,这样即便在环境比较恶劣的情况下,也可以使用给定的位姿完成重建任务,但是这段时间对bundlefusion有了新的认识,意识到这件事没有我想象的那么简单。bundlefusion的研究工作就要告一段落了,所以最后我对bundlefusion做一个大的总结,把网络上一些经典的文章,整合起来。

一、 首先是先明白bundlefusion的工作原理,当然要阅读他的论文,英文的论文也不是很难读,当然也可以看我师兄的总结文章:https://blog.csdn.net/fuxingyin/article/details/52921958,有了这篇文章,如果想了解的更具体,那么就认真阅读一遍,bundlefusion的论文,主要关注一下bf的优化机制。

二、 另外一个重点当然是读代码了,说实话代码我读的不是很通透,主要是参考这篇文章,https://zhuanlan.zhihu.com/p/86718461 了解了代码的脉络,在这里,我将在这篇文章的基础上添加一些细节,这样不仅让我自己对bf的代码有更加深刻的理解,同时也希望能给志同道合的小伙伴更加高效的学习bf的方法。

三、制作.sens数据集可以参考我前一段时间写的博客:https://blog.csdn.net/weixin_38636815/article/details/107694846

四、BundleFusion代码讲解

1. bundlefusion中的主要参数

bundlefusion工程中有很多参数,众多的参数被分到两个文件中,zParametersBundlingDefault.txt和zParametersDefault.txt。

在zParametersBundlingDefault.txt中重要参数如下:

 

  • s_numLocalNonLinIterations = 2; //局部非线性优化迭代次数
  • s_numLocalLinIterations = 100; //局部线性优化迭代次数
  • s_numGlobalNonLinIterations = 3; //全局非线性优化迭代次数
  • s_numGlobalLinIterations = 150; //全局线性优化迭代次数

在上面的这四个参数中,s_numLocalLinIterations 起到了关键的作用,下面是我在ICL_NUIM数据集上测试的几组参数的模型效果,也可以看出s_numLocalLinIterations 起到了重要的作用。

s_numLocalNonLinIterations = 1;
s_numLocalLinIterations = 1;
s_numGlobalNonLinIterations = 1;
s_numGlobalLinIterations = 1;

s_numLocalNonLinIterations = 1;
s_numLocalLinIterations = 50;
s_numGlobalNonLinIterations = 1;
s_numGlobalLinIterations = 1;

 

s_numLocalNonLinIterations = 1;
s_numLocalLinIterations = 1;
s_numGlobalNonLinIterations = 1;
s_numGlobalLinIterations = 100; 

  • s_downsampledWidth = 80;
  • s_downsampledHeight = 60;

上面两个参数主要是用于Correspondence Filtering中的dense verification中,如果设置的不恰当,会导致在跟踪过程中,容易跟踪失败,导致重建的稠密模型确实。我测试自己的数据集时,使用的是kinectv2深度相机获取的960x540的图像,发现在测试一次采集的数据时,有很长一段距离跟踪失败,导致最终重建的模型确实一大块,我抱着试试看的态度,调试参数,在修改了这两个参数后,之前跟丢的部分竟然跟踪上了。所以要根据你实际使用的图像的分辨率来调节这两个参数。

在zParametersDefault.txt文件中

  • s_maxNumKeysPerImage = 1024; //每一帧图像上检测的最多的sift特征点的个数。
  • s_widthSIFT = 640;
  • s_heightSIFT = 480;
  • s_windowWidth = 640;        //render window width
  • s_windowHeight = 480;
  • s_integrationWidth = 320;    //input depth gets re-sampled to this width (decrease to improve perf.)
  • s_integrationHeight = 240;    //input depth gets re-sampled to this height (decrease to improve perf.)
  • s_rayCastWidth = 320;        //should be same as integration except if rendering video
  • s_rayCastHeight = 240;

上面这些跟输入的图像的分辨率有关的参数也一定要根据自己使用的数据来响应的修改。

2. 不怕大家见笑,我刚开始读orb-slam2代码的时候,过了好久才想到,我还一直没有去看程序的主函数呢?哈哈,现在想想这真是作为程序员的耻辱。以后无论读什么代码我都必须先找到main函数,然后去先捋清楚代码的主干脉络,并且使用xmind软件将代码的思维导图画出来,这样整个工程的主干就很清楚了。

 

  • main() FriedLiver:程序入口
    • g_RGBDSensor = getRGBDSensor();//根据你设置的s_sensorIdx来判断你输入的数据的形式,是深度相机还是.sens文件。
    • g_RGBDSensor->createFirstConnected(); //这个函数主要是读取输入的.sens文件中的数据,彩色图,深度图,pose,还有info.txt
    • std::thread bundlingThread(bundlingThreadFunc); //开启多线程,进行跟踪和优化。
      •  std::thread(bundlingOptimizationThreadFunc);
        • bundlingOptimization();
          • g_bundler->process()
            • optimizeLocal()
            •  processGlobal()
            • optimizeGlobal()
    • startDepthSensing(g_bundler, getRGBDSensor(), g_imageManager); //重建
  • startDepthSensing
    • OnD3D11FrameRender
      • bool bGotDepth = g_CudaImageManager->process(); // Read Input
      • reintegrate(); //更新模型,包括:deintegrate和integrate
      • integrate(depthCameraData, transformation); //Reconstruction of current frame
      • Render
      • StopScanningAndExit(); //这个函数中实现将计算的位姿保存的.sens中的pose数据,并且生成.ply模型
  • OnlineBundler
    • OnlineBundler()
      • m_bHasProcessedInputFrame=false
      • m_bExitBundlingThread=false
      • m_lastFrameProcessed = -1
    • getCurrentFrame()
    • processInput()
      •  Bundler::detectFeatures()
      •  Bundler::storeCachedFrame()
      •  Bundler::matchAndFilter()
    • process()//BundleFusion Optimization
      • optimizeLocal()
      •  processGlobal()
      • optimizeGlobal()
  • Bundler
    • detectFeatures() //检测图像sift特征点
    • storeCachedFrame() //缓存数据
    • matchAndFilter() //匹配和过滤当前帧和之前所有帧的sift特征点,计算3D点。
    • optimize() //稀疏点优化
  • CUDASolverBundling 求解器

 

BundleFusion代码对于我来说还是太庞大了,在短时间内很难吃透很多细节,这一阶段的bundlefusion的研究就暂时告一段落了,如果以后有机会,重新开始研究他。

 

 

 

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

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

相关文章

BundlePhobia

1、BundlePhobia用于分析npm package的依赖、bundle后的大小、下载速度预估等等,帮助你在引用一个package之前了解引入该package的代价。 2、也可以将项目的package.json文件上传,BundlePhobia会帮你评估项目中所有包的大小和加载速度。

VFL演示样例

VFL演示样例 上篇文章向大家介绍了VFL的基本的语法点,假设对下面演示样例不熟的童鞋,能够前去參考。废话不多说。我们直接来看演示样例。演示样例一 将五个大小同样、颜色不同的view排成一行,view间的间隔为15px,第一个view的间隔与屏幕的左边…

ubuntu16.04 + ros-kinetic 配置cartographer

其实一直以来都感觉纯视觉SLAM很难落地产品,所以一直在找机会学习激光slam,之前也在深蓝学院上买了一个激光salm的课程,惭愧,至今也没开始学呢,年底之前,我想工作之余研究一下激光slam和ros,我感觉这两个东…

virtualbox中安装ubuntu

为什么80%的码农都做不了架构师?>>> virtualboxubuntu 安装virtualbox,当前版本是6.0.4下载ubuntu安装盘,建议lubuntu,链接是http://mirrors.ustc.edu.cn/ubuntu-cdimage/lubuntu/releases/18.04.2/release/lubuntu-1…

面向对象重写(override)与重载(overload)区别

一、重写(override) override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。 重写(覆盖)的规则&#…

cartographer学习笔记--如何保存cartagrapher_ros建好的地图

今天开始跟着网友大佬学习cartographer. 1. 如何保存cartographer的地图数据 在运行cartographer过程中可以随时保存建好的地图,步骤如下: 首先是重新打开一个terminal, 如果你没有将你的cartographer_ros下的setup.bash文件写入到.bashrc中&#xff…

Java微信公众号开发(五)—— SVN版本控制工具

1 作用 两个疑问: 什么是版本控制?为什么要用版本控制工具?作用: 受保护受约束合作开发中,版本控制工具更重要的作用就是让开发者更好地协作,每个人的代码既能互相调用,来共同完成一个较大的功…

Linux之《荒岛余生》(二)CPU篇

为什么80%的码农都做不了架构师?>>> 温馨提示,动图已压缩,流量党放心查看。CPU方面内容不多,我们顺便学点命令。本篇是《荒岛余生》系列第二篇,垂直观测CPU。其余参见: Linux之《荒岛余生》&am…

Ubuntu16.04上安装kitti2bag

kitti2bag是一个可以将kitti数据集转换为bag文件的工具,可以直接通过pip进行安装。由于kitti2bag中使用到ros,所以安装时你使用的python版本应该是2.7的因为ros只有在Python2.7时才能正常工作。比如说我,我安装了conda,在conda中安…

UICollectionView 具体解说学习

UICollectionView 和UITableView非常像,是APPLE公司在iOS 6后推出的用于处理图片这类UITableView 布局困难的控件,和UITableView 一样,它也有自己的Datasource和delegate。以下具体说下像这种方式的效果. 首先来看看UICollectionView 的DataSource。protocol UICollectionView…

ServiceNow 中关于UI Action 在portal端的使用

在 portal端是可以使用Form和UI Action的,例如:var data.f $sp.getForm();//需要添加上相应参数在开箱组件Form的Server script中就有如下代码:data.f $sp.getForm(data.table, data.sys_id, data.query, data.view);data.f对象中…

系统安全题目(二)

1、在 php mysql apache 架构的web服务中输入GET参数 index.php?a1&a2&a3 服务器端脚本 index.php 中$GET[a] 的值是?正确答案: C A 1B 2C 3D 1,2,3 2、以下哪些不是CSRF漏洞的防御方案?正确答案: D A 检测HTTPrefererB 使用随机tokenC 使用验…

ceres-solver学习笔记

前一段时间总有一个想法,那就是,我只直到视觉slam是远远不够的,激光slam仍然是一个比较稳妥的技术,好落地,应用广泛,我想着,如果我学会了会大大增加自己的核心竞争力,所以我抽时间开…

几款常见的视频格式转换器

在短视频占半壁江山的时候,关于体积、格式等成了困扰人们的因素,视频太大不利于传播,比如微信里就限制了传输的大小不得超过20M,所以其实说起来工作上QQ的性能远超微信。今天这里小编给大家总结几款常用的视频转换器,希…

egg(110,111,112)--egg之微信支付

微信支付前的准备工作 准备工作 准备工作:个体工商户、企业、政府及事业单位。需要获取内容 appid:应用 APPID(必须配置,开户邮件中可查看)MCHID:微信支付商户号(必须配置,开户邮件中…

旋转三维平面与某一坐标平面平行

在上一篇文章(https://blog.csdn.net/weixin_38636815/article/details/109495227)中我写了如何使用ceres,根据一系列的点来拟合一个平面,很难保证ORB-SLAM输出的轨迹严格与某一个坐标平面平行,所以这篇文章我我将说一…

windows下配置opencv

我的windows下是使用的一个镜像安装的vs2015,然后在vs上编译工程需要使用opencv时,需要在工程中配置opencv 新建一个C工程,按照下面的步骤进行配置。 设置opencv的环境变量 “此电脑”右键点击“属性”-->选择“高级系统设置”-->选…

面试时,面试官到底在考察什么?

作者:白海飞出处:极客时间《面试现场》专栏 先看一段面试对话,“大面”是一位久经沙场的面试官,小明就是今天的应聘者。一通面试下来,前面的技术问题小明都对答如流,双方相谈甚欢,接下来面试官“…

NoSQL-MongoDB with python

前言: MongoDB,文档存储型数据库(document store)。NoSQL数据库中,它独占鳌头,碾压其他的NoSQL数据库。 使用C开发的,性能仅次C。与redis一样,开源、高扩展、高可用。 基于分布式文件…

linux 一个超简单的makefile

2019独角兽企业重金招聘Python工程师标准>>> makefile 自动化变量&#xff1a; $ : 规则的目标文件名 例如&#xff1a;main:main.o test.o g -Wall -g main.o test.o -o main 可以写成&#xff1a; main:main.o test.o g -Wall -g main.o test.o -o $ $< : …