bundlefusion論文閱讀筆記

?

4. 全局位姿對齊(glob pose alignment)

輸入系統的是使用消費級的傳感器獲取的RGBD數據流,并且保證這些數據中的彩色圖像和深度圖像是時間和空間上都對齊的。圖像分辨率是640x480,頻率是30hz。我們的目的就是要找到frames之間的3D對應,然后根據這些對應信息找到剛體相機變換Ti。Ti(p) = Rip + ti(Ri為旋轉,ti為平移),Ti實現從相機系到世界系的映射。并且將系統的第一幀作為世界系的坐標系。

4.1 搜索特征匹配(Feature Correspondence Search)

在這個系統框架下,首先搜索圖像畫幀之間的saprse correspondences,包括特征提取,特征匹配和外點剔除步驟。這些稀疏的對應將會被用在接下來的dense photometric correspondences的搜索中。針對每一個input frame都要先提取sift特征點,將提取的這些點與之前所有看到的幀進行匹配。之所以使用sift特征,是因為他考慮了相機掃描過程中發生的的圖像的位移旋轉和尺度的變化。搜索correspondence的工作都是在GPU中完成的。在這樣的分辨率下,提取一幀圖像的特征和計算描述子需要4-5ms,匹配兩幅圖像需要大概0.05ms。基于以上的一些指標,該系統可以實時處理大致20k的圖像。

4.1.1 correspondece Filter

使用幾何和光度的連續性的方法來過濾掉檢測的不對的correspondences.

Key Point Correspondence Filter

圖像Fi和圖像Fj上的特征的3D correspondences, key point correspondence filter可以找到一組可以表示一個穩定的分布和連續的剛體變換的feature correspondences.對于新加入的correspondence我們計算一個剛體變換,使用Kabsch算法可以用這個剛體變化最小化當前correspondences的Pcur和Qcur之間的距離。隨后我們將執行一些條件分析,包括點Pcur和Qcur的協方差和Pcur和Qcur之間的cross-convariance、如果任何的condition numbers大于100,那么這個系統被認為是不穩定的。如果Tij下特征點的重投影誤差大于或者在上述condition number中系統被認為是不穩定的情況下,這些correspondences將被刪除。除非刪除情況不出現或者此時沒有足夠的特征點用來計算剛體變換。如果根據找到的correspindences已經計算出了一個剛體變換,那么就講Fi和Fj之間的這些correspondences刪除。

Surface Area Filter

另外,我們還檢查檢測到的特征張成出的面是否足夠大,因為我們認為,如果找到的correspondences張成的平面比較小,那么此時的correspondences趨于ambiguity.對于圖像Fi和圖像Fj,我們估計Fi圖像的3D點P張成的面的區域面積,以及Fj圖像的3D點Q張成的面的區域面積,然后我們將兩個三維的surfaces,根據他們的principal axes向平面投影。如果P和Q張成的面積不足0.032平方米,那么這組matches被認為是ambiguous并且被刪除。

Dense Verification

最后一步是執行稠密校驗,包括稠密光度校驗和稠密幾何校驗,對于圖像Fi和圖像Fj,我們使用上述通過key point correspondence filter計算得到的相對變換Tij,來對齊圖像Fi和圖像Fj之間的坐標系。為了找到有效的像素對應(pixel correspondence),我們測量重頭影兩個方向的,平均深度差別(depth discrepancy), 法向量偏差(normal deviation), 光度一致性(photoconsistancy), 并且計算這些pixel correspondences的重投影誤差。

4.2 等級化的優化(Hirerachinal Optimization)

