OK,本篇作为PCL学习笔记,希望同道之人互相交流、讨论!有误之处希望指出,欢迎留言

PCL库中包含几个重要的模块库:FIilter(过滤器)、Features(特征)、Keypoints(关键点)、Registration(配准)、Kd-treeOctree(八叉树)、Segementation(分割)、Sample consensus(样本一致性)、Surface(表面)、Range image(深度图)、I/O(输入输出)、Visualization(可视化)、Common(公共)、Search(搜索)

Filter模块库:去除点云中不需要的点和点云的投影。

下面用不同方法对点云进行滤波处理:

目录

  1. Passthrough Filter(直通滤波):
  2. VoxelGrid Filter(体素化网格滤波):
  3. StatisticalOutlierRemoval(统计学的(稀疏)离群点去除):
  4. Projecting points using a parameter model(投影滤波):
  5. Extracting indices from a PointCloud(点云索引提取点云子集):
  6. RadiusOutlierRemoval或ConditionalRemoval滤波器:

1.Passthrough Filter(直通滤波):限定某个字段(理解为点云的变量参数)的范围来达到去除异常点效果关键:

步骤:输入点云-创建滤波器对象-设置字段范围-保存滤波后点云

头文件:#include<pcl/filters/passthrough.h>代码:pcl::PassThrough<pcl::PointXYZ>pass;//创建滤波器对象pass.setInputCloud(cloud);          //调用成员函数输入点云,cloud为已创建的点云对象pass.setFilterFieldName("z");       //调用设置字符串函数,z为设定字段对应字符串pass.setFilterLimits(0,2.0);        //调用范围设置函数,z的范围在0-2pass.filter(*cloud_filtered);      //执行直通过滤,并将执行结果被保存在cloud_filtered

 完整代码(直通滤波):

#include <iostream>
#include <ctime>
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>int main(int argc, char** argv)
{srand(time(0));//创建点云pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);//填入点云数据cloud->width = 5;cloud->height = 1;cloud->points.resize(cloud->width * cloud->height);for (size_t i = 0; i < cloud->points.size(); ++i){cloud->points[i].x = rand() / (RAND_MAX + 1.0f) - 0.5;cloud->points[i].y = rand() / (RAND_MAX + 1.0f) - 0.5;cloud->points[i].z = rand() / (RAND_MAX + 1.0f) - 0.5;}std::cerr << "Cloud before filtering: " << std::endl;for (const auto& point : *cloud)std::cerr << "    " << point.x << " "<< point.y << " "<< point.z << std::endl;//直通滤波----pcl::PassThrough<pcl::PointXYZ> pass;pass.setInputCloud(cloud);pass.setFilterFieldName("z");pass.setFilterLimits(0,1.0);pass.filter(*cloud_filtered);//滤波结束,结果保存在cloud_filteredstd::cerr << "Cloud after filtering: " << std::endl;for (const auto& point : *cloud_filtered)std::cerr << "    " << point.x << " "<< point.y << " "<< point.z << std::endl;return (0);
}

执行结果

Cloud before filtering:-0.0164185 -0.177155 0.0244751-0.194244 0.169983 -0.1470950.277649 -0.317963 -0.364410.166901 0.220856 0.144196-0.467896 0.15387 -0.345825
Cloud after filtering:-0.0164185 -0.177155 0.02447510.166901 0.220856 0.144196

2.VoxelGrid Filter(体素化网格滤波):创建一个3D体素网格,每个体素中所有点将由质心来代替,将体素想象为立方体。

步骤:输入点云-创建滤波器对象-设置立方体大小-保存滤波后点云-可视化

