100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 多帧点云数据拼接合并_PCL点云处理实践(二):点云的处理和拼接

多帧点云数据拼接合并_PCL点云处理实践(二):点云的处理和拼接

时间:2018-09-03 14:56:05

相关推荐

多帧点云数据拼接合并_PCL点云处理实践(二):点云的处理和拼接

滤除背景

我们获得的点云可能包含一部分背景的点云。要去除背景,只保留人体信息,最简单的方式是使用直通滤波器滤除较远点。这部分代码如下:1

2

3

4

5

6pcl::PassThrough<:pointxyz>pass; //设置滤波器对象

pass.setInputCloud(cloud); //设置输入点云

pass.setFilterFieldName("z"); //设置过滤时所需要点云类型的z字段

pass.setFilterLimits(0.0,1.0); //设置在过滤字段上的范围

//pass.setFilterLimitsNegative (true); //设置保留范围内的还是过滤掉范围内的

pass.filter(*cloud_filtered); //执行滤波,保存过滤结果在cloud_filtered

滤除背景也可以通过Kinect SDK实现,这部分可以参考SDK的“游戏者ID”。

移除离群点

激光扫描通常会产生密度不均匀的点云数据集。另外,测量中的误差会产生稀疏的离群点,使效果更糟。因此对每个点的邻域进行一个统计分析,并修剪掉那些不符合一定标准的点。1

2

3

4

5pcl::StatisticalOutlierRemoval<:pointxyz> sor;// 创建滤波器对象

sor.setInputCloud(cloud); //设置呆滤波的点云

sor.setMeanK(50); //设置在进行统计时考虑查询点邻近点数

sor.setStddevMulThresh(1.0); //设置判断是否为离群点的阈值

sor.filter(*cloud_filtered); //执行滤波处理保存内点到cloud_filtered

下采样

为什么要进行下采样?

Kinect直接得到的点云数据非常庞大,由于我们下一步要对其进行配准和拼接处理,如果不对点云进行适当精简,运算时间可能非常长。因此,要等效一个Point较少的点云,取代原始点云进行配准操作。

PCL实现的VoxelGrid类通过输入的点云数据创建一个三维体素栅格(可把体素栅格想象为微小的空间三维立方体的集合),然后在每个体素(即,三维立方体)内,用体素中所有点的重心来近似显示体素中其他点,这样该体素就内所有点就用一个重心点最终表示,对于所有体素处理后得到过滤后的点云。1

2

3

4pcl::VoxelGrid<:pointcloud2>sor; //创建滤波对象

sor.setInputCloud(cloud); //设置需要过滤的点云给滤波对象

sor.setLeafSize(0.01f,0.01f,0.01f); //设置滤波时创建的体素大小为1cm立方体

sor.filter(*cloud_filtered); //执行滤波处理,存储输出cloud_filtered

点云拼接

配准

什么是配准

配准是将一个点云找到与另一个点云相对应的部分,并得到两个点云之间的转换矩阵。

配准之后,我们就可以将一个点云转换到另一个点云所在的坐标系内。在同一个坐标系内的点云可以进行拼接,形成一个更大的点云。

PCL内置了许多配准算法,例如迭代最近点对(ICP)算法,正态分布变换算法,随机一致采样(ransac)算法,等等。实际使用中,往往需要根据点云的特征选取合适的算法。这里使用了ransac算法。

随机抽样一致性算法(RANSAC)

概述

RANSAC是“RANdom SAmple Consensus(随机抽样一致)”的缩写。它可以从一组包含“局外点”的观测数据集中,通过迭代方式估计数学模型的参数。

RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点,并进行验证。

算法

RANSAC算法的输入是一组观测数据,一个可以解释或者适应于观测数据的参数化模型,一些可信的参数。

模型对应的是空间中一个点云数据到另外一个点云数据的旋转以及平移。

第一步随机选取点云中的一个点对,利用其不变特征(两点距离,两点法向量夹角)作为哈希表的索引值搜索另一个点云中的一个对应点对,然后计算得到旋转及平移的参数值。

用得到的变换模型去测试其它点,如果某个点适用于估计的模型,认为它也是局内点。

用所有假设的局内点去重新估计模型,重新计算旋转及平移的参数。

和上一个模型进行比较:是否有更多的局内点和更小的错误率。

然后迭代上述过程,直到找到最好的模型,或达到迭代次数。

优势和缺点

RANSAC的优点是它能从包含大量局外点的数据集中估计出高精度的参数。

RANSAC的缺点是它计算参数的迭代次数没有上限;如果设置迭代次数的上限,得到的结果可能不是最优的结果,甚至可能得到错误的结果。RANSAC只有一定的概率得到可信的模型,概率与迭代次数成正比。RANSAC的另一个缺点是它要求设置跟问题相关的阀值。

如何提高配准的精确度

对于两个点云来说,提高精确度的方法是选取合适的算法、增加迭代次数、修改参数。

实际配准中,我们可能要连续配准多个点云。这样,在两个点云匹配中出现的误差可能被放大。尝试了以下几种思路:第n个点云与第n+1个点云配准,得到转换矩阵。将第n-1个转换矩阵乘以这个转换矩阵,得到第n个转换矩阵。第n+1个点云乘以第n个转换矩阵,得到它投影到第1个点云所在坐标系的新点云。

上一方法的改进策略:同时由第1个点云向后出发,第n个点云向前出发进行配准,最终重合。

第n个点云与第n+1个点云配准,得到转换矩阵,并将第n+1个点云乘以转换矩阵,将得到的新点云替换第n+1个点云。

第n个点云与第n+1个点云配准,得到转换矩阵,并将第n+1个点云乘以转换矩阵,将得到的新点云拼接上第n个点云,然后替换第n+1个点云。

最终选择了第二种方法,它可以达到较好的效果。

配准部分的代码,根据采取的算法不同有所变化,建议从官方文档参看这部分代码。

最终效果

实际使用中,很难做到短时间高精度地配准出点云,对于一些情况,可能要进行有针对性的优化。这是测试中配准效果较好的一个:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。