PCL库中去除噪点的方法如下4种:使用统计滤波器(StatisticalOutlierRemoval)去除噪点、使用半径滤波器(RadiusOutlierRemoval)去除噪点、使用直通滤波器(PassThrough)去除超出指定范围的点、条件滤波器(ConditionalRemoval)去除噪点。
一、统计滤波器(StatisticalOutlierRemoval)
该滤波器会计算每个点周围一定半径内点的平均距离和标准差,然后根据一个阈值判断该点是否为噪点,从而将其移除。
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
sor.setInputCloud(cloud); // 设置输入点云
sor.setMeanK(50); // 设置平均值估计所需的点数
sor.setStddevMulThresh(1.0); // 设置标准差乘数阈值
sor.filter(*cloud_filtered); // 执行滤波操作
二、半径滤波器(RadiusOutlierRemoval)
该滤波器会计算每个点周围一定半径内点的密度,并将密度低于一个阈值的点移除。
pcl::RadiusOutlierRemoval<pcl::PointXYZ> ror;
ror.setInputCloud(cloud); // 设置输入点云
ror.setRadiusSearch(0.8); // 设置搜索半径
ror.setMinNeighborsInRadius(2); // 设置半径内最小邻居点数
ror.filter(*cloud_filtered); // 执行滤波操作
三、直通滤波器(PassThrough)
该滤波器会将某个轴上不在指定范围内的点移除。(相当于在某个轴上裁剪)
// 创建直通滤波器对象
pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud(cloud);
pass.setFilterFieldName("z"); // 设置过滤轴为Z轴
pass.setFilterLimits(0.0, 1.0); // 设置过滤范围为[0.0, 1.0]
pass.filter(*clound_result); // 进行滤波
四、 条件滤波器(ConditionalRemoval)
主要作用是移除不符合特定条件的点,从而提取出符合条件的点云子集。应用场景有:
-
移除离群点:通过设置特定的条件,可以移除点云中的离群点,提取出更具有代表性的点云子集。
-
提取特定区域的点:例如,可以根据点的坐标信息,筛选出位于某一区域内的点云子集。
-
提取具有特定属性的点:例如,可以根据点的颜色、法向量、曲率等属性信息,筛选出具有特定属性的点云子集。
-
从复杂的点云场景中提取特定物体或场景:例如,在机器人视觉中,可以使用
ConditionalRemoval
滤波器提取出特定的物体或场景,进行目标检测、识别等任务。
//创建条件
pcl::ConditionAnd<pcl::PointXYZRGB>::Ptr condition_add(new pcl::ConditionAnd<pcl::PointXYZRGB >());
condition_add->addComparison(pcl::FieldComparison<pcl::PointXYZRGB>::ConstPtr
(new pcl::FieldComparison<pcl::PointXYZRGB>("z", pcl::ComparisonOps::GT, 1000)));
//EQ、NE、GT、LT、GE、LE//lt:表示小于<。即less than //Gt:表示大于于<。
// 创建ConditionalRemoval对象
pcl::ConditionalRemoval<pcl::PointXYZRGB> conditional_removal;
conditional_removal.setCondition(condition_add);// 设置条件对象
conditional_removal.setInputCloud(cloud);
conditional_removal.setKeepOrganized(false);//如果设置为true,则保留点云中被滤掉的点,否则删除
conditional_removal.filter(*clound_result);
//设置setKeepOrganized为false时,被过滤的点会被删除而不是设置为NaN。
总结:这些滤波器的具体参数需要根据应用场景和数据特点进行调整。