点云去噪示例

点云去噪是点云预处理的重要步骤,本blog将给出点云去噪的一份示例代码

#include <iostream>
  #include <pcl/common/common_headers.h>
  #include <pcl/io/pcd_io.h>
  #include <pcl/console/parse.h>
  #include <pcl/filters/statistical_outlier_removal.h>

  using namespace std;

  // -----Main-----
  int main(int argc, char** argv)
  {
      // 解析命令行参数
      if (argc != 3)
      {
     cout <<"Usage : ./xxx x.pcd y.pcd"<<endl;
          return 0;
      }
      //声明用于存load进来的点云,以及filter之后的点云.
   pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr(new pcl::PointCloud<pcl::PointXYZRGB>);
   pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZRGB>);
    pcl::io::loadPCDFile (argv[1], *point_cloud_ptr);

      //对点云做一些云除噪音的操作.
      // 声明一个滤波器.
   pcl::StatisticalOutlierRemoval<pcl::PointXYZRGB> sor;
      sor.setInputCloud(point_cloud_ptr);
      sor.setMeanK(50);
      sor.setStddevMulThresh (1.0);
      sor.filter (*cloud_filtered);

      //保存filter之后的点云并比较filter前后点的数量变化.
      pcl::io::savePCDFileASCII (argv[2], *cloud_filtered);
      cout << "before filter :" << point_cloud_ptr->points.size() << endl;
      cout << "After filter :" << cloud_filtered->points.size() << endl;
  }

对于sor那几行代码作解释如下

  • 创建统计分析滤波器,然后设置滤波器输入(注意传入的是Ptr),也就是我们待处理的点云的指针
  • 设置对每个点分析的临近点的个数设置为50 ,并将标准差的倍数设置为1, 这意味着如果一个点的距离超出了平均距离加上一个标准差以上,则该点被标记为离群点,并将它移除。
  • 最后统计分析滤波后,输出的结果就是cloud_filtered。

下面是一个filter 点云前后的变化示意图.

  • filter之前
    在这里插入图片描述

  • filter之后
    在这里插入图片描述

且点的数据上也发生了明显的变化

before filter :161599
After filter :156728


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值