從點雲到網格(二)VRIP介紹

VRIP(Volumetric Range Image Processing),顧名思義,是從深度圖重建網格的一種方法。VRIP是Brian Curless和Marc Levoy在1996年提出來的方法,距今已經有20年的歷史了,依然屬於最好的方法之一。

VRIP的核心問題是

已知世界座標系下,某物體表面ff在不同視角下的深度圖f1^,...,fK^f1^,...,fK^,求ff。這裏隱含深度圖在世界座標系下的位姿是已知的。

許多三維測量方法,比如激光、TOF、結構光、雙目視覺等,都可以得到深度圖。因此這是一個非常有意義的問題。如何將這些深度圖融合成爲一個平滑的單一網格呢?這就是VRIP要解決的問題。
下面給出一個結構光成像的例子。左上圖是將不同視角拍攝到的深度圖(已轉化爲三維網格)匹配在一起後的情形。右上圖是左圖中某一部分的切面,可以看到很多層網格重疊在一起,噪聲、匹配誤差、採樣率等都反映在這個局部中。左下圖是VRIP的結果,右下圖是VRIP融合的結果和深度圖放在一起(棕色是深度圖,藍色是融合後的網格,只能看到一點點)。

VRIP的基本假設

VRIP最重要的假設是測量誤差沿着光線傳播方向(投影方向)並服從高斯分佈。假設fk^(u,v)fk^(u,v)是在第kk個視角下,光線從傳感器(u,v)(u,v)位置沿着傳播方向到達ff的距離的測量值,fk(u,v)fk(u,v)爲其真實值。那麼條件概率滿足

P(fk(u,v)|fk^(u,v))=ck(u,v)exp[−12(fk^(u,v)−fk(u,v)σk(u,v))2]P(fk(u,v)|fk^(u,v))=ck(u,v)exp⁡[−12(fk^(u,v)−fk(u,v)σk(u,v))2]

因此,VRIP算法和視角非常相關。

VRIP的模型

VRIP嘗試從概率的角度來描述核心問題。對任意曲面ff,P(f|f1^,...,fK^)P(f|f1^,...,fK^)爲ff的條件概率。那麼求解核心問題轉化爲一個最大似然問題

maxfP(f|f1^,...,fK^)maxfP(f|f1^,...,fK^)

經過一系列獨立性假設,

P(f|f1^,...,fK^)=∏Kk=1∏Mi=1∏Nj=1P(fk(i,j)|fk^(i,j))P(f|f1^,...,fK^)=∏k=1K∏i=1M∏j=1NP(fk(i,j)|fk^(i,j))

取對數,並轉化爲求和

E(f)=−ΣΣΣlog[P(fk(i,j)|fk^(i,j))]E(f)=−ΣΣΣlog⁡[P(fk(i,j)|fk^(i,j))]

將離散情形轉換爲連續情形

E(f)=−Σ∫∫Aklog[P(fk(u,v)|fk^(u,v))]dudvE(f)=−Σ∫∫Aklog⁡[P(fk(u,v)|fk^(u,v))]dudv

定義d(u,v,fk)=fk^(u,v)−fk(u,v)d(u,v,fk)=fk^(u,v)−fk(u,v),代入PP的表達式,則有

E(f)=12Σ∫∫Akwk(u,v)dk(u,v,fk)2dudvE(f)=12Σ∫∫Akwk(u,v)dk(u,v,fk)2dudv

上式還是建立在各個視角下的局部座標系(傳感器座標系)。將上式轉換到世界座標系下,有

E(f)=12Σ∫∫Awk(x,y,z)dk(x,y,z)2[vk(x,y,z)⋅(∂z∂x),∂z∂y,−1)]dxdyE(f)=12Σ∫∫Awk(x,y,z)dk(x,y,z)2[vk(x,y,z)⋅(∂z∂x),∂z∂y,−1)]dxdy

其中z=f(x,y)z=f(x,y) ,vkvk是第kk個視角的投影方向,dk(x,y,z)=f^(x,y,z,vk)−f(x,y)dk(x,y,z)=f^(x,y,z,vk)−f(x,y) ,爲三維點(x,y,z)(x,y,z)沿着第kk個視角的投影方向與深度圖對應點的測量值f^f^的距離,即Signed Distance Function。積分中點乘那項是從uvuv座標系轉換到xyzxyz座標系的JacobianJacobian矩陣。
下圖是SDF的示意圖。注意靠近傳感器的方向距離爲正,遠離傳感器的方向距離爲負。

