点云PCL学习教程(3)

5星(超过95%的资源)
所需积分/C币:22 2017-05-11 16:13:01 45MB PDF
121
收藏 收藏
举报

关于点云PCL的学习教程 有兴趣者 或者分享交流,可以查看我的博客或者关注我的微信公众号“点云PCL”交流分享
第12章点云特征描述与提取 plane_parameters, curvature为估计曲率。 template<typename Pointt> voidpcl:: computePoint Normal (const pcl:: PointCloud< Pointt >&cloud, FE Eigen:: Vector4f8plane parameters, float &curvature) 计算给定点集 cloud,对应的最小二乘平面参数与曲率,分别存储在 plane pa 学 rameters、 curvature template< typename PointT >> voidpcl: computePoint Normal const pcl:: Point Cloud PointT >8-cloud 教程 const std: vector< int >&indices, Eigen: Vector4f &plane parameters, float curvature) 功能同上只是利用点云 cloud和点索引向量 indices给定点集。 template<typename PointT, typename Scalar > voidpcl:: flipNormal Towards Viewpoint (const PointT &point, float vp_ x,71 float vp y, float vp z, Eigen:: Matrix< Scalar, 4, 1 >&normal) 通过视点调整法线的方向,使其指向视点 template<typename PointT, typename Scalar voidpcl:: flip Normal Towards Viewpoint ( const Pointt &point, float vp x, float vp y, float vp_ z, Eigen: Matrix< Scalar, 3, 1 >normal) 功能同上,但法线为三元组。 PCL EXPORTS boolpcl:: compute Pair Features (const Eigen: Vector4f &pl const Eigen:: Vector4f &nl, const Eigen:: Vector4f &p2, const Eigen:: Vector4f &n2, float &f1. float &f2 float 83, float & 4) 计算给定两个点之间的4个特征值(三个角特征、一个距离特征)。p1p2为给 定两个点坐标,n1、n2为给定两个点对应的法线,f1~f4存储计算结果。 12.3应用实例解析 12.3.1PCL中描述三维特征相关基础 本小节介绍点云库(PCL)中的三维特征描述子工作原理,以及在pcl: Feature 模块中类的通用调用习惯,本小节是一个不错的开头 1.理论基础 在原始表示形式下,点的定义是用笛卡儿坐标系坐标x,y,z相对于一个给定的 原点来简单表示的三维映射系统的概念,假定坐标系的原点不随着时间而改变,这里 有两个点p1和p2分别在时间t1和t2捕获,有着相同的坐标。对这两个点做比较 其实是属于不适定问题(ill- posed problem),因为虽然相对于一些距离测度(如:欧 第12章点云特征描述与提取 点几里德度量)它们是相等的,但是它们取样于完全不同的表面,因此当把它们和邻近 云的其他环境中的点放在一起时,它们表达着完全不同的信息,这是因为在1和12之 库」间局部环境有可能发生改变。一些获取设备也许能够提供取样点的额外数据,例如 强度或表面反射率等,甚至颜色,然而那并不能完全解决问题,单从两个点之间来对 学比仍然是不适定问题,由于各种不同需求需要进行对比以便能够区分曲面空间的分 习布情况,应用软件要求更好的特征度量方式,因此作为一个单一实体的三维点概念和 教笛卡尔坐标系被淘汰了,出现了一个新的概念取而代之:局部描述子( local descrip 程).文献中对这一概念的描述有许多不同的命名,如:形状描述子( shape descrip tors)或几何特征( geometric features),本文中剩余部分都统称为点特征表示( point feature representations)。通过包括周围的邻域,特征描述子能够表征采样表面的几 何性质,它有助于解决不适定的对比问题。如图12-5所示,理想情况下相同或相似 表面上的点的特征值将非常相似(相对特定度量准则),而不同表面上的点的特征描 272述子将有明显差异。下面几个条件,通过能否获得相同的局部表面特征值可以判定 点特征表示方式的优劣: (1)刚体变换( rigid transformations)—即三维旋转和三维平移变化不会影响 特征向量F估计,即特征向量具有平移旋转不变性。 (2)改变采样密度( varying sampling density)原则上,一个局部表面小块的 采样密度无论是大还是小,都应该有相同的特征向量值,即特征向量具有抗密度干 扰性。 (3)噪声( noise)——数据中有轻微噪声的情况下,点特征表示在它的特征向量 中必须保持相同或者及其相似的值,即特征向量对点云噪声具有稳健性。 通常,PCL中特征向量利用快速kd-tree查询,使用近似法来计算查询点的最 近邻元素,有两种常用的查询类型: (1)决定一个查询点的k邻域元素(k为用户已给参数)(也称为k-搜索) (2)在半径r的范围内,确定一个查询点的所有邻元素(也称为半径一搜索)。注 意:关于k或r应该如何取值的讨论,请见[ RusuDissertation]。 2.输入点云调用习惯 因为几乎所有点云库中的类都继承于基类pcl:: PClBase,pc: Feature类接受 以下两种不同方式的输入数据: (1)一个完整的点云数据集,由 setInput Cloud( Point cloudconstPtr8)给 出——此函数必需设置后续特征算子才能正常计算,任何可以进行特征描述子估计 的类,为给定的输入点云中的每个点估计一个特征向量。 (2)点云数据集的一个子集由 setInput Cloud( PointCloud ConstPtr&)和 setIn dices( Indicesconst Ptr&)给出一后面 setIndices函数为可选设置。如果传入Indi- cesConstPtr参数,则任何可以进行特征估计的类将为给定输入点云中的索引对应的 点估计一个特征,默认情况下如果没有给出一组索引,点云中的所有点参与计算。 第12章点云特征描述与提取 Q1 产峰 Q3 P3 点云库学习教程 轴Fhr? so SmOgs PiEn“P请Heg E 喝题 273 图12-5点特征描述子示意图 此外,通过一个附加调用程序可以明确指定搜索时使用的点邻域集合set SearchSurface( Point cloud constptr&.),这个调用是可选的,当搜索点邻域集合未 给出时则输入点云数据集为默认的搜索空间。因为总是需要 setInputCloud(),所 以我们可以使用< setInput Cloud(), setIndices(), set searchSurface()>来创建4 个组合。假如我们有两个点云,P={p_1,p2,,,pn}和Q={q1,q2,…,,q n},如图12-6所示,表示了所有的4种情况:从左到右边依次为,未指定索引和搜索 点云集合、只指定了索引、只指定了搜索点云集合、指定了索引和搜索点云集合。 indices IndIces indices indices Surface surface surFac日 surface Q 2 图12-6点云输入组合 (1) set indices()= false, set searchsurface()= false—毫无疑问这是点云 库中最常用的情况,用户只需要输入一个单一的点云数据集,并且为点云中的所有点 估计一个特征向量。不论一组索引和(或)搜索点云是否给定,都不希望保存不同的 第12章点云特征描述与提取 点实现副本,无论何时,即使 indices= false,PCL都会创建一组内部索引(为std:: 云 vectors<int>),这个索引集是指向整个数据集的( Indices=1…N,N是点云中点的数 目)。上述与图12-6中最左边的情况对应,首先,我们估计了p_1的最近邻元素,然 库学习教程 后是p2的最近邻元素,以此类推,直到我们估计完P中的所有点 (2) setlndices()=true, setSearchSurface()= false-如前面所提到的,特征 习估计方法只计算已给索引的点的特征。对应图12-6的第二种情况,这里假设p2 教的索引不在已给的索引向量中因此在P2点处,没有估计邻元素或者特征向量 (3) setIndices()= false, set SearchSurface()=true-如第一种情况,对所有 已给点进行特征向量估计,但是,在 set Search surface()中给出的采样面点云将用来 为输入点获取最近邻元素,而不是输入点云本身。上述对应图12-6第三种情况 如果Q={q1,q2}作为输入,是不同于P的另一个给出的点云,P是Q的搜索表 面,那么将从P中计算两个点q1和q2的近邻 274 (4) setlndices()=true, set Search Surface()=true-这种组合可能是最少见 的情况,索引和搜索点云都给定。这种情况下,将使用 setsearch surface()中给出的 搜索点云,只对< Input, indices>中的子集进行特征向量估计。上述对应图12-6 中最后(最右端)一种情况,这里,我们假设q2的索引没有在Q的已给索引向量中, 因此在q2点处,没有估计其邻元素或者特征。 (5)在使用 setSearchSurface()时,最有用的案例是:当有一个非常密集的输入 点云数据集时,但是我们不想对它里面的所有点处进行特征估计,而是希望在找到的 一些关键点处(使用 pcl keypoints中的方法进行估计),或者在点云的下采样版本中 (如:使用pcl: Voxelgrid<T>过滤而获得的)进行特征估计。这种情况下,我们通 过 setInputCloud()来把下釆样后的点云/关键点传递给特征估计算法,而把原始数 据通过 setSearch Surface()设置为搜索集合,从而提高程序的运行效率。 3.法线估计实例 一旦确定邻域以后,査询点的邻域点可用来估计一个局部特征描述子,它用查询 点周围邻域点描述采样面的几何特征,描述几何表面图形的一个重要问题,首先是推 断它在坐标系中的方位,也就是估计它的法线,表面法线是表面的一个重要属性,在 许多领域都有重要应用,如使用光源来生成符合视觉效果的渲染等(更多信息,详见 [ RusuDissertation])。下面的代码段对所有输入点云数据集中的点估计一组表面 法线。 # include<pcl/ features/ mormal3d.h>//法线估计类头文件声明 pcl:: Pointcloud<pcl:: FaintXYZ>:: Ptrcloud(newpcl:: PointCloud<pcl:: PointXYZ>); /打开点云代码 //创建法线估计对象,并将输人数据集传递给这个对象 pcl:: NormalEstimation<pcl:: RointXYZ, pcl:: Normal>ne: 第12章点云特征描述与提取 ne. setInputCloud(cloud); //创建一个空的 kd-tre对象,并把它传递给法线估计对象 //基于给出的输入数据集, kd-tree将被建立 pcl:: search:: KdTree pcl:: PointXYZ >:: Ptr tree (newpcl:: search:: KdTree< pcl PointXYZ> (): ne. setSearchMethod(tree); //存储输出数据集 点云库学习教程 pcl::PointCloud<pcl::Normal>::Ptrcloud_normals(newpcl,: Pointcloud<.pcl:Normal >); //使用半径在查询点周围3厘米范围内的所有邻元素 ne. setRadiusSearch(0. 03); /计算特征值 中求 ne compute(* cloud normals); //cloud normals->points. size ()EK input cloud downsampled-> points. size () 275 有相同尺寸 下面这段代码将为输入点云数据集的子集估计一组表面法线。 pcl:: PointCloud<pcl:: PointXYZ>:: Ptrcloud(newpcl:: PointCloud<pcl:: PointXYz>); //创建一组使用的索引,为简单起见,我们打算使用点云中前108的点 std:: vector<int>indices(floor(cloud->points. size(/10)); for(size ti=0; indices. size(;++i)indices[i]=i; //创建法线估计类,并把输入数据集传递给它 pcl:: NormalEstimation<pcl:: PointXYZ, pcl:: Normal>ne; ne. setInputCloud(cloud); //传递索引 boost:: shared ptr< std:: vector< int>> indicesptr(newstd: vector< int>( indi ces)); ne. setIndices(indicesptr) //创建一个空的 kd-tree,并把它传递给法线估计对象 最后,下面这段代码将为所有输入数据集中的点估计一组表面法线,但是使用另 个数据集来估计它们的近邻,正如之前提到的,当输入是一个表面的下采样版本 时,这样提高了程序的运行效率。 pcl:: Pointcloud<pcl:: PointXYz>:: Ptrcloud( newpcl:: Pointcloud<pcl:: PointXYZ>); pcl:: PointCloud< pcl:: PointXYZ>:: Ptrcloud_ downsampled (newpcl:: PointCloud<pcl:: PointXYz>); /创建法线估计对象,并把输入数据集传递给它 pcl:: NormalEstimation<pcl:: PointXYZ, pcl:: Normal>ne ne. setInputCloud (cloud downsampled); 第12章点云特征描述与提取 点云库 /传递原始数据(下采样前)作为搜索点云集合 ne. setsearchSurface (cloud)i 12.3.2估计一个点云的表面法线 学 表面法线是几何体表面的重要属性,在很多领域都有大量应用,例如:在进行光 教照渲染时产生符合可视习惯的效果时需要表面法线信息才能正常进行,对于一个已 程知的几何体表面,根据垂直于点表面的矢量因此推断表面某一点的法线方向通常比 较简单。然而,由于我们获取的点云数据集在真实物体的表面表现为一组定点样本, 这样就会有两种解决方法; (1)使用曲面重建技术,从获取的点云数据集中得到采样点对应的曲面,然后从 曲面模型中计算表面法线; 276 (2)直接从点云数据集中近似推断表面法线。 本小节将针对后一种情况进行介绍,已知一个点云数据集在其中的每个点处直 接近似计算表面法线。 l。理论基础 尽管有许多不同的法线估计方法,本教程中着重介绍的是其中最简单的一个,表 述如下,确定表面一点法线的问题近似于估计表面的一个相切面法线的问题,因此转 换过来以后就变成一个最小二乘法平面拟合估计问题。 注意:更多信息,包含最小二乘法问题的数学方程式,请见[ RusuDissertation] 因此估计表面法线的解决方案就变成了分析一个协方差矩阵的特征矢量和特征 值(或者PCA一主成分分析),这个协方差矩阵从查询点的近邻元素中创建。更具体 地说,对于每一个点P,对应的协方差矩阵C如下: k ∑2,(P,-P)·(P,-P ∈{0,1,2} 此处,k是点P邻近点的数目,P表示最近邻元素的三维质心,λ,是协方差矩阵的第 j个特征值,υ是第j个特征向量。 在PCI内估计一点集对应的协方差矩阵,可以使用以下函数调用实现: //定义每个表面小块的3x协方差矩阵的存储对象 Eigen:: Matrix3fcovariance matrix: /定义一个表面小块的质心坐标16字节对齐存储对象 Eigen:: Vector4fxyz centroid; //估计质心坐标 compute3DCentroid(cloud, xyz centroid); /计算3x3协方差矩阵 computeCovarianceMatrix(cloud, xyz centroid, covariance matrix); 第12章点云特征描述与提取 通常没有数学方法能解决法线的正负向间题,如上所示,通过主成分分析法点 (PCA来计算它的方向也具有二义性,无法对整个点云数据集的法线方向进行一致云 性定向。图12-7显示出对一个更大数据集的两部分产生的影响,此数据集来自于库 厨房环境的一部分,很明显估计的法线方向并非完全一致,图12-8展现了其对应扩 展的高斯图像(ECFD,也称为法线球体( normal sphere.,它播述了点云中所有法线的学 方向。由于数据集是2.5维,其只从一个单一的视角获得,因此法线应该仅呈现出 半球体的扩展高斯图像(EGI。然而,由于定向的不一致性,它们遍布整个球体,如教 图12-8所示。 程 277 图12-7估计厨房环境的表面法线 图12-8法线球体 如果实际知道视点Vp,那么这个问题的解决是非常简单的。对所有法线n定向 只需要使它们一致朝向视点方向,满足下面的方程式 n1·(vp-P)>0 图12-9展现了图12-7中的数据集的所有法线被一致定向到视点后的结果 演示。 图12-9将所有法线一致定向到后视点的结果 在PCL中对一个已知点的法线进行手动重新定向,你可以使用: flipNormalTowardsViewpoint (const Pointr &point, float vp_x, float vp_y, float vp_2 Eigen:: Vector4f &normal); 第12章点云特征描述与提取 点云库 注意:如果数据集是从多个捕获视点中配准后集成的,那么上述法线的一致性定 云向方法就不适用了。需要使用更复杂的算法,更多信息请见[ RusuDissertation 2.选择合适的尺度 如之前介绍的,在估计一个点的表面法线时,我们需要从周围支持这个点的邻近 学点着手(也称做k邻域)最近邻估计问题的具体内容又提出了另一个问题“合适的 习尺度”已知一个取样点云数据集,k的正确取值是多少(k通过pl: Feature:er 教 程| Search给出)或者确定一个点r为半径的圆内的最近邻元素集时使用的半径r应该 取什么值(r通过pcl: Feature:: set Radius search给出)。这个问题非常重要,并且 在一个点特征算子的自动估计时(例如:用户没有给定阈值)是一个限制因素。为了 更好地说明这个问题,以图12-10所示表现了选择更小尺度(如:r值或k取相对小) 与选择更大尺度(如:值或k值比较大)时的两种不同效果。图12-10和图12-11 278 分别为近视图和远视图,两图中左边部分展示选择了一个合理的比例因子,估计的表 面法线近似垂直于两个平面,即使在互相垂直的边沿部分,可明显看到边沿。如果这 个尺度取的太大(右边部分),这样邻近点集将更大范围地覆盖邻近表面的点,估计的 点特征表现就会扭曲失真,在两个平面边缘处出现旋转表面法线,以及模糊不清的边 界,这样就隐藏了一些细节信息 图12-10选择合理的比例因子 图12-11选择较大的比例因子 无法深入探究更多讨论,现在可粗略假设,以应用程序所需的细节需求为参考, 选择确定点的邻域所用的尺度。简言之,如果杯子手柄和圆柱体部分之间边缘的曲 率是重要的,那么需要足够小的尺度来捕获这些细节信息,而在其他不需要细节信息 的应用中可选择大的尺度。 3.估计法线实例详解 虽然法线估计的例子已经在上小节中给过了,这里还是复习一下其中的一部分, 以便更好地解释说明本节的后续部分,在本书提供光盘的第12章例1文件夹中,打 开名为 normal estimation.cpp的代码文件,同文件夹下可以找到相关的测试点云文 件 table scene_lms400.pcd。下面详细介绍一些源代码中相关的函数和类。 法线估计类 Normalestimation的实际计算调用程序内部执行以下操作: 对点云P中的每个点p得到p点的最近邻元素,计算p点的表面法线n,检查n

