在計算機圖形學中,網格是一種非常基本的表示方法。隨着近些年三維表面重建和Dense SLAM的興起,從海量的三維點雲數據生成單一的網格的方法得到了大量的應用。特別是在AR中,因爲交互的需要,網格生成算法經常是一個必選項。
由於工作中正好涉及到一些這方面的應用,因此想簡單介紹一下這方面的知識。以下僅討論三維情形。
本文很多內容來源於Matthew Bolitho的博士論文1。這位仁兄現在在NVidia做Director of Architecture。
算法的輸入輸出
網格生成算法的輸入一般爲三維點雲,輸出爲三維網格。輸入的點雲一般爲若干個點雲的集合。輸出的網格一般爲單一的網格。
輸入的點雲一般有如下幾種形式:
- 只包含三維座標的點雲
P={p1,...,pN}P={p1,...,pN}
- 包含三維座標和法向量的點雲
P={(p1,n1),...,(pn,nN)}P={(p1,n1),...,(pn,nN)}
- 深度圖
2D 網格R∈RN×MR∈RN×M,實際上包含了三維座標,表面法向量和鄰域信息。
輸入的點雲一般面臨着下面幾個問題,如下圖所示:
- 點雲噪聲
每個點雲都會帶有噪聲,噪聲有可能和物體表面光學性質、物體深度、傳感器性能等都有關係。
- 點雲匹配誤差
三維重建中需要將不同幀得到的點雲估計其在世界座標系下的位姿,會引入一定的位置誤差。
- 點雲分佈
分佈的不均勻性體現在(1)每個小點雲在不同的方向上分佈是不均勻的(雖然傳感器上看是均勻的)如上圖3位置,(2)不同的點雲匹配在一起時,不同位置的點雲密度是不一樣的,如上圖2位置。
- 缺失數據
掃描中如果碰到不易成像的部位(比如不可見、反光等等),那麼這部分的數據是缺失的,即點雲是不完整的。如上圖1位置所示。
對算法的要求
一般而言,我們對於輸出的網格有一定的要求。除了網格密度和精度以外,我們還希望算法
- 對點雲噪聲有一定的冗餘度。
- 能夠重建出曲率變化比較大的曲面。
- 能夠處理大數據量,算法時間和空間複雜度不會太高。
- 重建出的網格中包含儘可能少的異常三角片,比如三角片交錯在一起、表面法向量不連續或不一致、同一個位置附近出現多層三角片等。
這些要求也構成了算法的難點。
一般方法
網格生成算法可以分爲離散方法和連續方法兩大類。離散方法利用某些空間劃分方法,直接從點雲數據生成網格。連續方法利用點雲去擬合某類分佈函數,得到表面的函數表示,然後生成網格。總結見下圖。
下面簡單介紹一下兩種重建思想,都是基於連續方法的。
有符號距離函數(signed distance function)
定義SS是待重建的曲面,F:R3−>RF:R3−>R,其中F(x)F(x)定義爲xx到SS中的距離最近的點的距離。如果xx在SS外面,則距離爲正,反之爲負。那麼,
S={x:F(x)=0}S={x:F(x)=0}
典型的方法有VRIP(Volumetric Range Image Processing)。下圖是實際應用中通過VRIP生成的F(x)F(x)的一個切面。
圖中F(x)F(x)的值被灰度取代後,實際上S={x:F(x)=128}S={x:F(x)=128}
指示函數(indicator function)
對於一個給定的物體MM,定義指示函數
χM(x)=1 if x∈M and χM(x)=0 if x∉MχM(x)=1 if x∈M and χM(x)=0 if x∉M
那麼S=∂MS=∂M。
因此把重構SS的問題轉換爲重構χMχM的問題。而利用Stokes公式,可以將點雲及其法向量(χMχM的表面信息)和χMχM聯繫起來。
典型的方法是FFT重建和Poisson重建。下圖是Poisson重建方法的原理圖。
後續會分別介紹一下VRIP和Poisson,以及他們在SLAM中的應用。
轉載請註明作者和出處(http://www.cnblogs.com/luyb),未經允許請勿用於商業用途。 [email protected]/LUYB 聯繫方式:luyanbin7 at gmail.com