适用对象
滤除离群点的一种滤波方法。
工作原理
通过设定滤波条件进行滤波,删除点云中不符合用户指定的一个或多个条件的点。
PCL核心代码实现
//创建条件对象
pcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond (new pcl::ConditionAnd<pcl::PointXYZ> ());
/*
//比较条件符号说明:
//GT greater than
//EQ equal
//LT less than
//GE greater than or equal
//LE less than or equal
*/
//添加比较条件1:z>0.0
range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new pcl::FieldComparison<pcl::PointXYZ> ("z", pcl::ComparisonOps::GT, 0.0)));
//添加比较条件2:z<0.8
range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new pcl::FieldComparison<pcl::PointXYZ> ("z", pcl::ComparisonOps::LT, 0.8)));
pcl::ConditionalRemoval<pcl::PointXYZ> condrem; //创建条件滤波器对象
condrem.setCondition (range_cond); //设置条件
condrem.setInputCloud (cloud); //设置输入点云
condrem.setKeepOrganized(true); //设置保持点云的结构
condrem.filter (*cloud_filtered); //执行滤波
condrem.setKeepOrganized( )详解:
设置受保持点云的结构。
有序点云执行滤波之后,希望仍然能够保持有序性
若设置为true,再通过setuserFilterValue设置一个指定的值,被滤除的点将会被用户指定的值代替。
若设置为true,没有通过setuserFilterValue设置一个指定的值,则用nan填充被滤除的点
若设置为false,则直接将滤除的点删除,从而可能改变点云的组织结构
完整代码将与半径滤波器一起给出。查看点云滤波—半径滤波器
参考资料
Removing outliers using a Conditional or RadiusOutlier removal