KinectFusion是一種利用kinect相機的深度數(shù)據(jù)進行實時三維重建的技術(shù)。本文學(xué)習(xí)一篇比較早的論文(見參考文獻(xiàn))关面,并對其進行詳細(xì)地講述。這篇文章構(gòu)建了KinectFusion的雛形,被后來者爭相follow腔长。
0.工作流程
KinectFusion的過程可以分為四個模塊:
- 表面測量(surface measurement)
這是一個預(yù)處理的過程胚泌,根據(jù)原始深度數(shù)據(jù)計算出稠密的頂點圖(vertex map)和法向圖(normal map)金字塔。 - 表面重建更新(surface reconstruction update)
全局場景融合過程肃弟,根據(jù)由跟蹤(tracking)得到的相機位姿(pose)玷室,新測量的surface measurement被融合到由TSDF表示的全局場景模型中 - 表面預(yù)測(surface prediction)
利用光線投影(raycasting)將模型投影到估計的frame獲得預(yù)測的surface - 傳感器位置估計(sensor pose estimation)
多尺度的ICP算法匹配measured surface和predicted surface。
1.surface measurement
首先對原始深度數(shù)據(jù)做雙邊濾波處理笤受,對處理后的深度圖做反投影(back-project)操作穷缤,得到vertex map。
向量之間的叉乘可以得到法向量箩兽,具體運算可以見圖3津肛。
得到vertex map和normal map后生成金字塔身坐。
2.surface reconstruction
surface construction的核心是TSDF及其更新秸脱。
TSDF全程Truncated Signed Distance Function。它將空間場景模型化為一個立方體柵格部蛇,每個柵格中都存有兩個值摊唇,一個是距離值F,另一個是權(quán)重值W涯鲁。
如圖4所示巷查,TSDF模型中存儲的距離值,surface處值為零撮竿,傳感器一側(cè)的值為正吮便,距離表面越遠(yuǎn)值越大,另一側(cè)值為負(fù)幢踏,距離表面越遠(yuǎn)值越小髓需。而權(quán)重值則與表面測量的不確定度有關(guān)。
而在實際的測量中房蝉,接近零的位置的值才是有效的僚匆,因此需要設(shè)定一個閾值u,將與surface距離大于u置為無效搭幻,不予考慮咧擂,而小于u的值進行歸一化截斷。
圖5給出了當(dāng)前幀TSDF距離值的計算方法檀蹋。
全局的TSDF是由每一幀單個的TSDF加權(quán)平均得來的松申,如圖6所示。
雖然理論上權(quán)重值和表面測量的不確定度有關(guān)俯逾,即與頂點光線方向和法線方向夾角的余弦值成正比贸桶,與相機中心和頂點的距離值成反比。但是在實際中桌肴,權(quán)重恒等于1可以得到很好的結(jié)果皇筛,并且權(quán)重的累積不是一直增大,而是設(shè)置了最大值閾值坠七,如圖7所示水醋。
3.Surface prediction
上文提到過,在TSDF模型中距離值F=0的位置就是surface的位置彪置,因此利用ray casting拄踪,從相機中出發(fā),逆著光線走悉稠,直到TSDF體元中的距離值由正變負(fù)或者由負(fù)變正宫蛆,即確定為surface的位置。
但是有一個問題的猛,在逆著光線方向走的時候耀盗,以多長距離為間隔呢?這里由于場景中很大一部分都是沒有物體的無效位置卦尊,每個體元都去判斷正負(fù)值顯然很費時間叛拷。這里就根據(jù)TSDF每個體元中存儲的距離值來確定步長,當(dāng)走到TSDF體元存儲著正距離值的時候岂却,步長要設(shè)定為小于u值忿薇,而在此之前,就以u值作為步長躏哩,這樣就可以快速找到正負(fù)變化的位置署浩。
好像還是哪里有問題。對扫尺,雖然正負(fù)變化的體元位置找到了筋栋,但是哪里才是表面確定位置,畢竟表面是一個值而不是一個有厚度的區(qū)域正驻。所以我們采用圖8的式子近似找到一個合理的位置弊攘。
找到surface的坐標(biāo)后襟交,預(yù)測的法向量可以由這一點的梯度得到,如圖9伤靠,并在不同尺度上計算以適應(yīng)不同的體元精度捣域。
4.pose estimation
相機的pose通過ICP算法求解。和一般的ICP不同宴合,這里的ICP不是通過兩幀之間的對應(yīng)點進行求解焕梅,而是將當(dāng)前幀的點與上一幀得到的predicted surface點進行匹配。在建立measured surface和predicted surface之間點的對應(yīng)關(guān)系時形纺,作者沒用使用過ICP中的最近點丘侠,而是將measured surface上的點投影到上一幀相機的位置,得到的圖像平面上的坐標(biāo)對應(yīng)的predicted surface上的點就是要找的對應(yīng)點逐样。如圖10所示蜗字。
在度量measured surface和predicted surface之間的誤差時挪捕,作者使用的是ICP中的點面誤差度量,如圖11争便。
由于變換矩陣中的旋轉(zhuǎn)部分是非線性的,所以求解這個目標(biāo)函數(shù)其實是一個非線性最小二乘問題,接下來作者就用近似的方法將其線性化奏纪,利用SVD分解的方法計算變換矩陣鉴嗤。
point-to-plane ICP算法的簡單介紹和詳細(xì)的線性求解方法可以參考我的另一篇文章:Point-to-Plane ICP算法的線性近似求解。
以上為算法全部內(nèi)容序调。
持續(xù)更新醉锅,歡迎提出質(zhì)疑或與作者就相關(guān)問題進行討論。
*參考文獻(xiàn)
[1]KinectFusion: Real-Time Dense Surface Mapping and Tracking
[2]A Volumetric Method for Building Complex Models from Range Images