曲面法线是几何表面的重要属性,并且在诸如计算机图形应用的许多领域中被大量使用,应用在矫正光源产生的阴影和其他的视觉效果。 给定几何表面,通常用垂直于曲面的向量来推断曲面上某一点法线的方向是很简单的。然而,由于我们获取的点云数据集代表真实表面上的一组点样本,因此有两种方法: 利用曲面网格划分技术,从获取的点云数据集中获取潜在面,然后从网格中计算曲面法线 使用近似法直接从点云数据集中推断曲面法线 本教程将针对后者,即给定点云数据集,直接计算点云中每个点的曲面法线
理论入门
尽管存在许多不同的常规估计方法,但我们将在本教程中重点介绍的方法是最简单的方法之一,其公式如下。确定曲面上某一点法线的问题近似于估计与曲面相切的平面法线的问题,进而成为一个最小二乘平面拟合估计问题。 因此,估计表面法线的解决方案被简化为对由查询点的最近邻创建的协方差矩阵的特征向量和特征值(或PCA主成分分析)进行分析。具体地说,对于每个点Pi,我们如下构成协方差矩阵:
其中k是点邻域点的数量,表示最近邻的三维质心,是协方差矩阵的第j个特征值,表示第j个特征向量。
使用PCL从一组点中估计协方差矩阵,代码示例:
通常,由于没有表示法向量符号的数学方式,因此通过主成分分析(PCA)计算出的法线方向是模糊的,并且在整个点云数据集上的方向并不一致。下图显示了在较大数据集厨房一部分环境中的两部分上的效果。图的右侧是扩展高斯图像(Extended Gaussian Image, EGI),又称法向球,用来描述点云法线方向的基准。由于数据集是2.5D的,而且是从单一的角度获取的,因此在EGI中法线只会在球体的一半上出现。然而,由于方向不一致,它们分布在整个球面上。
如果已知,那么可以很容易的解决这个问题。为了使所有法线始终朝向视点,它们需要满足这个等式
下图显示的结果是,来自上图的数据集中的所有法线都一致指向视点之后的结果。
适当比例的选择
如前所述,估计点处的表面法线需要周围点的信息 (也称为k邻域)。
最近邻问题的特性面临适当尺度因子的问题。对于给定的点云数据集,需要选择合适的最近的k个点数量(pcl::Feature::setKSearch),或者适当的邻域半径r(pcl::Feature::setRadiusSearch)。
如果用户没有确定相应阈值,在点特征表示的自动估计中会构成一个限制因素。为了更好地说明这个问题,下图展示了选择较小尺度(小r或k)与大尺度(大r或k)。图左半部分展示了一个合理的精心选择的比例因子,两个平面的估计表面法线近似垂直,整个图中小的边缘全部显示出。如果缩放系数太大(图右半部分),即从相邻范围覆盖更大的点集,估计特征点表达失真,得到两个平面边缘上的旋转曲面法线,和模糊的边缘与细节。
目前必须根据应用程序所需的详细程度来选择确定点邻域的范围。简单地说,如果杯子把手和圆柱形部分之间的边缘曲率很重要,那么比例因子需要足够小才能捕捉到这些细节,否则就需要足够大。
使用OpenMP加速法线估计
对于速度敏感的用户,PCL提供了一个额外的表面法线估计实现,它使用使用OpenMP的多核/多线程范例来加速计算。类名为:pcl::NormalEstimationOMP ,与pcl::NormalEstimation类完全兼容。在8内核的系统上,可以获得6-8倍的计算速度。