摘要:点云特征描述与提取入门级实例解析中描述三维特征相关基础本小节介绍点云库中的三维特征描述子工作原理,以及在模块中类的通用调用习惯。
本章首先对涉及的部分点云特征描述与提取的概念进行简介,由于特征描述子和提取算法的多样性,和实例相关的概念在后面结合实例也进行了详细介绍;其次对PCL的特征描述与提取相关模块及类进行简单介绍;最后通过应用实例来展示如何对PCL中特征描述与提取相关模块进行灵活运用,例如法线估计、各种点特征描述子的提取方法等。
利用描述子建立曲面间的对应点在3D物体识别领域有广泛应用。采用一个向量描述曲面上指定点及其邻域的形状特征,通过匹配向量的值来建立不同曲面间点的对应关系,此向量即为指定点的描述子。3D形状内容描述子构造简单,辨别力强,且对噪声不敏感。其构造方法为:在以指定点p为中心的球形支撑域内,沿径向、方向角和俯仰角3个坐标方向划分成网格,统计落入网格内的点数,构造向量V。V的每个元素与支撑域内的一个网格对应,元素的值为对应网格中的点数,向量V即为点p的描述子。3D shape context
网格划分如下图所示。详细内容请参考[Andrea Frome, Daniel Huber, Ravi Kolluri and Thomas Bulow, Jitendra Malik: Recognizing Objects in Range Data Using Regional Point Descriptors, In proceedings of the 8th European Conference on Computer Vision (ECCV), Prague, May 11-14, 2004]
。
旋转图像最早是Johnson提出的特征描述子,主要用于3D场景中的曲面匹配和模型识别。如下面第一幅图所示,在模型表面上,存在顶点 p p p 和其法向量 n n n 定义的二维基,以及切平面 P P P,假设模型上任意顶点 x x x ,现定义 α /alpha α 为 x x x 在平面 P P P 上投影点与 p p p点的距离,规定其值取大于零的实数, β /beta β 为 x x x 与其在平面 P P P 上投影点之间的距离,按照向上或向下规定其有正负之分,点 p p p 的旋转图像则为,将除 p p p 点外其他模型上的顶点在 P P P 上的投影( α i /alpha _{i} αi, β i /beta _{i} βi),其中 i i i 表示顶点的一维索引,将( α i /alpha _{i} αi, β i /beta _{i} βi)统计得到二维直方图即为点 p p p 的旋转图像,图像的坐标由 α /alpha α 和 β /beta β 而定,强度为( α /alpha α, β /beta β)落在同一统计区间的点的统计个数。下面第二幅图所示模型表面三个点的旋转图像可帮助大家理解。
PCL中pcl_features
库提供了特征描述与提取相关的基本数据结构与算法,目前PCL内部的特征提取算法包含基础和最新的点云或曲面模型相关的描述子实现,包括法线估计、多种基于近邻的局部描述算子、基于视角的全局描述算子等等,其依于common
、search
、kdtree
、octree
、range_image
模块。类和函数的接口说明受篇幅所限,请感兴趣的读者自行查阅相关资料,或者查看官网。
本小节介绍点云库(PCL)中的三维特征描述子工作原理,以及在pcl::feature
模块中类的通用调用习惯。
在原始表示形式下,点的定义是用笛卡尔坐标系坐标 x x x, y y y, z z z 相对于一个给定的原点来简单表示的三维映射系统的概念,假定坐标系的原点不随着时间而改变,这里有两个点 p 1 p_{1} p1 和 p 2 p_{2} p2 ,分别在时间 t 1 t_{1} t1 和 t 2 t_{2} t2 捕获,有着相同的坐标。对这两个点做比较其实是属于不适定问题(ill-posed problem),因为虽然相对于一些距离测度(如:欧几里得度量)它们是相等的,但是它们取样于完全不同的表面,因此当把它们和邻近的其他环境中的点放在一起时,它们表达着完全不同的信息,这是因为在 t 1 t_{1} t1 和 t 2 t_{2} t2 之间局部环境有可能发生改变。一些获取设备也许能够提供取样点的额外数据,例如强度或表面反射率等,甚至颜色,然而那并不能完全解决问题,单从两个点之间来对比仍然是不适定问题。由于各种不同需求需要进行对比以便能够区分曲面空间的分布情况,应用软件要求更好的特征度量方式,因此作为一个单一实体的三维点概念和笛卡尔坐标系被淘汰了,出现了一个新的概念取而代之:局部描述子(local descriptor
)。文献中对这一概念的描述有许多不同的命名,如:形状描述子(shape descriptor
)或几何特征(geometric features
),本文中剩余部分都统称之为点特征表示(point feature representations
)。通过包括周围的邻域,特征描述子能够表征采样表面的几何性质,它有助于解决不适定的对比问题。如下图所示,理想情况下,相同或相似表面上的点的特征值将非常形似(相对特定度量准则),而不同表面上的点的特征描述子将有明显差异。下面几个条件,通过能否获得相同的局部表面特征值,可以判定点特征表示方式的优劣。
∙ /bullet ∙ 刚体变换(rigid transformations
)—— 即三维旋转和三维平移变化不会影响特征向量F估计,即特征向量具有平移旋转不变性。
∙ /bullet ∙ 改变采样密度(varying sampling density
)—— 原则上,一个局部表面小块的采样密度无论是大还是小,都应该有相同的特征向量值,即特征向量具有抗密度干扰性。
∙ /bullet ∙ 噪音(noise
)—— 数据中有轻微噪音的情况下,点特征表示在它的特征向量中必须保持相同或者投其相似的值,即特征向量对点云噪声具有鲁棒性。
通常,PCL中特征向量利用快速kd tree
查询,使用近似法来计算查询点的最近邻元素,有两种常用的查询类型。
(1)决定一个查询点的k
邻域元素(k
为用户已给参数)(也称为k-搜索)
(2)在半径r
的围内,确定一个查询点的所有邻元素(也称为半径-搜索)
因为所有点云库中的类都继承来自基类pcl::PCLBase
,pcl::Feature
类接受以下两种不同方式的输入数据。
(1)一个完整的点云数据集,由setInputCloud (PointCloudConstPtr &)
给出——此函数必须设置,这样后续特征算子才能正常计算,任何可以进行特征描述子估计的类,为给定的输入点云中的每个点估计一个特征向量。
(2)点云数据集的一个子集,由setInputCloud (PointCloudConstPtr &)
和setIndices (IndicesConstPtr &)
给出——后面的setIndices
函数为可选设置。如果传入IndicesConstPtr
参数,则任何可以进行特征估计的类将为给定输入点云中的索引对应的点估计一个特征,默认情况下,如果没有给出一组索引,点云中的所有点参与计算。
此外,通过一个附加调用程序,可以明确指定搜索时使用的点邻域集合setSearchSurface (PointCloudConstPtr &)
,这个调用是可选的,当搜索点邻域集合未给出时,则输入点云数据为默认的搜索空间。因为总是需要 setInputCloud ()
,所以我们可以使用
来创建四个组合。假如我们有两个点云, P = { p 1 , p 2 , . . . , p n } P = /left /{ p_{1}, p_{2},..., p_{n}/right /} P={p1,p2,...,pn}和 Q = { q 1 , q 2 , . . . , q n } Q = /left /{ q_{1}, q_{2},..., q_{n}/right /} Q={q1,q2,...,qn},如下图所示,则表示了所以四种情况:从左到右边依次为,未指定索引和搜索点云集合、只指定了索引、只指定了搜索点云集合、指定了索引和搜索点云集合。
∙ /bullet ∙ setIndices() = false, setSearchSurface() = false —— 毫无疑问这是点云库中最常用的情况,用户只需要输入一个单一的点云数据集,并且为点云中的所有点估计一特征向量。不论一组索引和(或)搜索点云是否给定,都不希望保存不同的实现副本,无论何时,即使indices = false
,PCL都会创建一组内部索引(为 std::vector
),这个索引集是指向整个数据集的(indices=1..N
,N
是点云中点的数目)。上述与图中最左边的情况对应,首先,我们估计了 p 1 p_{1} p1的最近邻元素,然后是 p 2 p_{2} p2的最近邻元素,以此类推,直到我们估计完 P P P中的所有点。
∙ /bullet ∙ setIndices() = true, setSearchSurface() = false —— 如前面所提到的,特征估计方法只计算已给索引的点的特征。对应上图的第二种情况,这里,我们假设 p 2 p_{2} p2的索引不在已给的索引向量中,因此在 p 2 p_{2} p2点处,没有估计邻元素或者特征向量。
∙ /bullet ∙ setIndices() = false, setSearchSurface() = true —— 如第一种情况,对所有已给点进行特征向量估计,但是,在setSearchSurface()
中给出的采样面点云将用来为输入点获取最近邻元素,而不是输入点云本身,上述对应图中第三种情况。如果 Q = { q 1 , q 2 } Q = /left /{ q_{1}, q_{2}/right /} Q={q1,q2}作为输入,是不同于 P P P的另一个给出的点云, P P P是 Q Q Q的搜索表面,那么将从 P P P中计算两个点 q 1 q_{1} q1和 q 2 q_{2} q2的近邻。
∙ /bullet ∙ setIndices() = true, setSearchSurface() = true —— 这种组合可能是最少见的情况,索引和搜索点云都给定。这种情况下,将使用setSearchSurface()
中给出的搜索点云,只对中的子集进行特征向量估计。上述对应图中最后(最右端)一种情况,这里,我们假设 q 2 q_{2} q2的索引没有在 Q Q Q的已给索引向量中,因此在 q 2 q_{2} q2点处,没有估计其邻元素或者特征。
在使用 setSearchSurface()
时,最有用的案例是:当有一个非常密集的输入点云数据集时,我们不想对它里面的所有点都进行特征估计,而是希望在找到的一些关键点处(使用pcl_keypoints
中的方法进行估计),或者在点云的下采样版本中(如:使用pcl::VoxelGrid
过滤而获得的)进行特征估计。这种情况下,我们通过setInputCloud()
来把下采样后的点云/ 关键点传递给特征估计算法,而把原始数据通过setSearchSurface()
设置为搜索集合,从而提高程序的运行效率。
表面法线是几何体表面的重要属性,在很多领域都有大量应用,例如:在进行光照渲染时产生符合可视习惯的效果时需要表面法线信息才能正常进行,对于一个已知的几何体表面,根据垂直于点表面的矢量,因此推断表面某一点的法线方向通常比较简单。然而,由于我们获取的点云数据集在真实物体的表面表现为一组定点样本,这样就会有两种解决方法。
(1)使用曲面重建技术,从获取的点云数据集中得到采样点对应的曲面,然后从曲面模型中计算表面法线。
(2)直接从点云数据集中近似推断表面法线。
本小节将针对后一种情况进行讲解,已知一个点云数据集,在其中的每个点处直接近似计算表面法线。
尽管有许多不同的法线估计方法,本教程中着重讲解的是其中最简单的一个,表述如下:确定表面一点法线的问题近似于估计表面的一个相切面法线的问题,因此转换过来以后就变成一个最小二乘法平面拟合估计问题。
注意:更多信息,包含最小二乘法问题的数学方程式,可以查看相关文章 。
因此估计表面法线的解决方案就变成了分析一个协方差矩阵的特征矢量和特征值(或者PCA——主成分分析),这个协方差矩阵从查询点的近邻元素中创建。更具体地说,对于每一个点 P i P_{i} Pi,对应的协方差矩阵 C C C如下: 文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。 转载请注明本文地址:https://www.ucloud.cn/yun/122408.html
C = 1 K ∑ i = 1 K ( P i − P ˉ ) ( P i − P ˉ ) T , C ⋅ V ⃗ j = λ j ⋅ V ⃗ j , j ϵ { 0 , 1 , 2 } C = /frac{1}{K}/sum_{i=1}^{K}/left ( P_{i} - /bar{P}/right )/left ( P_{i} - /bar{P} /right )^{T},C/cdot /vec{V}_{j}=/lambda _{j}/cdot /vec{V}_{j}, j/epsilon /left /{ 0,1,2 /right /} C=K1i=1∑K(Pi−Pˉ
摘要:最后,为了使规划模块获得更平滑的姿态,提高定位系统的鲁棒性,采用了带有滑动窗口的姿态图,优化窗口中包含跟踪良好的帧数据,如果滑动窗口的大小超过阈值,历史记录中的一帧将根据车辆状态从滑动窗口中剔除。 点云PCL免费知识星球,点云论文速读。 文章:Coarse-to-fine Semanti...
摘要:点云的概念点云是在同一空间参考系下表达目标空间分布和目标表面特性的海量点集合,在获取物体表面每个采样点的空间坐标后,得到的是点的集合,称之为点云。 1. 点云环境 1.1点云 点云与三维图像的关系:三维图像是一种特殊的信息表达形式,其特征是表达的空间中三个维度的数据,表现形式包括:...
摘要:所以,很多时候,都先对原始点云进行简化,对简化后的数据做配准计算,在将所获得的配准参数应用到原始点云,以提高计算效率。要可视化对应关系,首先需要计算对应关系本文配准为例效果粗配 什么是fpfh特征 有关快速点云直方图(fpfh)特征的数学描述,在这里不做过多介绍,可以查看fpfh。也可以查看PCL的官网解释,中文版可直接搜索pcl中国fpfh。 主程序 首先还是一堆头文件(当然好多头文...
摘要:既然选择了,那末接下来便是理所当然的事情获取源码包。建议此源码安装不针对任何系统,,等都适用。若打算源码安装,在安装之前最好先更新一下系统,这样基本能保证所安装的包为最新包。 不得不知的PCL 所谓PCL(Point Cloud Library)其实就是一个开源的c++代码库,它实现了大量点云相关的通用算法和高效的数据管理结构,不仅涉及逆向工程领域,其还在模式识别,机器人视觉,计算机图...
阅读 3205·2021-11-23 09:51
阅读 2326·2021-11-11 16:55
阅读 3084·2021-10-13 09:40
阅读 2924·2021-10-12 10:11
阅读 1075·2021-09-22 15:25
阅读 1666·2019-08-29 16:26
阅读 638·2019-08-29 13:21
阅读 2216·2019-08-23 16:19