本博客內(nèi)容來源于網(wǎng)絡以及其他書籍,結(jié)合自己學習的心得進行重編輯,因為看了很多文章不便一一標注引用,如圖片文字等侵權(quán),請告知刪除。
傳統(tǒng)2D計算機視覺學習筆記目錄------->傳送門
傳統(tǒng)3D計算機視覺學習筆記目錄------->傳送門
前言
國慶結(jié)束,又是一段漫長的工作期,有點煩,~~~~ (>_<) ~~~~ 。本篇文章為大家介紹一個非常經(jīng)典也非常重要的算法,TSDF,kinFusion的靈魂所在。不知道kinfusion,那沒關(guān)系,看完這篇文章你就把kinfusion里面的精髓學到了。
TSDF 算法簡介
TSDF ,全稱:truncated signed distance function,基于截斷的帶符號距離函數(shù),是一種常見的在3D重建中計算隱勢面的方法。著名的Kinfusion就是才用TSDF來構(gòu)建空間體素的,通過求去每個體素的值,然后再使用之前提到的Marching Cube來提取表面的。
TSDF是在SDF進行改進的,是在SDF提出了截斷距離,具體內(nèi)容我們們在下面講 ,很簡單的。SDF是在2003年由S Osher提出。在擁有大內(nèi)存的顯卡并行計算的情況下,使用TSDF可以做到實時的重建效果,獲得了很多方面的落地使用。
下面我們一起來看一下,TSDF的具體的算法思路。

TSDF 算法思路
TSDF的算法的思路很樸素,就是用一個大的空間(我們稱之為volume)作為要建立的三維模型,這個空間可以完全包括我們的模型,volume由許多個小的體素(我們稱之為voxel,就是小立方體)組成,

每個voxel對應空間中一個點,這個點我們用兩個量來評價:
- 該voxel到最近的surface(當然我們已開始不知道,我們假設(shè)有)(一般稱作zero crossing)的距離,我們記作tsdf(x),即帶符號距離
- 體素更新時的權(quán)重,我們記作w 。

假設(shè)我們真是的面到相機的深度是ds,相機采集到的深度dv,那么符號距離值就是d(x) = ds - dv, 當d(x)>0 時說明該體素在真實的面的前面,小于0 ,則說明該體素在真實的面的后面。
可能你會說,這不是廢話嘛,我要是知道真是的面在哪里,還用什么TSDF啊。每一次相機采集出來的數(shù)值,我們都認為是最大可能真實面,在相機前后也有可能是真實面,但是概率要小。這個前后距離我們對它進行一定的限制,因為離得特別遠的話,其概率也是很小,我們就忽略了。

在計算新的拍攝幀的體素的符號距離值和體素更新的過程中,我們不是所有的體素都查找和更新,而是只查找更新截斷距離內(nèi)的體素,這也是TSDF與SDF不同的一點,大大縮短了計算量,并提高了精度。
下面來看一下其具體的計算過程會有更清晰的理解。
TSDF 算法的步驟
TSDF 算法我們分為一下這3部分:
- 準備工作
- 計算當前幀的TSDF值以及權(quán)重
- 當前幀與全局融合結(jié)果進行融合
1. 準備工作
- 建立長方體包圍盒,能夠完全包圍要重建的物體。
- 劃分網(wǎng)格體素,對包圍盒盡心劃分n等分,體素的大小取決于包圍盒和劃分體素的數(shù)目決定。我們將整個空間的體素全部存入GPU運算,每個線程處理一條(x,y)。即對于(x,y,z)的晶格坐標,每個GPU進程掃描處理一個(x,y)坐標下的晶格柱。
- 對于構(gòu)造的立體中的每個體素g,轉(zhuǎn)化g為世界坐標系下得三維位置點 p(根據(jù)體素的大小,以及體素的數(shù)目);
2. 計算當前幀的TSDF值以及權(quán)重
這一步我們遍歷所有的體素,以一個體素在世界坐標系三維位置點p為例
- 由深度數(shù)據(jù)的相機位姿矩陣,求世界坐標系下點p在相機坐標系下得映射點v,并由相機內(nèi)參矩陣,反投影v點求深度圖像中的對應像素點x,像素點x的深度值為value(x),點v到相機坐標原點的距離為distance(v);
- 那么p的sdf值為 sdf(p) = value(x)- distance(v)?,F(xiàn)在我們就要引入截斷距離了,計算出tsdf(p), 公式寫出來比較復雜,直接描述就是在截斷距離u以內(nèi),tsdf(p) = sdf(p)/|u|, 否則,如果sdf(p) >0,tsdf(p) = 1,sdf(p) <0,tsdf(p) = -1。
- 權(quán)重w(p)的計算公式:
w(p) = cos(θ)/distance(v),其中θ為投影光線與表面法向量的夾角。
經(jīng)過我們這一步就算出這一幀的所有體素的tsdf值以及權(quán)重值。
3. 當前幀與全局融合結(jié)果進行融合
如果當前幀是第一幀,則第一幀即是融合結(jié)果,否則需要當前幀與之前的融合結(jié)果在進行融合。我們命名大寫TSDF(p)為體素p的融合TSDF值,W(p)為融合權(quán)重值,tsdf(p)為體素p當前幀的TSDF值,w(p)為當前幀權(quán)重值?,F(xiàn)在我們要通過tsdf(p)更新TSDF(p)。公式如下:
通過上述公式就可以將新的幀融合進融合幀內(nèi)。
第一部分完成后,就是每添加一幀深度數(shù)據(jù),執(zhí)行一遍2,3步的計算,知道最后輸出結(jié)果給Marching Cube計算提出三角面。
TSDF 算法的特點
TSDF 算法的特點就是計算非常簡單,沒有復雜的計算,但是其需要大量的并行。所以在大規(guī)模并行化顯卡出現(xiàn) 之前,其計算需要非常長的時間。而用上顯卡之后,其計算速度非??欤梢宰龅綄崟r,需要比較大顯存的顯卡。
TSDF 生成的網(wǎng)格的細節(jié)保持比較好,而且精確度也比較好,但是在邊緣處以及前后景交界處,會出現(xiàn)較大的拖尾現(xiàn)象。因為在體素p向像素坐標系投影時會有一定的誤差。
總結(jié)
TSDF 可以說是極大的促進了3維重建的平民化以及落地進程,可以出說初入門三維重建必須要學習的一個算法。其實寫完了,才發(fā)現(xiàn)之前的理解竟然有的地方有錯誤,還是要用文字表達出來,學的才能更徹底。

重要的事情說三遍:
如果您看到我的文章對您有所幫助,那就點個贊唄 ( * ^ __ ^ * )
如果您看到我的文章對您有所幫助,那就點個贊唄( * ^ __ ^ * )
如果您看到我的文章對您有所幫助,那就點個贊唄( * ^ __ ^ * )
傳統(tǒng)2D計算機視覺學習筆記目錄------->傳送門
傳統(tǒng)3D計算機視覺學習筆記目錄------->傳送門
任何人或團體、機構(gòu)全部轉(zhuǎn)載或者部分轉(zhuǎn)載、摘錄,請保留本博客鏈接或標注來源。博客地址:開飛機的喬巴
作者簡介:開飛機的喬巴(WeChat:zhangzheng-thu),現(xiàn)主要從事機器人抓取視覺系統(tǒng)以及三維重建等3D視覺相關(guān)方面,另外對slam以及深度學習技術(shù)也頗感興趣,歡迎加我微信或留言交流相關(guān)工作。