点云库PCL学习笔记 -- 点云滤波Filtering -- 3.StatisticalOutlierRemoval 统计滤波器

  • StatisticalOutlierRemoval 统计滤波器相关简介
  • 1. StatisticalOutlierRemoval 统计滤波器代码
  • 2. 编译文件
  • 3. 测试

StatisticalOutlierRemoval 统计滤波器相关简介

激光扫描通常会产生密度不均匀的点云数据集。另外,测量中的误差会产生稀疏的离群点,使效果更糟。估计局部点云特征(例如采样点出的法向量或者曲率变化率)的运算很复杂,这会导致错误的数值,反过来有可能导致点云的配准等后期处理失败。

以下方法可以解决其中部分问题:对每个点的邻域进行一个统计分析,并修剪掉那些不符合一定标准的点。我们的稀疏离群点一处方法基于输入数据中对点到临近点的距离分布的计算。对每个点,我们计算它到它的所有临近点的平均距离。假设得到的结果是一个高斯分布,其形状由均值和标准差决定,平均距离在标准范围(由全局平均值和方差定义)之外的点,可以被定义为离群点并可从数据集中去除掉。

  • 下图展示了稀疏离群点分析和移除效果
  • 左1图为原始数据集,左2图为处理结果;
  • 右图展示了处理签和处理后,一个点邻域范围内的k近邻邻域平均距离。


1. StatisticalOutlierRemoval 统计滤波器代码

StatisticalOutlierRemoval 统计滤波器代码statistical_removal.cpp

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/statistical_outlier_removal.h>  //统计滤波类头文件int
main (int argc, char** argv)
{//定义并实例化一个PointCloud指针对象,并用读取文件数据点集赋值给它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;reader.read<pcl::PointXYZ> ("table_scene_lms400.pcd", *cloud);  //读取点云文件中的数据到 cloud 对象,table_scene_lms400.pcd 文件与该cpp文件在同一级目录下//打印点云数据的相关信息std::cerr << "Cloud before filtering: " << std::endl;std::cerr << *cloud << std::endl;//创建 StatisticalOutlierRemoval 统计滤波器//对每个点分析的临近点的个数设置为50,并将标准差的倍数设置为 1.0 这意味着如果一个点的距离超出了平均距离一个标准差以上,则该点被标记为离群点,并将它移除,存储起来pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; //创建 StatisticalOutlierRemoval 滤波对象sor.setInputCloud (cloud);                           //设置输入点云sor.setMeanK (50);                                  //设置在进行统计时考虑查询点临近点数,对每个点分析的临近点的个数设置为50sor.setStddevMulThresh (1.0);                          //设置判断是否为离群点的阈值,将标准差的倍数设置为 1.0sor.filter (*cloud_filtered);                          //执行完滤波处理保存数据点云到 cloud_filtered//打印滤波完后的点云数据信息std::cerr << "Cloud after filtering: " << std::endl;std::cerr << *cloud_filtered << std::endl;//将滤波后,保存的点云写入 table_scene_lms400_inliers.pcd 文件pcl::PCDWriter writer;writer.write<pcl::PointXYZ> ("table_scene_lms400_inliers.pcd", *cloud_filtered, false);//将滤波后,被过滤的点云写入 table_scene_lms400_outliers.pcd 文件sor.setNegative (true);          // true:滤波结果取反,被过滤掉的点云数据sor.filter (*cloud_filtered);writer.write<pcl::PointXYZ> ("table_scene_lms400_outliers.pcd", *cloud_filtered, false);return (0);
}

2. 编译文件

设置编译文件CMakeLists.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)project(statistical_removal)
find_package(PCL 1.2 REQUIRED)include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})add_executable (statistical_removal statistical_removal.cpp)
target_link_libraries (statistical_removal ${PCL_LIBRARIES})

编译

mkdir build
cd build/
cmake ..
make

3. 测试

执行程序

cd ..
./build/statistical_removal

结果如下:

  • 未开始滤波时,工程文件的目录如下所示。
    目录中的table_scene_lms400.pcd原始文件与statistical_removal.cpp文件在同一级目录下。

    使用pcl_viewer table_scene_lms400.pcd查看table_scene_lms400.pcd文件,如下
    可以很清楚的看到,该点云文件的离群点数量相对比较多。

  • 开始执行程序后
    相关的输出信息

    文件目录变化如下所示,程序运行完成后会生成一个table_scene_lms400_inliers.pcd保存的点云文件和一个table_scene_lms400_outliers.pcd保存的点云文件,这两个文件为通过StatisticalOutlierRemoval 统计滤波器统计滤波后的文件。

  • 使用pcl_viewer table_scene_lms400_inliers.pcd查看table_scene_lms400_inliers.pcd文件,如下所示:
    可以很清楚的看到,该点云文件相比之前的原始数据文件离群点少了很多。

  • 使用pcl_viewer table_scene_lms400_outliers.pcd查看table_scene_lms400_outliers.pcd文件,如下所示:
    该图为由 StatisticalOutlierRemoval 统计滤波器过滤筛选掉的离群点。

    两张图的相对比较如下。


