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