BundleFusion代码框架讲解

2023-05-16

背景:前面用了几篇文章来记录和总结了,我在研究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的研究就暂时告一段落了,如果以后有机会,重新开始研究他。

 

 

 

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

BundleFusion代码框架讲解 的相关文章

随机推荐

  • “sudo: aptitude: command not found”问题解决办法

    caoxuepeng 64 caoxuepeng G3 3579 sudo aptitude install libhdf5 serial dev sudo aptitude command not found 问题描述 xff1a 命令不
  • apm软件仿真+QGC地面站 环境搭建

    本教程使用场景 xff1a apm软件仿真运行于虚拟机 ubuntu环境 qgc地面站位于windows 系统 两个环境在同一台电脑上 一 apm仿真环境搭建 1 安装vm虚拟机及ubuntu 18 2 ubuntu下 下载Ardupilo
  • GPS基础知识(四)、GPS信号结构

    GPS信号结构 xff08 三层 xff09 载波伪码数据码 一 xff0c 载波 载波是三层的基础 xff0c 伪码和数据码都是调制在载波上才能发送 GPS有两个载波频率 xff0c L1和L2 xff0c L1为1575 42MHz x
  • 简述四种干扰观测器(三)————基于扩张状态观测器的干扰观测器

    本节以最广泛应用的二阶系统为例介绍通用的线性观测器 非线性的扩张状态观测器将在将在自抗扰控制中介绍 观测器设计问题 xff0c 就是重新构造一个系统 xff0c 利用原系统中可以直接测量到的输出向量和输入向量作为它的输入信号 xff0c 并
  • Typora+PicGo+阿里云oss

    阿里云Oss图床 43 PicGo 43 Typora 之前用的gitee网上说可能会不稳定 xff0c 我就改成了阿里云OSS对象存储 参考 xff1a PicGo配置阿里云OSS 栗筝i的博客 CSDN博客 picgo 阿里云 1 注册
  • centos安装软件失败

    错误 xff1a 为仓库 appstream 下载元数据失败 Cannot prepare internal mirrorlist No URLs in mirrorlist 问题参考 CentOS Linux 8 AppStream 错误
  • Docker容器安装ssh

    Docker 容器里安装ssh和连接ssh 在服务器创建容器中安装了anaconda xff0c 为了方便敲代码 xff0c 用pycharm连接容器中的anaconda xff0c 我们需要安装ssh服务 前提 创建好docker容器 x
  • 阿里云创始人王坚正式回归阿里云

    5 月 11 日消息 xff0c 阿里云创始人王坚正式回归阿里云 据多名知情人士透露 xff0c 早在 2022 年底 xff0c 王坚其实就已经应张勇等人邀请 xff0c 以幕后顾问的角色进行考察和指导阿里云的工作 经过几个月的磨合和协商
  • random.seed()的用法

    random random 可以用来生成一个随机数 xff0c 如果在生成随机数之前 xff0c 先调用random seed x xff0c x可以是一个随机整数 xff0c 这时候在调用random random xff0c 则种子x和
  • PRGC: Potential Relation and Global Correspondence Based Joint Relational Triple Extraction

    标题 xff1a PRGC xff1a 基于潜在关系和全局对应的联合关系三元组抽取 摘要 联合抽取实体和关系的局限性 xff1a 关系预测的冗余性 xff0c 基于span抽取泛化能力差和效率低 本文从新角度将此任务分解为三个子任务 xff
  • 查看显存使用情况:nvidia-smi

    在装有nvidia驱动的机器终端输入nvidia smi xff0c 可以查看显卡的状况 xff0c 其输出界面如下 xff1a NVIDIA 系统管理接口 xff08 nvidia smi xff09 是一个命令行实用程序 xff0c 基
  • Docker更换Docker Root Dir目录

    原因 xff1a 我在加载自己的镜像时 xff0c 发现root空间不足 xff0c 无法加载 xff0c 所以需要更改Docker Root Dir目录 xff0c 才能放下我的镜像文件 具体方法 一 查看默认目录 执行docker in
  • PHP关于时间的整理

    year 61 date 34 Y 34 month 61 date 34 m 34 day 61 date 34 d 34 dayBegin 61 mktime 0 0 0 month day year 当天开始时间戳 dayEnd 61
  • 制作.sens数据集跑通bundlefusion

    1 主要参考这篇博客实现 https blog csdn net Wuzebiao2016 article details 94426905 2 首先就是将自己采集的RGBD图像的保存格式向Bundlefusion需要的格式对齐 xff0c
  • python之moviepy库的安装与使用

    目的 xff1a 因为需要保存一个大大的 mp4视频 xff0c 以防过程中设备出现异常导致整个长长的视频无法正常保存 xff0c 所以采用分段保存视频的方式 xff0c 每500帧保存一段 xff0c 然后再将视频合到一起 xff0e 最
  • 使用iai_kinect2标定kinectV2相机

    实验背景 xff1a 因为需要制作bundlefusion需要的数据集 xff0c 所以需要使用kinectV2相机获取rgbd图像 xff0c 年前的时候在我的笔记本上安装了libfreenect2库和iai kinect2 xff0c
  • python中将四元数转换为旋转矩阵

    在制作bundlefusion时 想测试TUM数据集 并且将groundtruth写入到数据集中 TUM中给定的groundtruth中的旋转是使用四元数表示的 而bundlefusion中需要SE3的形式 所以我需要首先将四元数转换为旋转
  • 做了8年游戏开发的程序员对未来的忧虑

    编者按 xff1a 这位做了8年游戏开发的程序员的忧虑或许不是个例 xff0c 也可能是我们许多人正在经历或者将要经历的一个人生迷茫期 鉴于此 xff0c 希望他的忧虑和对未来的思考也能对你在现在或者将来的选择上有所帮助 我 22 岁毕业
  • BundleFusion那些事儿

    背景 xff1a 前面几篇博客中写了很多关于BundleFusion的东西 xff0c 主要包括bundlefusion的论文阅读笔记 xff0c sens数据集的生成等 xff0c 经过最近几天的工作 xff0c 我对bundlefusi
  • BundleFusion代码框架讲解

    背景 xff1a 前面用了几篇文章来记录和总结了 xff0c 我在研究bundlefusion过程中遇到的一些问题以及解决方法 xff0c 本来想实现给bundlefusion输入先验轨迹 xff0c 然后让其根据给定的轨迹进行重建 xff