点云库PCL学习笔记 -- 点云滤波Filtering -- 3. StatisticalOutlierRemoval 统计滤波器相关推荐

  1. (2)点云库处理学习——剔除点云值

    1.主要参考 1.1参考地址 (1) 点云离群点剔除 - open3d python_Coding的叶子的博客-CSDN博客_离群点去除 (2) open3d之点云异常值去除(笔记5)_Satelli ...

  2. PCL学习笔记(十八)-- ConditionalRemoval和RadiusOutliersRemoval滤波器移除离群点

    一.简介 RadiusOutlierRemoval滤波处理会滤除那些一定范围内没有足够多近邻的点: ConditionalRemoval滤波器用于删除不符合用户要求的一个或多个数据点. 二.代码分析 ...

  3. Open3D点云库 C++学习笔记

    配准篇(二) 文章目录 配准篇(二) 前言 一.点到点 ICP 二.点到面 ICP 三.Colored ICP算法 四.参考资料 总结 前言 点云配准的方法主要可以分为两类,一类是全局(粗)配准方法, ...

  4. 点云库PCL学习教程(PDF版免费下载)

    点云处理技术广泛应用在逆向工程.CAD/CAM.机器人学.激光遥感测量.机器视觉.虚拟现实.人机交互.立体3D影像等诸多领域. 免费分享 下载:资源链接 提取码:ex1h

  5. 《Open3D点云库 C++学习笔记 》

    几何篇(一) 一.前言 二.主要内容 1.点云的读入.储存和可视化 2.点云的下采样 三.参考资料 一.前言 本章节将主要介绍点云的读入.储存.可视化操作以及点云的下采样操作. 二.主要内容 1.点云 ...

  6. PCL学习笔记(二):PCL官方教程学习

    PCL学习笔记(二):PCL官方教程学习 PCD文件制作 Features 表面法线提取 Keypoints 提取NARF关键点 KdTree Range Image How to create a ...

  7. PCL学习笔记-PCL简介

    PCL(点云库)学习笔记 1.简介 点云数据的处理可以采用获得广泛应用的Point Cloud Library(点云库,PCL库). PCL库是一个最初发布于 2013年的开源c++库,它实现了大量点 ...

  8. PCL学习笔记(35)——3D物体识别

    源码 #include <pcl/io/pcd_io.h> #include <pcl/point_cloud.h> #include <pcl/corresponden ...

  9. 学习笔记:点云库PCL(Point Cloud Library )介绍

    本文简要介绍点云库(PCL),一个用于处理2D和3D数据的开源库,如激光雷达点云. 通过熟悉使用PCL的一些基础知识,以便后续使用PCL进行定位.主要涵盖以下内容: 点云数据Point Cloud D ...

最新文章

  1. 【mysql的编程专题⑤】自定义函数
  2. linux编译动态库未定义,linux 编译动态链接库 so,避免运行时才发现函数未 ......
  3. Win7下Event_Log服务4201错误的有效解决方法
  4. matlab 球坐标绘图,MATLAB绘制地图
  5. java中的ackerman_java8的函数式接口
  6. 江山如画 中国多少绝色
  7. 哪几种情况可以销毁session(一般有3种)
  8. 解决微信公众平台图片不可引用
  9. 2022年湖南省基金从业资格(私募股权投资基金基础知识)练习题及答案
  10. OA实施案例:服务性行业如何选型OA系统
  11. IDEA做数据库操作时的一个莫名其妙的错误
  12. Git使用技巧--详细教程
  13. 禅与摩托车维修艺术中提到的“刀”
  14. LabVIEW概述及其优点
  15. System32和SysWoW64的区别(转载)
  16. 一切发生的事,都是好事(19年总结)
  17. 史上最全解析——柯林斯大猫英语分级(附1~11级绘本及音频资源)
  18. 对可口可乐瓶进行图像识别
  19. (转)段永平的投资思想:56 个要点
  20. ROS Navigation之map_server完全详解

热门文章

  1. 乱码解决(二)——文件转码
  2. json spirit_Spirit App:Web实时轻松动画
  3. @Lazy的使用 懒加载
  4. OA办公自动化系统开发方案及源码
  5. 2021年全球药用蘑菇提取物收入大约415.3百万美元,预计2028年达到649.7百万美元
  6. 2023年软件测试职业发展趋势【附晋升路线】
  7. emplace_back()
  8. ubuntu14.04快捷键控制笔记本触摸板的开启与关闭
  9. 中英互译软件工程初步设计
  10. routeros php插件,RouterOS的Webfig的使用方法