点云法线估计原理
一、理论基础
1、为什么要求点云的法线
表面法线是几何体表面的重要属性,在很多领域都有大量应用,例如:在进行光照渲染时产生符合可视习惯的效果时需要表面法线信息才能正常进行,对于一个已知的几何体表面,根据垂直于点表面的矢量,因此推断表面某一点的法线方向通常比较简单。然而,由于我们获取的点云数据集在真实物体的表面表现为一组定点样本,这样就会有两种解决方法:
1)使用曲面重建技术,从获取的点云数据集中得到采样点对应的曲面,然后从曲面模型中计算表面法线;
2)直接从点云数据集中近似推断表面法线。
总的来说,就是点云的法线可以便是点云的特征,如果法向量连续,可以判断是平面,法向量突变,是角点。
本节将针对后一种情况进行讲解,已知一个点云数据集,在其中的每个点处直接近似计算表面法线。
2、如何估计法向量
对于物体表面一点,将它和领域的点云看成是空间的椭球体,法向量方向对应椭球体的最短轴方向。
思路:要求一个点的法线,对这个点的k近邻拟合平面,求这个平面的法线。将问题转换成一个最小二乘平面拟合问题。
1)平面方程
常规的平面方程如下,这个方程是过原点的
对于k个点,我们先求得这些点的重心,确保这个平面是过重心的,这个过程就是将数据去中心化:
2)最小二乘拟合,计算协方差矩阵
理想情况下所有点都通过这个平面,但实际是不可能的,因此利用最小二乘算法,使得误差最小。
3)对协方差矩阵A进行SVD分解,最小的特征向量即为法向量(理解:椭圆的最短轴方向)
另一种理解:A有三个特征值,对应三个特征向量,求得AX=0的解等价于求的最小的特征值minλ²,
故X表示最小特征值对应的特征向量。X即为上述的[a, b, c]T,即为法线。
第三种理解:平面上做特征值分解,其特征向量,大的表示主方向,稍微小的是另一个方向,第三个就是法线方向。
二、程序实现
#include <pcl/io/io.h>
#