【毕业课题学习】6DOF物体识别及抓取-PCL点云处理(五)---预处理之滤波

【毕业课题学习】6DOF物体识别及抓取-PCL点云处理(五)—预处理之滤波

最近在做pipeline的细化工作,看过我前面博客的应该知道官方教程给的程序,预处理部分就只有个uniform_sample均匀采样,处理后的点就是Key_points关键点,属实太官方。对于不同用途和类别的点云,由于相机产生的各种误差(误点),理所应当以不同的方式来进行处理、修建点云。由此,这节以滤波为主题,介绍几个常用且实用的滤波算法。(当然这里我还是以6Dof识别为背景)

以下仅供参考

1. 问题:为什么要进行滤波处理

采样得到的点云中自带或多或少噪声,会影响到后续的特征检测及匹配。

2. 问题:有哪些噪声

我认为和匹配无关以及和真实物体表面不对应的都可以认为噪声。
简单来说主要是:大尺度噪声(离群点) 和 小尺度噪声(纹理点)。对于不同的噪声,采取不同的措施,一般先去除大噪声,再去除小噪声。

tips:在官网中,下采样算法(如平均下采样、随机下采样)也被分在了Filter板块。我觉得滤波和下采样还是应该分开来说,滤波应当是对具有信息量的点以外的点的去除,下采样是对具有信息量的点的筛除;滤波会直接将无效点去除,下采样会对原始点云进行保留,在后续求特征过程中,仍然会用到原始点云的(领域)信息。 下面不严格细分,都以滤波来论

3. 常用滤波算法介绍及适用场景

(以下顺序由易到难

3.1 直通滤波 PassThrough

该方法的原理是根据某点类型的一个特定字段(如 xyz点云的x轴向)的约束对点云进行滤除。
应用: 一般使用方式,在使用相机拍摄时,相机作为原点,z轴为深度,相机可照射到一定范围的点云图,使用直通滤波,滤除目标范围外的点。比如我只需深度距离在1米范围内的点。

3.2 半径滤波 RadiusOutlierRemoval

借用pcl官网的示意图,定义的半径Radius值为大圆圈(球体领域)范围。当设定领域点数为1时,此时黄色点会被滤除。当设定领域点数为2时,绿色点和黄色点都会被滤除~
在这里插入图片描述
应用: 该算法,可去除所处密度比较小的点,比如场景中,目标物体的表面点云密度足够大,空间中存在密度较小的些许噪声,可用该方法滤除。

3.3 体素化网格下采样 VoxelGrid

和名字一样比较好理解,整个空间划分为很多个栅格(立方体),有点像octree的示意图,每个栅格中的所有点,都用重心点这一个点来代替(centroid),也就是除了重心点外的其他点都被滤除了。该方法比用中心(center)点代替法速度慢,但是根据代表性、准确性。
该方法不建议拿来求取关键点,处理速度固然快,但是这种平均的思想,肯定很滤除很多具有信息量的点,不多说。

3.4 条件去除 Conditional removal

该方法也如名字一样,就是给你一个约束条件,让你滤除不符合条件的点,感觉之前的直通滤波都可以归到这一类来,它比直通算法更丰富吧?可以这样说,因为条件滤除,约束条件可以一条或多条,内容也比只看几个特殊字段更为丰富。

3.5 统计学滤波 StatisticalOutlierRemoval

利用统计学知识,对每个点的K-近邻 进行分析,假设该点到k个近邻的距离符合高斯分布,即有一个均值和方差。官网的说明是,当均值距离在由全局距离均值和标准差定义的间隔之外的所有点视为离群值,并对数据集进行修减。
也就是以点到k个近邻的距离为
The distance threshold will be equal to: mean + stddev_mult * stddev
这个距离阈值式子中:
mean代表全局均值,点云中 每个点到k个近邻的平均距离 的平均。
stddev_mult代表标准差倍数阈值
stddev代表全局方差
当该点到k近邻的平均距离大于该阈值时,认为是离群值进行滤除。

PCL中的算法中需设定两个参数:setMeanK() 设置每个点考虑的k个邻居(后续就是该点到k个邻居的距离做统计)
setStddevMulThresh() 设置标准差倍数阈值(也就是上面讲的stddev_mult)

应用: 该算法,很常用,很多做点云处理的论文都有用过。这个算法可以很好的应对密集离群值的处理。关键是取合适的参数。
比如,有20个密集的离群值,都挨在一起,那么我设置k=30,也就是对于每个点考虑30个邻居,那对于这些密集离群值来说,,方差计算出来会相比来说大很多,而目标点云上,由于采样的连续,k邻域的平均距离和方差都会比较小。由此,这20个密集的离群值都可以很好的滤除。
思考 k领域考虑的k越大,是不是效果越好,也要看情况,看挨在一起的离群值的数量,比这个数量稍微大些就好。而越大,当然处理速度很更慢。


下面两种算法都是从2D算法到3D的一个扩展,都会改变点的位置,平滑化的处理,对于细小噪声的滤除

高斯滤波

和2D图像处理中的基本一致,转到3D点云后,只是对连续滑窗,改为了领域范围。通过类似滑窗的效果 利用高斯公式对每个点计算高斯值(对到领域点距离进行加权平均来计算)
参数
SetSigma()设置高斯函数中Sigma的值;
setThresholdRelativeToSigma() 设置Sigma相关阈值,查了文档才知道,对于计算点到领域点的距离,当不符合下面这个条件时,则不考虑。相当于设置了领域范围。还有个函数,可以手动设置阈值半径。

||pi - q|| > sigma_coefficient^2 * sigma^2 are not considered.


插播一条内容:Organized or Unorganized)Point Cloud