為了能夠實時的處理成千上萬的RGBD圖像,我們使用了等級化的優化策略。輸入的連續的圖像序列被分割成小的chunk。在最低等級的優化中,我們在chunk內部實時優化。在第二等級優化中,使用所有的chunks中的代表關鍵幀以及該關鍵幀所在chunk內的相關的特征數據進行全局的優化。為了提高處理效率,這一步驟只在經過濾波的并且下采樣之后的圖像上執行。注意,為了提高效率,當有一個新的RGBD數據輸入到系統時,經過濾波和下采樣處理的彩色圖C和深度圖D被緩存下來。相機的空間位置Pi和每一個深度的法向量Ni也被計算兵器被緩存下來。

LocalIntra-Chunk Pose Optimization(chunk內部的位姿優化)

chunk內部的位姿對齊優化時基于該chunk內的11個連續的圖像幀數據的。連接的兩個chunk之間有一個重疊的圖像幀。局部位姿優化的目標是求解該chunk內任意一幀圖像相對于chunk中的第一幀圖像的變換{Ti}.通過搜索correspondences,構建代價方程,然后最小化代價方程的方式求解,代價方程中包含了稀疏特征correspondecs和dense photometric and geometric?correspondences約束。因為每一個chunk內只包含很少的連續圖像幀,并且chunk內的位姿變換也很小,所以可以將每一個Ti初始化為單位陣。為了確保局部位姿優化的精度,我們使用優化的局部軌跡對chunk內的每一對圖像實時dense verification測試,如果重投影誤差太大,大于0.05m,這個chunk就會別刪除,并且也不會被用到全局優化中來。

Per-Chunk Keyframes

一旦一個chunk已經被處理完成,我們將該chunk中的第一幀圖像定義為這個chunk的關鍵幀,同時也會計算這些關鍵幀的特征,得到keyframe feature set.根據chunk的優化的位姿估計,計算chunk內部的特征點在世界空間中的3D位置。我們將在<0.03m空間中的3D點用一個最佳的3D點來表示。一旦這個全局的關鍵幀和關鍵幀特征序列被創建,該chunk data(包括chunk內的特征點,描述子,和correspondences) 將被刪除,因為在第二層的位姿對齊中用不到他們了,但是他們的圖像還有,圖像的位姿態還有,當在全局優化中關鍵幀位姿被優化了,則這個關鍵幀所處的chunk中的其他幀的位姿將被被更新,要知道在intro-chunk優化中,我們已經知道了chunk中的任意一幀相對于第一幀的相對位姿.。

Global Inter-Chunk Pose Optimization

和chunk內的位姿優化類似,chunk間的全局位姿優化也是進行全局特征點之間的稀疏特征匹配搜索和外點剔除。如果一個關鍵幀在過去看到的關鍵幀中找到任意的匹配,那么這個關鍵幀被標記為“獨立” individual, 但是仍然被作為候選,允許被再次校驗,當將來得到關鍵幀與該關鍵幀之間有聯系。全局位姿優化需要計算所有全局關鍵幀的global alignments{Ti},同樣需要構建代價方程,最小化代價方程求解,同樣在代價方程中包括,稀疏和稠密兩種約束。使用對應的intra-chunk中優化的位姿的depta 變換來初始化全局關鍵幀的位姿。我們得到所有輸入幀的全局一致性變換,通過將對應的delta transformations作用到,chunk中的每一幀圖像,這樣就可以得chunk內沒一幀圖像的位姿。

5. Dynamic 3D Reconstruction(動態的3D重建)

需要根據最新優化的相機位姿,不斷更新重建的模型。我們采用integration和de -integration的方式來更新模型的表示。當累計誤差過大,或者特征過少導致的模型重建錯誤,可以被很好的恢復,一旦一個好的位姿估計可以獲取到。

5.1 Scene Representation

通過將RGBD數據融合到TSDF模型中來恢復場景的幾何,使用voxel hashing的方式來存儲TSDF中的數據。根據spatial harshing將TSDF存儲在一個稀疏的volumetric grid中。

5.2 Integration and De-integration

