10.3. 点云的模型拟合#

模型拟合是点云的另一个重要课题。具体来说,这指的是从给定的点云中提取出平面或球体、圆柱体等几何基元的过程。它在低层次的三维数据(无序的点集)和高层次的三维形状的结构信息之间,架起了一座桥梁,为许多下游的应用提供基础。 例如,如何从 图 10.10 所示的点云中提取出墙面或地面的位置,就是几何拟合所需要解决的问题。

../../_images/zhibeiziyuan.png

图 10.10 北京大学治贝子园处重建得到的三维点云。#

几乎所有的几何形状都可以用一个确定的方程来描述它。

  1. 对于实体:\(F(x,y,z)\ge0\,.\)

  2. 对于表面:\(F(x,y,z)=0\,.\)

因此,我们可以形式化地定义几何拟合问题(以表面为例): 对于给定的点云 \(P=\{(x_i,y_i,z_i)|i=1,2,\dots,N\}\) 和给定的形状 \(F\),找到一组 \(P\) 的子集 \(P'\subset P\),使得 \(\forall(x,y,z)\in P',F(x,y,z)=0\)

由于实际上不可能做到完美的拟合,因此我们往往定义一个误差函数,然后求解一组点云的子集,使得误差最小化。

10.3.1. 平面的拟合#

首先我们考虑一个最简单的例子,以平面的拟合为例,输入的点云也基本在同一个平面上,即不存在任何噪点、错误点和无关点。给出三维空间中平面的方程:

(10.10)#\[ Ax+By+Cz+D=0\,. \]

我们需要求解 \(A,B,C,D\)

对于点云中的某个点 \((x_i,y_i,z_i)\),我们定义误差:

(10.11)#\[ L_i=(Ax_i+By_i+Cz_i+D)^2\,, \]

则总误差:

(10.12)#\[ L=\sum^N_{i=1}L_i=\sum^N_{i=1}(Ax_i+By_i+Cz_i+D)^2\,. \]

写成矩阵的形式:

(10.13)#\[\begin{split} P=\left[\begin{matrix}x_1&y_1&z_1&1\\\vdots&\vdots&\vdots&\vdots\\x_N&y_N&z_N&1\end{matrix}\right],\, M=\left[\begin{matrix}A\\B\\C\\D\end{matrix}\right],\, L=\Vert PM \Vert_2\,. \end{split}\]

使用奇异值分解(SVD)解最小二乘拟合问题:

(10.14)#\[ P=U\Sigma V^T\,. \]

分解得到的矩阵 \(V\) 最后一列即为所求的 \(M\),它将使误差 \(L\) 最小化。

实际中遇到的问题远比我们刚才遇到的更加复杂。就像治贝子园的例子那样,给定的点集中可能不全是待求平面上的点,而有很大一部分其他点集(例如建筑的房檐、墙檐,门前的孔子像等等)。 这就使得刚才使用的最小二乘拟合失效了,因为最小二乘拟合对于误差越大的数据越敏感;当完全不在墙面上的点参与到平面参数的估计中时,最小二乘得到的结果也会被极大地影响。

那么,是否有方法能够减少房檐、墙檐等无关点的干扰,从而较为准确地进行拟合呢?事实上,的确有一类方法能够很好地利用采样一致性(sample consensus)来完成对无关数据的过滤。下面我们将介绍其中最为经典的一种算法:随机抽样一致性算法。

10.3.2. 随机抽样一致性算法#

随机抽样一致性算法(RANSAC)基于这样的一个思想:

对于 图 10.10 所示的点云,显然有相当一部分点都落在墙面上。如果这个比例至少为 \(p\),那么在点云中随机挑选三个点所确定的平面,其正好是墙面所在平面的概率为 \(p^3\);并且,如果这三个点恰好都落在墙面上,那么点云中剩下的点至少有 \(1-p\) 的比例也同样落在这三个点所确定的平面上。

利用这种一致性,我们便可以实现对干扰点的排除。具体来说,我们每次随机地挑选点云中的三个点,然后按照 §10.3.1 所介绍的方法估算平面的位置,并且评估点云中其他的点有多少比例同样落在该平面上,记这个比例为 \(q\) 。随后,重复这一步骤若干次,取其中 \(q\) 最大的尝试所对应的平面,即为算法的结果。不难证明,如果点云中至少有 \(p\) 比例的点落在目标平面上,那么经过 \(N\) 次随机采样后,最终确定的平面就是目标平面的概率为

(10.15)#\[ 1-(1-p^3)^N \,. \]

例如,当 \(p=30\%,N=200\) 时,算法得到准确估计的概率为 \(99.6\%\),由此可以看出,即使存在大量(\(70\%\))的无关点,也仍然能够利用随机抽样的方式来对点云进行几何拟合。

下面我们系统地描述随机抽样一致性算法的流程:

  1. 随机选择一个用于估算的最小子集(对于估计平面来说,该子集包含 3 个点);

  2. 用这个子集估算待求的参数;

  3. 用估算的参数测试整个数据集,将误差在一定范围内的数据点作为“内点”(inliers);

  4. 如果内点的数量超过一定比例,就以全部内点为输入,使用最小二乘法重新估计一组更精确的待求参数;

  5. 重复 1-4 步若干次,最后将“用最多内点估计出的参数”作为最终结果。

随机抽样一致性算法具有鲁棒性好、效率高的特点(不难看出它可以并行化执行),因此长久以来是可视计算领域广泛应用的拟合手段。