点云法向量是最基本的点云特征,在诸多点云处理算法中起着至关重要的作用。本文记录了两种常用的点云法向量估计方法,分别针对一般点云和深度图两种点云组织形式。
一般点云的法向量估计
估计一般点云法向量的思路是根据邻域内的点拟合一个平面,则平面的法线方向即为点的法向量。记点的邻域为:
需拟合的平面的一般形式是:
\begin{align}
Ax+By+Cz+D &= 0 \notag \newline
A^2 + B^2 + C^2 &= 1 \notag
\end{align}
采用最小二乘法进行平面的拟合,即求解如下的最小值问题:
通过求导并令导数为\(0\),且将方程组中的\(D\)消去,可以得到如下线性方程组:
其中\(M\)是协方差矩阵,\(\bar{x}=\frac{1}{n}\sum_{i=1}^nx_i\), \(\bar{xy}=\frac{1}{n}\sum_(i=1)^nx_iy_i\),依此类推。
这是典型的在单位圆上求解寻找方程组的解。一般情况下,协方差矩阵是非奇异的,因此上述方程没有精确解,只能寻找近似解,令\(n=\left[A,B,C\right]^T\)满足:
利用拉格朗日乘子法,构造新的优化函数:
从而能够推导出上式的解是协方差矩阵\(M\)的最小特征值所对应的归一化特征向量
从而可以得到点云的法向量是:$$\vec{n}=[n_x,n_y,n_z]^T=\pm[A,B,C]^T$$。
深度图的法向量估计
对于结构化的点云——深度图而言,可以更加简便的估计点云的法向量。思路是利用深度梯度来近似估计点云法向量。记深度是\(d\),已知深度图,与图像梯度的计算方式相同(梯度方向定义为函数上升的方向),可以直接求出\(x\)和\(y\)方向上的深度梯度,分别记作\(\nabla{d_x}\)和\(\nabla{d_y}\)。
根据针孔相机模型,可以将图像坐标转化为三维空间坐标:
其中\(f,c_x,c_y\)是相机内参,\(u,v\)是像素坐标,以及将深度梯度转化为\(z\)关于\(x,y\)的梯度:
则点云的法向量可以近似估计为:
法向量方向的统一
前述方法计算得到的法向量方向具有不确定性,有必要进行统一,通常做法是根据视线方向进行统一,确保法向量方向的一致性。一般将原点作为视点位置,则视线为:$$\vec{v}={(-x,-y,-z)}^T$$
对点云的法向量进行调整,使得: