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的间隔与屏幕的左边…

evo实用指令指南

下面这篇文章中有比较具体的关于evo的安装以及使用的介绍,其中一点很重要,就是可以把euroc形式的.csv的轨迹格式转换为tum格式的轨迹。 https://zhuanlan.zhihu.com/p/88223106#single evo_traj tum orb_slam2_tum.txt --reftum_groundtruth.txt -p --pl…

MailUtils

/***包名:com.thinkgem.jeesite.test*描述:package com.thinkgem.jeesite.test;*/ package com.thinkgem.jeesite.test;import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.regex.Matcher; import java.u…

ES6遍历对象

遍历对象 E S 6 一共有 5 种方法可以遍历对象的属性 。 for ... in for . . . in 循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。 Object.keys(obj)Object . keys 返回 一个数组,包括对象自身的(不含继承的 &#xff…

SpringMvc中ModelAndView模型的应用

/** * 目标方法的返回值可以是 ModelAndView 类型。 * 其中可以包含视图和模型信息 * SpringMVC 会把 ModelAndView 的 model 中数据放入到 request 域对象中. * return */ RequestMapping("/testModelAndView") public ModelAndView testModelAndView(){ String v…

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…

PTA 06-图2 Saving James Bond - Easy Version (25分)

题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/672 5-10 Saving James Bond - Easy Version (25分) This time let us consider the situation in the movie "Live and Let Die" in which James Bond, the worlds most famous spy, was captured by…

Ubuntu16.04上安装kitti2bag

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

Nginx之windows下搭建

去nginx.org下载nginx 以nginx-1.8.1为例解压到D盘nginx-1.8.1目录 假设NGINX_HOME为D:\nginx-1.8.1 3种启动途径: 一、双击nginx.exe图标,可见黑窗口一闪而过,启动完毕。 二、命令行到nginx目录,输入nginx启动。(注&a…

单片机错误笔记

记录下使用单片机过程中的一些错误,便于以后查询: 单片机型号:STC15F2K60S2 晶振:18.432 报错代码: *** WARNING L1: UNRESOLVED EXTERNAL SYMBOLSYMBOL: REC_DAT1MODULE: .\Objects\usart.obj (USART) …

软件开发记录03

今天我完成了软件设置&#xff0c;预算列表&#xff0c;添加预算的页面布局。 &#xff08;1&#xff09;软件设置 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"…

395. Longest Substring with At Least K Repeating Characters

题目要求 Find the length of the longest substring T of a given string (consists of lowercase letters only) such that every character in T appears no less than k times.Example 1:Input: s "aaabb", k 3Output: 3The longest substring is "aaa&qu…

UICollectionView 具体解说学习

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

70.文件异常

ferror检测文件异常perror提示文件错误信息clearerr清除异常,让文件指针回到开头完整代码 1 #define _CRT_SECURE_NO_WARNINGS2 #include<stdio.h>3 #include<stdlib.h>4 //perror提示文件错误信息5 //ferror检测文件异常6 //clearerr清除异常,让文件指针回到开头…