在計算機圖形學中,網格是一種非常基本的表示方法。隨着近些年三維表面重建和Dense SLAM的興起,從海量的三維點雲數據生成單一的網格的方法得到了大量的應用。特別是在AR中,因為交互的需要,網格生成算法經常是一個必選項。 由於工作中正好涉及到一些這方面的應用,因此想簡單介紹一下這方面的知識。以下僅討論三維情形。 本文很多內容來源於Matthew Bolitho的博士論文1。這位仁兄現在在NVidia做Director of Architecture。
算法的輸入輸出
網格生成算法的輸入一般為三維點雲,輸出為三維網格。輸入的點雲一般為若干個點雲的集合。輸出的網格一般為單一的網格。
輸入的點雲一般有如下幾種形式: - 只包含三維坐標的點雲 \(P=\{p_1,...,p_N\}\) - 包含三維坐標和法向量的點雲 \(P=\{(p_1,n_1),...,(p_n,n_N)\}\) - 深度圖 2D 網格$R\in\mathbf^{N\times M}$,實際上包含了三維坐標,表面法向量和鄰域信息。
輸入的點雲一般面臨着下面幾個問題,如下圖所示:
- 點雲噪聲
每個點雲都會帶有噪聲,噪聲有可能和物體表面光學性質、物體深度、傳感器性能等都有關系。
- 點雲匹配誤差
三維重建中需要將不同幀得到的點雲估計其在世界坐標系下的位姿,會引入一定的位置誤差。
- 點雲分布
分布的不均勻性體現在(1)每個小點雲在不同的方向上分布是不均勻的(雖然傳感器上看是均勻的)如上圖3位置,(2)不同的點雲匹配在一起時,不同位置的點雲密度是不一樣的,如上圖2位置。
- 缺失數據
掃描中如果碰到不易成像的部位(比如不可見、反光等等),那么這部分的數據是缺失的,即點雲是不完整的。如上圖1位置所示。
對算法的要求
一般而言,我們對於輸出的網格有一定的要求。除了網格密度和精度以外,我們還希望算法
- 對點雲噪聲有一定的冗余度。
- 能夠重建出曲率變化比較大的曲面。
- 能夠處理大數據量,算法時間和空間復雜度不會太高。
- 重建出的網格中包含盡可能少的異常三角片,比如三角片交錯在一起、表面法向量不連續或不一致、同一個位置附近出現多層三角片等。
這些要求也構成了算法的難點。
一般方法
網格生成算法可以分為離散方法和連續方法兩大類。離散方法利用某些空間划分方法,直接從點雲數據生成網格。連續方法利用點雲去擬合某類分布函數,得到表面的函數表示,然后生成網格。總結見下圖。
下面簡單介紹一下兩種重建思想,都是基於連續方法的。
有符號距離函數(signed distance function)
定義$S$是待重建的曲面,\(F:\mathbf{R}^3->\mathbf{R}\),其中$F(x)$定義為$x$到$S$中的距離最近的點的距離。如果$x$在$S$外面,則距離為正,反之為負。那么, \(S=\{x:F(x)=0\}\) 典型的方法有VRIP(Volumetric Range Image Processing)。下圖是實際應用中通過VRIP生成的$F(x)$的一個切面。 圖中$F(x)$的值被灰度取代后,實際上$S={x:F(x)=128}$
指示函數(indicator function)
對於一個給定的物體$M$,定義指示函數 \(\chi_M(x)=1 \text{ if } x\in M \text{ and } \chi_M(x)=0 \text{ if }x\notin M\) 那么$S=\partial M$。 因此把重構$S$的問題轉換為重構$\chi_M$的問題。而利用Stokes公式,可以將點雲及其法向量($\chi_M$的表面信息)和$\chi_M$聯系起來。 典型的方法是FFT重建和Poisson重建。下圖是Poisson重建方法的原理圖。
后續會分別介紹一下VRIP和Poisson,以及他們在SLAM中的應用。