系統中分兩種pose一種是integration pose,一種是optimized pose是經過優化的位姿,首先我們按照integration pose將圖像數據融合到TSDF模型中,當位姿態被優化更新之后,我們就需要同時更新重建的模型,那么就需要按照integration pose將TSDF中的相關數據從TSDF中剔除掉,然后再按照優化后的位姿,重新將剛才被剔除出來的數據,融合到TSDF中,實現地圖更新的目的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252400.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252400.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252400.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IOC和DI的區別詳解

IOC 是英文inversion of control的縮寫&#xff0c;意思是控制反轉DI 是英文Dependency Injection的縮寫&#xff0c;意思是依賴注入 下面用一個簡單的例子來描述一下IOC和DI的關系 先看下總結&#xff1a; 依賴注入(DI)和控制反轉(IOC)是從不同的角度的描述的同一件事情&#…

TOMCAT啟動到一半停止如何解決

當你的項目過大的時候&#xff0c;往往會導致你的TOMCAT啟動時間過長&#xff0c;啟動失敗&#xff0c;遇到該情況可以試一下下面兩招&#xff1a; TOmcat啟動到一半的時候停止了&#xff0c;以下原因&#xff1a; 1、 tomcat啟動時間超過了設置時間&#xff1a; 解決辦法&…

視覺slam十四講ch6曲線擬合 代碼注釋(筆記版)

1 #include <opencv2/core/core.hpp>2 #include <ceres/ceres.h>3 #include <chrono>4 5 using namespace std;6 7 // 代價函數的計算模型8 struct CURVE_FITTING_COST9 {10 CURVE_FITTING_COST ( double x, double y ) : _x ( x ), _y ( y ) {}11 /…

Dojo 如何測試 widget

測試 dojo/framework/src/testing/README.mdcommit 84e254725f41d60f624ab5ad38fe82e15b6348a2 用于測試和斷言 Dojo 部件期望的虛擬 DOM 和行為的簡單 API。 測試 Features harness APICustom Comparatorsselectors harness.expect harness.expectPartial harness.triggerharn…

python中將四元數轉換為旋轉矩陣

在制作bundlefusion時,想測試TUM數據集,并且將groundtruth寫入到數據集中,TUM中給定的groundtruth中的旋轉是使用四元數表示的,而bundlefusion中需要SE3的形式,所以我需要首先將四元數轉換為旋轉矩陣,然后再將其與平移向量合并在一起,因為我之前關于生成bundlefusion數據集寫了…

js -- 時間轉年月日