多翻译为有序点云。我一开始不明白也没多考虑什么是有序点云,简单分别有序和无序点云区别就是打开pcd文件,看height值是否为1。若为1则是无序,否则都为有序。
直到,我看到双边滤波这个算法,来了就说是对有序点云的处理。我就去了解了有序点云:有序点云
讲的比较容易理解,正如我们平常得到点云的方式,利用深度相机(Kinect等),得到的是深度图,即,像2d图片一样,宽x高,每个像素点代表的是深度(距离)值,NaN的点则是范围内没检测到东西(或者材质问题,得不到反射信息)。接着将深度转为点云图(2d到3d空间),才是我们所接触到的点云处理。

对于有序点云,好处是方便找到相邻点信息,即使是无效点信息也有用(意味着该点是采样到了是空的,而不是说没有采样到所以是空的),该结构对于光滑化处理很有用。

双边滤波

这个算法,用的人是真的多。优点:保边,边缘保存的好,即滤波时不会连边界一起平滑掉。
先解释下:Filter板块下的 class pcl::BilateralFilter< PointT > 是利用的强度信息字段。而我们采集到的xyzrgb点云不含有这个字段。
一般是采用的pcl::FastBilateralFilter< PointT >
原理这里就不细讲了,我也讲不明白是个啥内容,简单看下公式:
对于每个点
在这里插入图片描述算法中用到的两个参数就是上图最下面的两个。(图是截的一篇中文论文里的:利用双边滤波法进行点云去噪的试验与分析)还是应该多看原文:Sylvain Paris and Fredo Durand “A Fast Approximation of the Bilateral Filter using a Signal Processing Approach” European Conference on Computer Vision (ECCV’06)

简单来看就是利用计算出的法线信息,利用滤波因子(法向和径向)信息对点进行校正平滑处理。我一开始没觉得啥,但是看了别人做的效果双边滤波
我还是很感叹,引用一下图片(若侵删):
在这里插入图片描述
在这里插入图片描述

思考: 对于常见物体来说,表面都是光滑的,做完双边滤波后,很明显更符合真是物体的法线特征。而法线特征,可是很多算子的筹算范围内的,法线有效性更高,那对于特征提取,乃至之后的匹配都是很有意义的。


总结

滤波算法,预处理中的一步,处理的好,则后续匹配效果更好,计算复杂度更低。一些论文中采用的是统计学滤波+双边滤波:先用统计学滤波滤除离群点,再用双边滤波进行平滑,去除小噪声。

鸽了半个月。后续,随缘更~~~(●’◡’●)

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页