头文件:#include <pcl/filters/voxel_grid.h>代码:#include <pcl/io/pcd_io.h>
#include <pcl/io/io.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/visualization/cloud_viewer.h>
#include <boost/thread/thread.hpp>
#include <pcl/point_cloud.h>
#include<iostream>
#include <pcl/features/normal_3d.h>
using namespace std;
typedef pcl::PointXYZ PointT;int main(int argc, char** argv)
{pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);           //待滤波点云///读入点云数据cout << "->正在读入点云..." << endl;/*pcl::io::loadPCDFile("rabbit.pcd", *cloud);*/pcl::PCDReader reader;reader.read("E:\\PCLNotes\\practice\\rabbit.pcd", *cloud);cout << "\t\t<读入点云信息>\n" << *cloud << endl;pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);  //滤波后点云///体素滤波器点云下采样cout << "->正在体素下采样..." << endl;pcl::VoxelGrid<pcl::PointXYZ> vg;     //创建滤波器对象vg.setInputCloud(cloud);               //设置待滤波点云vg.setLeafSize(1.15f, 1.15f, 1.15f);   //设置体素大小vg.filter(*cloud_filtered);         //执行滤波,保存滤波结果于cloud_filtered///保存下采样点云cout << "->正在保存下采样点云..." << endl;pcl::PCDWriter writer;writer.write("sub.pcd", *cloud_filtered, true);cout << "\t\t<保存点云信息>\n" << *cloud_filtered << endl;/*return 0;}*///================================= 滤波前后对比可视化 ================================= /*pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("滤波前后对比"));*/boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->initCameraParameters();//初始化相机参数/*-----视口1-----*/int v1(0);viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1); //设置第一个视口在X轴、Y轴的最小值、最大值,取值在0-1之间viewer->setBackgroundColor(0, 0, 0, v1); //设置背景颜色,0-1,默认黑色(0,0,0)viewer->addText("befor_filtered", 10, 10, "v1_text", v1);viewer->addPointCloud<pcl::PointXYZ>(cloud, "befor_filtered_cloud", v1);/*-----视口2-----*/int v2(0);viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);viewer->setBackgroundColor(0.3, 0.3, 0.3, v2);viewer->addText("after_filtered", 10, 10, "v2_text", v2);viewer->addPointCloud<pcl::PointXYZ>(cloud_filtered, "after_filtered_cloud", v2);/*-----设置相关属性-----*/viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "befor_filtered_cloud", v1);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0, 0, "befor_filtered_cloud", v1);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "after_filtered_cloud", v2);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 1, 0, "after_filtered_cloud", v2);while (!viewer->wasStopped()){viewer->spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));}return 0;
}

执行结果:

问题:

解决方法:https://blog.csdn.net/huhu7777/article/details/125358022