...展开详情
试读 127P 点云PCL学习教程(3)
立即下载
限时抽奖 低至0.43元/次
身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
誓言葬送了流年 终于凑齐一本书可,谢谢分享
2017-09-15
回复
yf111221 谢谢分享,找了几个链接地址,才把文档下载完整
2017-06-13
回复
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
  • 分享精英

关注 私信
上传资源赚钱or赚积分
最新推荐
点云PCL学习教程(3) 22积分/C币 立即下载
1/127
点云PCL学习教程(3)第1页
点云PCL学习教程(3)第2页
点云PCL学习教程(3)第3页
点云PCL学习教程(3)第4页
点云PCL学习教程(3)第5页
点云PCL学习教程(3)第6页
点云PCL学习教程(3)第7页
点云PCL学习教程(3)第8页
点云PCL学习教程(3)第9页
点云PCL学习教程(3)第10页
点云PCL学习教程(3)第11页
点云PCL学习教程(3)第12页
点云PCL学习教程(3)第13页
点云PCL学习教程(3)第14页
点云PCL学习教程(3)第15页
点云PCL学习教程(3)第16页
点云PCL学习教程(3)第17页
点云PCL学习教程(3)第18页
点云PCL学习教程(3)第19页
点云PCL学习教程(3)第20页

试读结束, 可继续阅读

22积分/C币 立即下载