点云去噪示例

点云去噪是点云预处理的重要步骤,本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


点云点云处理中的一个重要任务,可以提高点云的质量和精度。Python中有很多点云的库,比如: 1. Pyntcloud:一个基于Python点云处理库,提供了多种点云方法,包括基于统计学的方法和机器学习方法。 2. Open3D:一个开源的3D计算机视觉库,提供了多种点云方法,包括基于统计学的方法和基于深度学习的方法。 3. PCL:一个点云处理库,支持多种点云方法,包括基于统计学的方法和基于机器学习的方法。 这里以Pyntcloud为例,介绍一下如何使用它进行点云。 首先,安装Pyntcloud库: ``` pip install pyntcloud ``` 然后,加载点云数据: ```python import pyntcloud cloud = pyntcloud.PyntCloud.from_file("input.ply") ``` 接下来,可以使用VoxelGrid滤波器对点云进行降采样: ```python voxelgrid_id = cloud.add_structure("voxelgrid", size_x=0.05, size_y=0.05, size_z=0.05) voxelgrid = cloud.structures[voxelgrid_id] downsampled_cloud = voxelgrid.get_sample() ``` 然后,使用StatisticalOutlierRemoval滤波器对点云进行: ```python statistical_id = downsampled_cloud.add_filter("statistical_outlier_removal", nb_neighbors=20, std_ratio=0.2) filtered_cloud = downsampled_cloud.get_filter(statistical_id) ``` 最后,保存处理后的点云数据: ```python filtered_cloud.to_file("output.ply") ``` 以上就是使用Pyntcloud进行点云的简单示例。需要注意的是,不同的点云方法适用于不同的场景和数据类型,因此需要根据具体情况选择合适的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值