Part1: RadiusOutlierRemoval
RadiusOutlierRemoval 在点云数据中,用户指定每个的点一定范围内周围至少要有足够多的近邻点,如果没有哪么多,就被清除;有利于清除孤立的点;
Part2:ConditionalRemoval
它可以一次删除满足对输入的点云设定的一个或多个条件指标的所有数据点。
相比之下,RadiusOutlierRemoval滤波器非常适合去除单个的离群点。而ConditionalRemoval比较灵活,可以根据设置的条件进行过滤,有点像直通滤波。
RadiusOutlierRemoval
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_conditional(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_radius(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("indata.pcd", *cloud_in);
//------------radius_remove-----------------
pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
outrem.setInputCloud(cloud_in);
outrem.setRadiusSearch(0.5);
outrem.setMinNeighborsInRadius(20);
outrem.filter(*cloud_radius);
ConditionalRemoval
//--------------condition_remove 的滤波器---------------
//build the filter
pcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond(new pcl::ConditionAnd<pcl::PointXYZ>);//实例化条件指针
range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::GT, 0.0)));
range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::LT, 5.0)));
//build the filter
pcl::ConditionalRemoval<pcl::PointXYZ> condrem;
condrem.setCondition(range_cond);
condrem.setInputCloud(cloud_in);
condrem.setKeepOrganized(true);//保存原有点云结结构就是点的数目没有减少,采用nan代替了
//apply filter
condrem.filter(*cloud_conditional);