Possion重建是Kazhdan等2006年提出的网格重建方法[1]。Possion重建的输入是点云及其法向量,输出是三维网格。Poisson有公开的源代码[2]。PCL中也有Poisson的实现。
核心思想
Possion重建是一个非常直观的方法。它的核心思想是点云代表了物体表面的位置,其法向量代表了内外的方向。通过隐式地拟合一个由物体派生的指示函数,可以给出一个平滑的物体表面的估计。
给定一个区域M)及其边界partial M),指示函数chi_M)定义为
这样,把重构S = partial M)的问题转换为重构chi_M)的问题。作者给出了将点云及其法向量和chi_M)联系起来的公式。作者论文中的图1非常形象地描述了这二者的联系。
基本思路
对于任意点pin partial M),定义vec{N}_{partial M}p))为向内的表面法向量, ilde{F}q))为一个平滑滤波器, ilde{F}_pq)= ilde{F}q-p))为 ilde{F})沿p)方向的平移。因为chi_M)一般意义上是不好求导的,这里用chi_Mast ilde{F})的导数来近似。
从法向量到梯度空间
梯度空间的近似
由于vec{N}_{partial M})的分布是未知的,需要通过观测值P=leftlbrace left p_i,n_iight) ightbrace)来近似。考虑离散点集Omega),partial M)被分割为互不相交的区域wp_s,sinOmega)。1))可以转化为积分求和,并将每个小积分近似为常函数,用代表点s.p)对应的函数值和wp_s)的面积的乘积代替。
这里希望平滑滤波器 ilde{F})能够尽量地窄,不过分平滑数据,同时尽量地宽,使得积分近似能够更准确。高斯滤波器是一种常见的选择。
求解Possion问题
向量空间vec{V})和指示函数 ilde{chi})满足
[
abla ilde{chi}=vec{V}
ag{3}
]
然而,vec{V})通常意义上是没法积分的(为什么?)。为了得到3))式的最小二乘解,将3))式两边求导,就得到了拉普拉斯方程
[Delta ilde{chi}=
ablacdotvec{V}
ag{4}
]
拉普拉斯方程在数学上有很详细的研究。
实现细节
空间划分
为了解一个偏微分方程问题,首先要将其离散化。最简单的方法是将空间划分为均匀网格。这种划分非常占内存空间,而且只有边界附近的值才是我们关心的,大量的空间被浪费了。作者采用了一种自适应的网格结构octree来划分空间,并且octree上定义了一个函数空间F_o)。下图给出了octree在三维空间对一个物体的划分。物体边缘的网格密度远大于远离物体的网格密度。
http://http.developer.nvidia.com/GPUGems2/elementLinks/37_octree_03.jpg
空间上的基函数选择
如何选择函数空间F_o)实际上挺有学问的。因为F_o)一旦给定,定义在这个octree上的向量空间vec{V})和指示函数chi)都会通过F_o)的线性组合去近似。这样,求解chi)就转化为求解F_o)上的参数组合,进而转化为求解一个线性方程组。
给定octree的深度D),作者根据选择了下面的基函数F)。
*n)代表n)次卷积。当n)趋向于无穷时,F)趋向于高斯函数,它的定义域也越来越大。当n=3)时,定义域为[-1.5,1.5]^3)。
octree上某个节点o)对应的函数F_o)定义为
[F_oq)equiv Fleftfrac{q-o.c}{o.w}ight)frac{1}{o.w)^3}
]
其中o.c)是的o)中心,o.w)是o)的宽度。假设根节点(第0层)的宽度为W),那么第d)层节点的宽度为frac{W}{2^{d}})。这个函数空间和小波空间很像。
Possion求解
Possion求解方法是L2投影(L2 projection)[3]。定义octree的节点集合为O)。向量空间vec{V})可以近似为
[vec{V}q)equiv Sigma_{sin Omega}Sigma_{oin Ngs)}alpha_{o,s}F_oq)s.vec{n}
]
其中Ngs))是s)的八个最近邻的叶节点,alpha_{o,s})是三线性插值的权重。
虽然vec{V})和 ilde{chi})都可以在函数空间上表示出来,Delta ilde{chi})和
ablacdotvec{V})却未必有定义。因此将4))近似为最小化其在F_o)上的投影
[Sigma_{o} lVertlangle Delta ilde{chi}-
ablacdotvec{V},F_oanglelVert^2=Sigma_{o} lVertlangle Delta ilde{chi},F_oangle-langle
ablacdotvec{V},F_oanglelVert^2
]
令 ilde{chi}=Sigma_ox_oF_o),那么求解 ilde{chi})即是求解x_o)。
[langle Delta ilde{chi},F_{o’}angle=Sigma_{o}x_{o}langle Delta F_o,F_{o’}angle
]
[Sigma_{o} lVertlangle Delta ilde{chi},F_oangle-langle
ablacdotvec{V},F_oanglelVert^2
=Sigma_{o’}lVertSigma_ox_olangle Delta F_o,F_{o’}angle-langle
ablacdotvec{V},F_{o’}anglelVert^2
]
上式右边对x=lbrace x_obrace)求偏导,转化为
[min limits_{x}leftlVert Lx-v ightlVert ^2
]
其中,设octree的节点数为N),N imes N)矩阵L)在o,o’))位置上的值为
[L_{o,o’}equiv langlefrac{partial^2 F_o}{partial x^2},F_{o’}angle+langlefrac{partial^2 F_o}{partial y^2},F_{o’}angle+langlefrac{partial^2 F_o}{partial z^2},F_{o’}angle
]
表面提取
用Marching Cubes类似的方法。注意iso的值取自S)个划分的平均。
作者还讨论了非均匀采样下的算法,在此就不赘述。
Poisson分析
简单列几点
Poisson在边缘处的锐度比VRIP要好。这是因为VRIP在大的边缘处TSDF的累加会有平滑效应,而Poisson依据的是法向量,不会引入额外的平滑。
VRIP是局部方法,每次只更新当前深度图对应的TSDF。Poisson是全局方法。
从个人使用经验上看,Poisson对于噪声更加鲁棒一些。点云法向量估计的精度不能太差。
如果重建出奇怪的形状(分层、分块),请查看原始点云是否平滑,是否有噪声,调整生成网格的分辨率以适应点云。
小结
Poisson是个好方法。
参考文献
[1]. Kazhdan, Michael, Matthew Bolitho, and Hugues Hoppe. "Poisson surface reconstruction." Proceedings of the fourth Eurographics symposium on Geometry processing. Vol. 7. 2006.
[2]. http://www.cs.jhu.edu/~misha/Code/PoissonRecon/Version8.0/
[3]. http://www.featflow.de/en/software/featflow2/tutorial/tutorial_l2proj.html