下圖是同一個三維點在兩個視角下的SDF示意圖。注意SDF是沿着視角方向(光線傳播反方向)的。圖中d1<0,d2>0d1<0,d2>0。

於是,問題轉換爲

求,使得z=f(x,y),使得,使得z=f(x,y),使得E(f)E(f)最小。

求解這個問題涉及到很多偏導數、方向導數的知識,本人也並沒有完全搞明白。但問題的解卻是出乎意料的簡單

若z=f(x,y)z=f(x,y)滿足Σwk(x,y,z)dk(x,y,z)=0Σwk(x,y,z)dk(x,y,z)=0 ,則zz是最優解。

VRIP算法流程

定義D(x)=Σwk(x)dk(x)Σwk(x)D(x)=Σwk(x)dk(x)Σwk(x),那麼D(x)=0D(x)=0就是我們要重構的三維表面。實際應用中,D(x)D(x)可看作一個三維體數據(volume),D(x)=0D(x)=0通過提取DD的零等值面即可得到。因此,算法先增量構建DD,然後通過等值面提取方法得到三維網格。例如,Marching Cube就是一種高效提取等值面的算法,而且非常適合在GPU上實現。

需要指出的是,作者在論文中採用了TSDF(Truncated signed distance function),即在一條光線上,只考慮測量值z^z^附近一定範圍z^±δzz^±δz內的體素。一方面是因爲一條光線可能會穿過物體不止一次。另一方面這樣也可以減小搜索範圍,加速算法。

VRIP算法的框架如下:

/* 初始化 */ 
對每個三維體素,設其權重爲0。
/* 深度圖融合 */ 
對每個深度圖 {
  /* 準備 */ 
  網格化深度圖;
  計算每個點的權重;
  /* 更新體素 */
  對該視角下FOV中的體素 {
    沿投影方向找到深度網格中的對應點;
    計算其沿投影方向的SDF;
    插值得到其權重;
    更新這個體素的權重和SDF。
  }
}
/* 表面提取 */ 
提取零等值面。

着重強調一點,深度圖的權重需要儘量準確,特別是(1)對噪聲大的點能夠賦予較小的權重,(2)對於法向量和視角方向角度比較大的三維點,可以降低其權重(曲率大,採樣率不夠,重建誤差大)。

下圖是兩個視角下的TSDF的融合的示意圖。

下圖是多個視角下TSDF的融合(兩顆真實的牙齒)

VRIP的優缺點

VRIP的優點主要有

  • 它是一定意義下的最大似然解。這保證瞭解的精度。
  • 它是一個增量方法,每一次得到新的深度圖後,可簡單快速地加入到TSDF中。
  • 適合並行處理,可用GPU加速

VRIP的主要缺點有

  • VRIP生成的網格會附加一定的平滑效果,在存在噪聲和匹配誤差的情況下有時不能重建出細微的結構。
  • 如果深度圖存在匹配誤差,VRIP並不能消除這些誤差。這些誤差會反映在融合後的網格中(分層、噪聲等)。

VRIP的加速

VRIP算法的時間複雜度比較高。作者在CPU端做了很多優化和加速工作。假設深度圖平行於xyxy平面,且投影方向爲正交投影,那麼沿zz方向的所有體素在深度圖上的投影相同,因此其TSDF可以在zz方向上簡單計算得到,而且權重相等,不必要重複運算。作者的主要思路是,將不同視角下的深度圖和座標系,通過仿射變換和重採樣,映射到相對標準的位置(深度圖平行於xyxy平面),從而減少投影和權重的計算量。
如下圖所示,(a)某個視角下的深度圖及正交投影方向,投影方向和Voxel slices有一個夾角。(b)通過一個仿射變換,將投影方向變換爲與Voxel slices相垂直。一般而言,仿射變換後深度圖和Voxel slices仍然有夾角,因此還要將它在平行於slices的平面上重採樣。(c)將計算得到的TSDF變換回原座標系下的距離。

VRIP在SLAM中的應用

VRIP算法在RGBD SLAM中有着廣泛的應用。Kinect Fusion的作者並沒有採用CPU加速的方法,而是將VRIP算法移植到GPU上,利用Ray casing算法做到了網格的實時顯示,效果非常好。後來的Kintinuous、Elastic Fusion、Dynamic Fusion也都採用類似的架構去生成網格。

轉載請註明作者和出處(http://www.cnblogs.com/luyb),未經允許請勿用於商業用途。 [email protected]/LUYB 聯繫方式:luyanbin7 at gmail.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章