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.pswp.cn/news/252369.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252369.shtml
英文地址,請注明出處:http://en.pswp.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清除異常,讓文件指針回到開頭…