本博客內(nèi)容來源于網(wǎng)絡(luò)以及其他書籍狡刘,結(jié)合自己學(xué)習(xí)的心得進(jìn)行重編輯,因?yàn)榭戳撕芏辔恼虏槐阋灰粯?biāo)注引用困鸥,如圖片文字等侵權(quán)嗅蔬,請告知?jiǎng)h除剑按。
傳統(tǒng)2D計(jì)算機(jī)視覺學(xué)習(xí)筆記目錄------->傳送門
傳統(tǒng)3D計(jì)算機(jī)視覺學(xué)習(xí)筆記目錄------->傳送門
前言
國慶結(jié)束,又是一段漫長的工作期澜术,有點(diǎn)煩艺蝴,~~~~ (>_<) ~~~~ 。本篇文章為大家介紹一個(gè)非常經(jīng)典也非常重要的算法鸟废,TSDF猜敢,kinFusion的靈魂所在。不知道kinfusion盒延,那沒關(guān)系缩擂,看完這篇文章你就把kinfusion里面的精髓學(xué)到了。
TSDF 算法簡介
TSDF 兰英,全稱:truncated signed distance function撇叁,基于截?cái)嗟膸Х柧嚯x函數(shù),是一種常見的在3D重建中計(jì)算隱勢面的方法畦贸。著名的Kinfusion就是才用TSDF來構(gòu)建空間體素的,通過求去每個(gè)體素的值楞捂,然后再使用之前提到的Marching Cube來提取表面的薄坏。
TSDF是在SDF進(jìn)行改進(jìn)的,是在SDF提出了截?cái)嗑嚯x寨闹,具體內(nèi)容我們們在下面講 胶坠,很簡單的。SDF是在2003年由S Osher提出繁堡。在擁有大內(nèi)存的顯卡并行計(jì)算的情況下沈善,使用TSDF可以做到實(shí)時(shí)的重建效果,獲得了很多方面的落地使用椭蹄。
下面我們一起來看一下闻牡,TSDF的具體的算法思路。
TSDF 算法思路
TSDF的算法的思路很樸素绳矩,就是用一個(gè)大的空間(我們稱之為volume)作為要建立的三維模型罩润,這個(gè)空間可以完全包括我們的模型,volume由許多個(gè)小的體素(我們稱之為voxel翼馆,就是小立方體)組成割以,
每個(gè)voxel對應(yīng)空間中一個(gè)點(diǎn),這個(gè)點(diǎn)我們用兩個(gè)量來評價(jià):
- 該voxel到最近的surface(當(dāng)然我們已開始不知道应媚,我們假設(shè)有)(一般稱作zero crossing)的距離严沥,我們記作tsdf(x),即帶符號距離
- 體素更新時(shí)的權(quán)重,我們記作w 中姜。
假設(shè)我們真是的面到相機(jī)的深度是ds消玄,相機(jī)采集到的深度dv,那么符號距離值就是d(x) = ds - dv, 當(dāng)d(x)>0 時(shí)說明該體素在真實(shí)的面的前面,小于0 莱找,則說明該體素在真實(shí)的面的后面酬姆。
可能你會說,這不是廢話嘛奥溺,我要是知道真是的面在哪里辞色,還用什么TSDF啊。每一次相機(jī)采集出來的數(shù)值浮定,我們都認(rèn)為是最大可能真實(shí)面相满,在相機(jī)前后也有可能是真實(shí)面,但是概率要小桦卒。這個(gè)前后距離我們對它進(jìn)行一定的限制立美,因?yàn)殡x得特別遠(yuǎn)的話,其概率也是很小方灾,我們就忽略了建蹄。
在計(jì)算新的拍攝幀的體素的符號距離值和體素更新的過程中,我們不是所有的體素都查找和更新裕偿,而是只查找更新截?cái)嗑嚯x內(nèi)的體素洞慎,這也是TSDF與SDF不同的一點(diǎn),大大縮短了計(jì)算量嘿棘,并提高了精度劲腿。
下面來看一下其具體的計(jì)算過程會有更清晰的理解。
TSDF 算法的步驟
TSDF 算法我們分為一下這3部分:
- 準(zhǔn)備工作
- 計(jì)算當(dāng)前幀的TSDF值以及權(quán)重
- 當(dāng)前幀與全局融合結(jié)果進(jìn)行融合
1. 準(zhǔn)備工作
- 建立長方體包圍盒鸟妙,能夠完全包圍要重建的物體焦人。
- 劃分網(wǎng)格體素,對包圍盒盡心劃分n等分重父,體素的大小取決于包圍盒和劃分體素的數(shù)目決定花椭。我們將整個(gè)空間的體素全部存入GPU運(yùn)算,每個(gè)線程處理一條(x,y)坪郭。即對于(x,y,z)的晶格坐標(biāo)个从,每個(gè)GPU進(jìn)程掃描處理一個(gè)(x,y)坐標(biāo)下的晶格柱。
- 對于構(gòu)造的立體中的每個(gè)體素g,轉(zhuǎn)化g為世界坐標(biāo)系下得三維位置點(diǎn) p(根據(jù)體素的大小歪沃,以及體素的數(shù)目);
2. 計(jì)算當(dāng)前幀的TSDF值以及權(quán)重
這一步我們遍歷所有的體素嗦锐,以一個(gè)體素在世界坐標(biāo)系三維位置點(diǎn)p為例
- 由深度數(shù)據(jù)的相機(jī)位姿矩陣,求世界坐標(biāo)系下點(diǎn)p在相機(jī)坐標(biāo)系下得映射點(diǎn)v沪曙,并由相機(jī)內(nèi)參矩陣奕污,反投影v點(diǎn)求深度圖像中的對應(yīng)像素點(diǎn)x,像素點(diǎn)x的深度值為value(x)液走,點(diǎn)v到相機(jī)坐標(biāo)原點(diǎn)的距離為distance(v)碳默;
- 那么p的sdf值為 sdf(p) = value(x)- distance(v)〖窒荩現(xiàn)在我們就要引入截?cái)嗑嚯x了,計(jì)算出tsdf(p), 公式寫出來比較復(fù)雜嘱根,直接描述就是在截?cái)嗑嚯xu以內(nèi)髓废,tsdf(p) = sdf(p)/|u|, 否則,如果sdf(p) >0该抒,tsdf(p) = 1,sdf(p) <0慌洪,tsdf(p) = -1。
- 權(quán)重w(p)的計(jì)算公式:
w(p) = cos(θ)/distance(v)凑保,其中θ為投影光線與表面法向量的夾角冈爹。
經(jīng)過我們這一步就算出這一幀的所有體素的tsdf值以及權(quán)重值。
3. 當(dāng)前幀與全局融合結(jié)果進(jìn)行融合
如果當(dāng)前幀是第一幀欧引,則第一幀即是融合結(jié)果频伤,否則需要當(dāng)前幀與之前的融合結(jié)果在進(jìn)行融合。我們命名大寫TSDF(p)為體素p的融合TSDF值芝此,W(p)為融合權(quán)重值憋肖,tsdf(p)為體素p當(dāng)前幀的TSDF值,w(p)為當(dāng)前幀權(quán)重值』槠唬現(xiàn)在我們要通過tsdf(p)更新TSDF(p)瞬哼。公式如下:通過上述公式就可以將新的幀融合進(jìn)融合幀內(nèi)。
第一部分完成后租副,就是每添加一幀深度數(shù)據(jù),執(zhí)行一遍2,3步的計(jì)算较性,知道最后輸出結(jié)果給Marching Cube計(jì)算提出三角面用僧。
TSDF 算法的特點(diǎn)
TSDF 算法的特點(diǎn)就是計(jì)算非常簡單,沒有復(fù)雜的計(jì)算赞咙,但是其需要大量的并行责循。所以在大規(guī)模并行化顯卡出現(xiàn) 之前,其計(jì)算需要非常長的時(shí)間攀操。而用上顯卡之后院仿,其計(jì)算速度非常快速和,可以做到實(shí)時(shí)歹垫,需要比較大顯存的顯卡。
TSDF 生成的網(wǎng)格的細(xì)節(jié)保持比較好颠放,而且精確度也比較好排惨,但是在邊緣處以及前后景交界處,會出現(xiàn)較大的拖尾現(xiàn)象碰凶。因?yàn)樵隗w素p向像素坐標(biāo)系投影時(shí)會有一定的誤差暮芭。
總結(jié)
TSDF 可以說是極大的促進(jìn)了3維重建的平民化以及落地進(jìn)程鹿驼,可以出說初入門三維重建必須要學(xué)習(xí)的一個(gè)算法。其實(shí)寫完了辕宏,才發(fā)現(xiàn)之前的理解竟然有的地方有錯(cuò)誤畜晰,還是要用文字表達(dá)出來,學(xué)的才能更徹底瑞筐。
重要的事情說三遍:
如果您看到我的文章對您有所幫助凄鼻,那就點(diǎn)個(gè)贊唄 ( * ^ __ ^ * )
如果您看到我的文章對您有所幫助,那就點(diǎn)個(gè)贊唄( * ^ __ ^ * )
如果您看到我的文章對您有所幫助面哼,那就點(diǎn)個(gè)贊唄( * ^ __ ^ * )
傳統(tǒng)2D計(jì)算機(jī)視覺學(xué)習(xí)筆記目錄------->傳送門
傳統(tǒng)3D計(jì)算機(jī)視覺學(xué)習(xí)筆記目錄------->傳送門
任何人或團(tuán)體野宜、機(jī)構(gòu)全部轉(zhuǎn)載或者部分轉(zhuǎn)載、摘錄魔策,請保留本博客鏈接或標(biāo)注來源匈子。博客地址:開飛機(jī)的喬巴
作者簡介:開飛機(jī)的喬巴(WeChat:zhangzheng-thu),現(xiàn)主要從事機(jī)器人抓取視覺系統(tǒng)以及三維重建等3D視覺相關(guān)方面闯袒,另外對slam以及深度學(xué)習(xí)技術(shù)也頗感興趣虎敦,歡迎加我微信或留言交流相關(guān)工作。