【PCL】教程 statistical_removal.cpp 移除统计学上的异常值(outliers)来清洗数据

099558df04e699c0b5585e18e4afee8c.png

[done, 960.866 ms : 460400 points]
Available dimensions: x y z intensity distance sid

table_scene_lms400.pcd

1d7d1649d7bfb761919cfcee89b5735b.png

[done, 1414.24 ms : 451410 points]
Available dimensions: x y z

table_scene_lms400_inliers.pcd

7e819c7f5178c1d34e620a05dae2a8d8.png

[done, 412.985 ms : 8990 points]
Available dimensions: x y z

table_scene_lms400_outliers.pcd

这段代码是一个使用PCL (Point Cloud Library) 进行点云数据处理的C++程序。程序的主要目的是移除统计学上的异常值(outliers)来清洗数据

  1. 首先,代码包含了所需的库文件,这些库提供了点云处理的相关功能,包括输入/输出操作和定义点类型等。

  2. 接着,定义了主函数 main,程序的执行从这里开始。

  3. 在主函数中,声明了两个点云对象的指针:cloud 和 cloud_filtered。其中 cloud 用于存储原始数据,而 cloud_filtered 用于存储过滤后的数据。

  4. 然后使用 pcl::PCDReader 对象读取一个PCD文件(点云数据文件),路径为 "table_scene_lms400.pcd"。此文件需要提前存在于指定路径。

  5. 输出原始点云数据的信息,以便于观察过滤之前的数据状态。

  6. 创建了一个过滤器对象 pcl::StatisticalOutlierRemoval<pcl::PointXYZ>,这个对象可以通过统计分析来移除点云中的异常值

  7. 设置过滤器参数:setMeanK 设定邻近点的数量,setStddevMulThresh 设定标准差乘数阈值,这些参数用于定义什么样的点被认为是异常值。

  8. 通过调用过滤器的 filter 方法执行过滤操作,并将结果存储到 cloud_filtered

  9. 输出过滤后的点云数据的信息,以便于观察对比。

  10. 使用 pcl::PCDWriter 对象将过滤后保留的数据写入到一个新的PCD文件 "table_scene_lms400_inliers.pcd"

  11. 设置过滤器的 setNegative 为 true,这样可以获取所有被认为是异常值的点。

  12. 再次执行过滤操作,并将结果写入到另一个新文件 "table_scene_lms400_outliers.pcd",用于保存异常值点云

整体上,这段代码实现了对点云数据中异常值的识别和移除,可以用于数据的预处理以提高后续处理步骤的准确性。

终端输出:

Cloud before filtering:
header: seq: 0 stamp: 0 frame_id:
points[]: 460400
width: 460400
height: 1
is_dense: 1
sensor origin (xyz): [0, 0, 0] / orientation (xyzw): [0, 0, 0, 1]


Cloud after filtering:
header: seq: 0 stamp: 0 frame_id:


points[]: 451410
width: 451410
height: 1
is_dense: 1
sensor origin (xyz): [0, 0, 0] / orientation (xyzw): [0, 0, 0, 1]
#include <iostream> // 引入iostream库,用于输入输出
#include <pcl/io/pcd_io.h> // 引入pcl库中的pcd_io模块,用于读取和保存PCD文件
#include <pcl/point_types.h> // 引入pcl库中的point_types模块,定义了各种类型的点云
#include <pcl/filters/statistical_outlier_removal.h> // 引入pcl库中的statistical_outlier_removal模块,用于统计离群值移除滤波


int
main ()
{
  // 声明两个点云指针,分别用于存储原始点云和滤波后的点云
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);


  // 读取点云数据
  pcl::PCDReader reader; // 创建一个PCD文件读取对象
  // 用reader对象读取PCD文件,文件路径需替换为实际路径
  reader.read<pcl::PointXYZ> ("table_scene_lms400.pcd", *cloud);


  // 输出原始的点云数据大小
  std::cerr << "Cloud before filtering: " << std::endl;
  std::cerr << *cloud << std::endl;


  // 创建离群值滤波处理对象
  pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; // 创建滤波器对象
  sor.setInputCloud (cloud); // 设置输入点云
  sor.setMeanK (50); // 设置在进行统计时考虑的临近点个数
  sor.setStddevMulThresh (1.0); // 设置判断是否为离群值的阈值乘数
  sor.filter (*cloud_filtered); // 执行滤波,过滤后的点云存储在cloud_filtered中


  // 输出滤波后的点云数据大小
  std::cerr << "Cloud after filtering: " << std::endl;
  std::cerr << *cloud_filtered << std::endl;


  // 保存滤波后的点云到PCD文件
  pcl::PCDWriter writer; // 创建一个PCD文件写入对象
  writer.write<pcl::PointXYZ> ("table_scene_lms400_inliers.pcd", *cloud_filtered, false);


  // 将离群值反转,即获得所有被认为是离群值的点云
  sor.setNegative (true);
  sor.filter (*cloud_filtered);
  // 保存这部分离群值点云到另一个PCD文件
  writer.write<pcl::PointXYZ> ("table_scene_lms400_outliers.pcd", *cloud_filtered, false);


  return (0); // 程序正常退出
}

这段C++代码使用了PCL(Point Cloud Library)库,主要功能是读取一个PCD(点云数据)文件,对其中的数据进行统计学离群值滤波处理,然后将滤波后的点云和被识别出的离群值点云分别保存为新的PCD文件。统计学离群值滤波是一种用来剔除离群点(例如由噪声或其他原因产生的不正确测量值)的方法,它通过计算每一个点的邻域内其他点的距离分布情况,将那些不符合特定标准差乘数的点标记为离群值,并进行过滤。这在点云的预处理中是一个常用的步骤,可以改善后续处理的结果,如点云配准、表面重建等。

pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;

b4b5fc78874a9b563de5fbe4c347f2da.png

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值