【pcl入门教程滤波系列】之RadiusOutlier

简介

  上面图片来自官方示例,简短说明一下半径离群点剔除的策略:就是在某个点半径范围内搜索邻域的点集个数能否满足设置点个数,不满足就是离群点。从上图可以看见,如果指定邻域至少包含1个点,那么黄色点将会被删除。如果指定邻域至少包含2个点,则黄色和绿色点都会被删除。一般情况下,RadiusOutlier会在条件滤波之后【pcl入门教程滤波系列】之ConditionFilter滤波,进行离群点去除。

Demo示例
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/radius_outlier_removal.h>


int main (int argc, char** argv)
{

  pcl::PointCloud<pcl::PointXYZI>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZI>);
  pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZI>);

  // Fill in the cloud data
  pcl::PCDReader reader;
  reader.read("16line.pcd", *cloud);

  pcl::RadiusOutlierRemoval<pcl::PointXYZI> outrem;
  // build the filter
  outrem.setInputCloud(cloud);
  outrem.setRadiusSearch(0.8);
  outrem.setMinNeighborsInRadius (5);
  outrem.setKeepOrganized(false);
  // apply filter
  outrem.filter (*cloud_filtered);

  std::cerr << "Cloud before filtering: " << cloud->points.size() << std::endl;

  std::cerr << "Cloud after filtering: " << cloud_filtered->points.size()<< std::endl;

  // save filterd data 
  pcl::PCDWriter writer;
  writer.write("16line_filtered.pcd", *cloud_filtered, false);

  return (0);
}

主要函数

  RadiusOutlier主要设置两个参数,第一个是搜索点云的邻域半径:setRadiusSearch(),另一个就是邻域半径内点云个数的下限:setMinNeighborsInRadius()

实验结果

原始点云
RadiusOutlier后点云

  这里有个奇怪现象,如果你的setKeepOrganized()函数设置为true的话,你会发现点云输入输出个数没有变化。主要原因是这个函数把所有的离群点坐标值都设置成为nan,并没有改变点云的空间位次。如果你想看到滤波后的点云个数,只需要将其设置成为false即可。

参考

https://pcl.readthedocs.io/projects/tutorials/en/latest/remove_outliers.html#remove-outliers

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值