PCL点云数据处理-滤波基础(C++)相关推荐

  1. PCL点云数据 滤波降噪

    图像处理]PCL点云数据的滤波降噪的方法 这个带公式: https://blog.csdn.net/qq_30815237/article/details/86294496 为什么进行点云滤波处理: ...

  2. PCL:StatisticalOutlierRemoval 统计滤波

    文章目录 1 原理 2 代码实现 3 结果展示 1 原理 对每一点的邻域进行统计分析,基于点到所有邻近点的距离分布特征,过滤掉一些不满足要求的离群点.该算法对整个输入进行 两次迭代: 在第一次迭代中, ...

  3. 稠密的无人机激光雷达点云数据处理与分析方法与工具科普系列(六)

    ** 06 稠密点云之"喜" 内容摘要:目前,无人机LiDAR硬件系统已经达到了操作简便.价格亲民.数据质量好.平民化的可持续发展阶段,但是无人机LiDAR点云数据处理仍然面临人才 ...

  4. python数据处理高斯滤波_十大点云数据处理技术梳理

    研究点云数据时,感觉无从下手? 看看这十大点云数据处理技术,换个思路学点云. 点云 · 定义 简言之,在获取物体表面每个采样点的空间坐标后,得到的是一个点的集合,称之为"点云".包 ...

  5. 爆肝5万字❤️Open3D 点云数据处理基础(Python版)

    Open3D 点云数据处理基础(Python版) 文章目录 1 概述 2 安装 2.1 PyCharm 与 Python 安装 2.3 Anaconda 安装 2.4 Open3D 0.13.0 安装 ...

  6. PCL入门系列 —— StatisticalOutlierRemoval 点云统计滤波

    PCL入门系列 -- StatisticalOutlierRemoval 点云统计滤波 前言 程序说明 输出结果 代码示例 总结 前言 随着工业自动化.智能化的不断推进,机器视觉(2D/3D)在工业领 ...

  7. 点云数据滤波处理(PCL实现)

    引: ​​​​​​点云数据滤波处理(PCL实现) - 简书 2020.01.03 14:29:02字数 942阅读 5,412 点云数据滤波处理(PCL实现) 1.滤波器介绍 点云目标识别的流程:数据 ...

  8. PCL点云处理之体素滤波(八十七)

    PCL点云处理之体素滤波(八十七) 前言 一.概述 二.算法实现 1.代码 2.代码解读 结果 前言 数据的海量性始终是点云处理时需要面临的一个大问题,严重的时间消耗和内存占用影响了点云处理的发展,当 ...

  9. PCL点云处理之凸包滤波(十三)

    PCL点云处理之凸包滤波 功能 结果展示 代码示例 功能 第一步:待提取凸包的点云1,利用凸包算法提取凸包点2 第二步:利用凸包点2从原始点云3中提取到凸包内部的点云4 结果展示 待提取凸包的点云1 ...

  10. PCL点云库学习笔记 点云的欧式聚类

    欧式聚类详解(点云数据处理) 欧式聚类是一种基于欧氏距离度量的聚类算法.基于KD-Tree的近邻查询算法是加速欧式聚类算法的重要预处理方法. KD-Tree最近邻搜索 Kd-树是K-dimension ...

最新文章

  1. Java项目:零食商城系统(java+SSM+jsp+MySQL+EasyUI)
  2. java 之 学习过程中遇到的大佬博客
  3. 查看 php-cgi 进程数
  4. gui linux 桌面应用,吃掉Linux开发者,WSL支持GUI应用
  5. HDU 1285 - 确定比赛名次(拓扑排序)
  6. 【Qt】Qt中QJsonParseError类
  7. Oracle自动性能统计
  8. python图层合并_Ps算法Python实现:图层混合模式-色相
  9. javaFx--TableView、combobox的注意事项
  10. win10系统做游戏服务器吗,win10架构游戏服务器
  11. java实验常见错误_java 实验4 异常
  12. 苹果智能音箱HomePod跳票了,上市日期推迟到明年
  13. 智乃的数据库(STL+小技巧)
  14. 文本主题模型之LDA(二) LDA求解之Gibbs采样算法
  15. android 带边框的arc,极细边框(1px边框)实现方式
  16. 加权最小二乘法matlab,加权最小二乘法matlab
  17. js中的this指向问题
  18. 微信公众平台深度开发JAVA版
  19. python数据挖掘入门与实践-第一章-用最简单OneR算法对Iris植物分类
  20. MySQL 基础 -- MySQL 数据类型说明(数值类型、字符串类型、日期时间类型)、SQL通用语法和SQL分类

热门文章

  1. 宝塔linux怎么运行war,宝塔Linux面板在线解压WAR压缩文件
  2. java 阿拉伯数字日期转换为中文大写日期方法_日期转换为中文大写数字
  3. 分形理论的Hausdorff维数
  4. c600 raid linux,华硕Z9PA-D8 (-C600 INTEL RAID)主板驱动3.8.0.1108版下载,适用于Win8-64,win7,Win7-64,winxp-驱动精灵...
  5. 云豹直播系统源码搭建部署教程
  6. 使用python根据图片链接下载图片
  7. 制作地图的那些事(二)——制图之符号制作
  8. html5手机页面工具,Html5技术变革下的H5页面制作工具和手机app开发工具
  9. ajax下载表格文件
  10. redis的基本命令