PCL滤波器总结1

两种范围滤波器:

1.PassThrough 

作用:延某个维度过滤点云,删除范围内或范围外的点。

示例:

  // Create the filtering object
  pcl::PassThrough<pcl::PointXYZ> pass;
  pass.setInputCloud (cloud);
  pass.setFilterFieldName ("z");
  pass.setFilterLimits (0.0, 1.0);
  //pass.setFilterLimitsNegative (true);
  pass.filter (*cloud_filtered);

2.ConditionalRemoval 

作用:功能比1多一些,可以删除给定输入云中不满足一个或多个给定条件的所有索引,具体参见API文档:http://docs.pointclouds.org/1.8.0/classpcl_1_1_conditional_removal.html#a46d48542fa99bf5d338506506fbf9125

示例:

//build the condition
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, 0.8)));
// build the filter
pcl::ConditionalRemoval<pcl::PointXYZ> condrem;
condrem.setCondition (range_cond);
condrem.setInputCloud (cloud);
condrem.setKeepOrganized(true);
// apply filter
condrem.filter (*cloud_filtered);

两种基于点云分布的滤波器

1.RadiusOutlierRemoval

设置搜索半径和近邻点数量,每个索引必须在指定的搜索半径内有大于设定值的近邻点数量,否则将会被从点云中删除。例如,如果设置近邻点数量为1,那么只有黄色的点将从PointCloud中删除。如果设置为2,那么黄色和绿色的点都将从PointCloud中删除。

_images / radius_outlier.png

下面的代码创建RadiusOutlierRemoval过滤器对象,设置其参数并将其应用于输入点云。搜索半径设置为0.8,并且一个点必须在该半径中至少有2个邻点才能保留为PointCloud的一部分。

pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
// build the filter
outrem.setInputCloud(cloud);
outrem.setRadiusSearch(0.8);
outrem.setMinNeighborsInRadius (2);
// apply filter
outrem.filter (*cloud_filtered);

2.StatisticalOutlierRemoval

使用统计的方法进行滤波

激光扫描通常生成具有不同点密度的点云数据集。此外,测量误差会导致稀疏异常值,从而进一步破坏结果。这使得局部点云特征(例如表面法线或曲率变化)的估计变得复杂,导致错误的值。这些不规则性中的一些可以通过对每个点的邻域执行统计分析并且删除那些不符合特定标准的点来解决。StatisticalOutlierRemoval基于输入数据集中点到邻居距离的分布的计算,对于每个点,计算从它到所有邻近点的平均距离。假设得到的分布是高斯分布,有一个均值和一个标准差,那么所有平均距离在全局距离均值(?)和标准差定义的区间之外的点都可以被视为离群值,并从数据集中进行删除。

下图显示了稀疏异常值分析和删除的效果:原始数据集显示在左侧,结果数据集显示在右侧。该图显示了滤波前后点邻域的平均k-最近邻距离。图中红色代表原始数据分布,绿色代表滤波后数据分布。

_images/statistical_removal_2.jpg

示例:

 // Create the filtering object
  pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
  sor.setInputCloud (cloud);
  sor.setMeanK (50);
  sor.setStddevMulThresh (1.0);
  sor.filter (*cloud_filtered);

上例中将每个点要分析的邻域数设为50,标准差乘子设为1。这意味着,到查询点的平均距离的一个标准差以上的所有点都将标记为离群值并被删除。输出被计算并存储在cloud_filter中。(标准差的设置要根据结果视觉效果分析吗?)

猜你喜欢

转载自blog.csdn.net/xiuzhang5738/article/details/84892110
今日推荐