无序点云的法线全局定向

在前一篇文章《点云法线计算》已经给出了法线的计算方法,通过该方法计算出来的点云法线为散乱的,与实际表面法线相同或者相反,因此需要对点云法线朝向进行全局方向上的调整。最早关于法线全局定向的方法应该来源于“Surface Reconstruction from Unorganized Points" Hugues Hoppe的文章,其基本思想是通过邻域点集计算的中心点集,构建基于欧氏距离的最小生成树,由于中心点过于稀疏,所以就加上了边构建成图,作者给出的名字叫"Riemannian Graph"即黎曼图,其实可以理解成为“Voronoi Graph",在实际工程化应用中构图的代价是相当昂贵的,而且相当复杂。

换个方式来讲,如果先对无序点云进行Delaunay Triangulation得到三角网格模型,就会得到与作者定义的同目的、同效果的黎曼图,然后根据三角面片的连接关系对点云进行法线定向,Delaunay Triangulation三角化的代价是昂贵的。同样如果已经得到了三角网,点云的全局法线方向就已经知道了,无需要再定向。构图的目的是为了得到点的连接关系,好像定向按图的连接关系传播出去。

其实只要是预先构图或者进行预处理的方法时效时都相当的差,在工程化应用中表现较差。

回到问题上,如果不定义黎曼图,不对点云进行三角化,那有没有其它方法呢?

通常采用的方法是定义种子点方向后通过当前点找其最邻近点,调整邻近点法线朝向,然后传播出去。该方法的缺点在于,对于薄壁数据极易出现错误,而且如果当前点找到的最邻近点的最邻近点是当前点本身时,无法向后传播。

那有没有一种方法既能保证时效性,又能保证准确性呢?用佛家的话来回答"即因即果",问题的答案就在问题本身之中。下面介绍一种无序点云的快速法矢定向方法,简单可行,也极易容易理解。采用K个邻域点的传播方法,避免单点传播造成的问题和构图的复杂性。在整个过程中通过调整邻域点的法线朝向并计算法线夹角,以夹角大小制定优先级序列加入到优先级队列中,通过该方法保证定向的准确性,并保证了算法的时效性。

其基本思路如下:

(1)采用前篇文章“点云法线计算”的方法计算每个点的法矢。

(2)计算种子点,种子点的挑选方法采用““Surface Reconstruction from Unorganized Points" 中的方法,引用原文"To assign orientation to an initial plane, the unit normal of the plane whose center has the largest z coordinte is forced to point toward the +z axis”。

(3)搜索种子点的K个邻域或者半径搜索得到邻域中,对邻域的K个点调整法线朝向,按法线夹角大小加入到优级队列中。

(4)选取优先级队列中的第一个点,重得执行第(3)步,直到所有的点遍历完成。

本算法已经实际运用到项目和产品中,鲁棒性、时效性在实际项目中得到了有效地验证。具体的算法实现可以参考本团队的专利《一种散乱点云快速法矢定向方法》。如有不明,欢迎大家留言!

 

你可能感兴趣的:(点云处理,算法,计算机视觉,slam)