曲面法线是几何表面的重要属性,并且在诸如计算机图形应用的许多领域中被大量使用,应用在矫正光源产生的阴影和其他的视觉效果。
给定几何表面,通常用垂直于曲面的向量来推断曲面上某一点法线的方向是很简单的。然而,由于我们获取的点云数据集代表真实表面上的一组点样本,因此有两种方法:
利用曲面网格划分技术,从获取的点云数据集中获取潜在面,然后从网格中计算曲面法线
使用近似法直接从点云数据集中推断曲面法线
本教程将针对后者,即给定点云数据集,直接计算点云中每个点的曲面法线
理论入门
尽管存在许多不同的常规估计方法,但我们将在本教程中重点介绍的方法是最简单的方法之一,其公式如下。确定曲面上某一点法线的问题近似于估计与曲面相切的平面法线的问题,进而成为一个最小二乘平面拟合估计问题。
因此,估计表面法线的解决方案被简化为对由查询点的最近邻创建的协方差矩阵的特征向量和特征值(或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倍的计算速度。
扫描二维码
关注我们
让我们一起分享一起学习吧!期待有想法,乐于分享的小伙伴加入免费星球注入爱分享的新鲜活力。分享的主题包含但不限于三维视觉,点云,高精地图,自动驾驶,以及机器人等相关的领域。
分享及合作:微信“920177957”(需要按要求备注) 联系邮箱:[email protected],欢迎企业来联系公众号展开合作。
点一下“在看”你会更好看耶
本文是西门子开放式TCP通信的第2篇,上一篇我们讲了使用西门子1200PLC作为TCP服务器的程序编写,可以点击下方链接阅读:【公众号dotNet工控上位机:thinger_swj】基于Socket访问西门子PLC系列教程(一)在完成上述步骤后,接下来就是编写上位机软件与PLC之间进行通信。上位机UI界面设计如下图所示:从上图可以看出...
我有一个大型数据集,列出了在全国不同地区销售的竞争对手产品。我希望通过使用这些新数据帧名称中的列值的迭代过程,根据区域将该数据帧分成几个其他区域,以便我可以分别处理每个数据帧-例如根据价格对每个地区的信息进行排序,以了解每个地区的市场情况。我给出了以下数据的简化版本:Competitor Region ProductA Product...
作为一名IT从业者,我来回答一下这个问题。首先,对于具有Java编程基础的人来说,学习Python的初期并不会遇到太大的障碍,但是要结合自己的发展规划来制定学习规划,尤其要重视学习方向的选择。Java与Python都是比较典型的全场景编程语言,相比于Java语言来说,当前Python语言在大数据、人工智能领域的应用更为广泛一些,而且大...
这段时间通过学习相关的知识,最大的变化就是看待事物更加喜欢去了解事物后面的本质,碰到问题后解决问题思路也发生了改变。举个具体的例子,我在学习数据分析,将来会考虑从事这方面的工作,需要掌握的相关专业知识这个问题暂且按下不表,那哪些具体的问题是我需要了解的呢,以下简单罗列:1、了解数据分析师这个岗位在各个地区的需求情况?2、数据分析师的薪...
这一节将开始学习python的一个核心数据分析支持库---pandas,它是python数据分析实践与实战的必备高级工具。对于使用 Python 进行数据分析来说,pandas 几乎是无人不知,无人不晓的。今天,我们就来认识认识数据分析界鼎鼎大名的 pandas。目录一. pandas主要数据结构 SeriesDataFrame二...