/*** 時間轉年月日* param sdate 開始的時間* param edate 結束的時間* returns {*}*/function day2ymrStr2(sdate, edate) {var day2ymrStr "";var date1 new Date(edate);var date2 new Date(sdate);var y 0, m 0, d 0;var y1 date1.getFullYear();var m1 …

iOS sha1加密算法

最近在項目中使用到了網絡請求簽名認證的方法&#xff0c;于是在網上找關于OC sha1加密的方法&#xff0c;很快找到了一個大眾使用的封裝好的方法&#xff0c;以下代碼便是 首先需要添加頭文件 #import<CommonCrypto/CommonDigest.h> 然后直接使用下面的方法就可以了 //s…

Linux開發5款實用工具推薦

今天安利給大家5款實用的Linux開發工具&#xff0c;希望對大家工作效率的提升有所幫助。容器放眼于現實&#xff0c;現在已經是容器的時代了。容器既及其容易部署&#xff0c;又可以方便地構建開發環境。如果你針對的是特定的平臺的開發&#xff0c;將開發流程所需要的各種工具…

TUM數據集制作BundleFusion數據集

BundleFusion的數據集中,在生成.sens文件之前,包括彩色圖,深度圖和一個位姿文件,并且這個pose文件中的位姿態是有變化的,所以我懷疑,推測,在這個pose文件中可以寫入groundtruth的位姿,然后在重建的時候就按照傳入的位姿進行計算.為了測試一下效果,我從TUM數據集開始入手,這個數…

Linq查詢datatable的記錄集合

通過linq查詢datatable數據集合滿足條件的數據集 1.首先定義查詢字段的變量&#xff0c;比方深度 string strDepth查詢深度的值&#xff1b; var dataRows from datarow in dataTable(須要查詢的datatable數據集).AsEnumerable() where …

Java 概述和編程基礎

First of all&#xff0c;Java概述&#xff1a; 類是Java程序設計的基石和基本單元&#xff1b; main()方法是程序的入口&#xff0c;它是共有的、靜態的&#xff0c;參數String[] args表示一個字符串數組可以傳入該程序&#xff0c;用來傳遞外部數據以初始化程序。   計算機…

19、Fragment

一、Fragment 1.1、fragment介紹 fragment的出現是為了同時適應手機和平板&#xff0c;可以將其看做Activity的組成部分&#xff0c;甚至Activity界面完全由不同的Fragment組成&#xff0c;它擁有自己的生命 周期和接收、處理用戶的事件&#xff0c;更為重要的是&#xff0c;可…

喜好:

不喜歡吃&#xff1a;一瓣瓣的蘑菇、海帶、豆腐皮、 不喜歡喝&#xff1a;魚湯&#xff1b; 不喜歡吃&#xff1a;山楂片、法式小面包&#xff08;軟軟的&#xff09;、果凍、 不喜歡喝&#xff1a;對飲料無感、不喜歡脈動、可樂雪碧等少量還行、 喜歡&#xff1a;啃骨頭、排骨…

將TUM數據集制作成BundleFusion數據集

在上一篇文章中,我寫到了如何將TUM數據生成BundleFusion所需要的數據集,生成的數據集如下圖中所示.并且是將每一組數據的groundtruth.txt中的位姿數據寫如到這里的pose文件中,作為每一幀圖像的先驗位姿. 今天我便將生成的數據集轉換為了.sens格式,然后運行bundlefusion算法,第…

每一次突破都是一種進步

一直以來&#xff0c;我接觸一門新技術&#xff0c;都是先看開發文檔&#xff0c;了解了這個技術是做什么的&#xff0c;能做什么。但是不知道怎么起步&#xff0c;也不敢貿然動手。我的解決辦法是看視頻&#xff0c;看別人怎么使用&#xff0c;跟著別人做&#xff0c;然后聽別…

mysql盲注學習-1

mysql: 1.left() //left()函數 left(a,b)從左側截取a,的b位 2.mid() //mid()函數 參數 描述 column_name 必需。要提取字符的字段。 start 必需。規定開始位置&#xff08;起始值是 1&#xff09;。 length 可選。要返回的字符數。如果省略&#xff0c;則 MID() 函數…

二分學習筆記

寫在前面 二分是一種常用且非常精妙的算法&#xff0c;常常是我們解決問題的突破口。二分的基本用途是在單調序列或單調函數中做查找。因此當問題的答案具有單調性時&#xff0c;就可以通過二分把求解轉化為判定。進一步地&#xff0c;我們還可以通過三分法解決單調函數的極值以…

解析.sens數據集

python腳本在下面網址中https://github.com/ScanNet/ScanNet/tree/master/SensReader/python 一定要使用python2運行此腳本. 使用指令如下 python reader.py --filename /media/yunlei/YL/DATASETS/ICL_DATABASE/lr_kt1/living_room_traj1n_frei_png.sens --output_path /me…

ConcurrentHashMap 解讀

初始化&#xff1a; 問題&#xff1a;如何當且僅只有一個線程初始化table 1 private final Node<K,V>[] initTable() {2 Node<K,V>[] tab; int sc;3 while ((tab table) null || tab.length 0) {4 if ((sc sizeCtl) < 0)5 …

XML Schema 基本結構

<?xml version1.0?> <Schema name"cangchuSchema" metamodelVersion"4.0"><PhysicalSchema><Table name"highway_toll"><Key><Column name"uid"/></Key></Table><Table name&qu…