PCL学习之滤波算法

news2024/10/7 18:20:12

前言

点云滤波作为常见的点云处理算法,一般是点云处理的第一步,对后续处理有很重要作用。滤波 有很多方面也有很多种功能,比如去除噪声点、离群点、点云平滑以及空洞、数据压缩等

原始点云数据往往包含大量散列点、孤立点,在获取点云数据时,由于设备精度,操作者经验环 境因素带来的影响,以及电磁波的衍射性,被测物体表面性质变化和数据拼接配准操作过程的影
响,点云数据中讲不可避免的出现一些噪声,而且采样的分辨率也不同

(1)直通滤波器

直通滤波器就是根据点云的属性在点的属性上设置范围,对点进行滤波,保留范围内的 或保留范围外的。
(1)指定一个维度以及该维度下的值域
(2)遍历点云中的每个点,判断该点在指定维度上的取值 是否在值域内,删除取值不在值域内的点
(3)遍历结束,留下的点即构成滤波后的点云。

#include <pcl/filters/passthrough.h>
 // 原点云获取后进行滤波 
pcl::PassThrough<pcl::PointXYZ> pass;// 创建滤波器对象 
pass.setInputCloud (cloud);//设置输入点云 
pass.setFilterFieldName ("z");//滤波字段名被设置为Z轴方向 
pass.setFilterLimits (0.0, 1.0);//可接受的范围为(0.01.0//pass.setFilterLimitsNegative (true);//设置保留范围内 还是 过滤掉范围内
pass.filter (*cloud_filtered); //执行滤波,保存过滤结果在cloud_filtered

(2)体素滤波器(下采样)

体素滤波器可以达到向下采样同时不破坏点云本身几何结构的功能,但是会移动点的位置。 此外体素滤波器可以去除一定程度的噪音点及离群点。主要功能是用来进行降采样。
(1)它的原理是根据输入的点云,首先计算一个能够刚好包裹住该点云的立方体,然后根据设定的分辨率,将该大 立方体分割成不同的小立方体。对于每一个小立方体内的点,计算他们的质心,并用该质心的坐标来近似该立方体 内的若干点。
(2)ApproximateVoxelGrid的不同在于这种方法是利用每一个小立方体的中心来近似该立方体内的若干点。相比于
VoxelGrid,计算速度稍快,但也损失了原始点云局部形态的精细度。

#include <pcl/filters/voxel_grid.h> // VoxelGrid 
pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
sor.setInputCloud (cloud); 
sor.setLeafSize (0.01f, 0.01f, 0.01f); 
sor.filter (*cloud_filtered);
// Approximate 体素格滤波器 pcl::ApproximateVoxelGrid<pcl::PointXYZ> approximate_voxel_filter;
approximate_voxel_filter.setLeafSize (0.2, 0.2, 0.2); 
approximate_voxel_filter.setInputCloud (input_cloud);
approximate_voxel_filter.filter (*filtered_cloud);

(3)均匀采样滤波器(下采样)

均匀采样滤波基本上等同于体素滤波器,但是其不改变点的位置。下采样后,其点云分布基本 均匀,但是其点云的准确度要好于体素滤波,因为没有移动点的位置。
均匀采样算法:均匀采样通过构建指定半径的球体对点云进行下采样滤波,将每一个球内距离球体中心最
近的点作为下采样之后的点输出。

#include <pcl/keypoints/uniform_sampling.h> // Uniform sampling 
object. pcl::UniformSampling<pcl::PointXYZ> filter; 
filter.setInputCloud(cloud);
filter.setRadiusSearch(0.01f); 
// We need an additional object to store the indices of surviving 
points. pcl::PointCloud<int> keypointIndices;
filter.compute(keypointIndices);

(4)统计滤波器(去噪)

#include <pcl/filters/statistical_outlier_removal.h> 
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; 
sor.setInputCloud (cloud); 
sor.setMeanK (50); //设置考虑查询点临近点数 
sor.setStddevMulThresh (1.0);//设置判断是否为离群点的阀值 
sor.filter (*cloud_filtered);
// 然后,使用同样的参数再次调用该滤波器,但是利用函数setNegative设 置使输出取外点,以获取离群点数据(也就是原本滤除掉的点)。 
sor.setNegative (true);
sor.filter (*cloud_filtered);

(5)统计滤波

条件滤波器通过设定滤波条件进行滤波,删除不符合用户指定的一个或者多个条件 直通滤波器是一种较简单的条件滤波器。

#include <pcl/filters/conditional_removal.h> 
pcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond (new pcl::ConditionAnd<pcl::PointXYZ> ()); //创建条件定义对象 //添加在Z字段上大于0的比较算子 
range_cond>addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new pcl::FieldComparison <pcl::PointXYZ> ("z", pcl::ComparisonOps::GT, 0.0))); //添加在Z字段上小于0.8的比较算子 
range_cond>addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new pcl::FieldComparison <pcl::PointXYZ> ("z", pcl::ComparisonOps::LT, 0.8))); // 创建滤波器并用条件定义对象初始化 
pcl::ConditionalRemoval<pcl::PointXYZ> condrem; 
condrem.setCondition (range_cond); 
condrem.setInputCloud (cloud); 
condrem.setKeepOrganized(true); //设置保持点云的结构
condrem.filter (*cloud_filtered); // 执行滤波

(6)半径滤波(去噪)

半径滤波器以某点为中心画一个圆计算落在该圆中点的数量,当数量大于给定值时,则保留该 点,数量小于给定值则剔除该点。
主要还是用于去除离群点,在一定程度上可以用来筛选边缘点。

#include <pcl/filters/radius_outlier_removal.h> pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem; 
outrem.setInputCloud(cloud);
outrem.setRadiusSearch(0.8);//设置半径为0.8的范围内找临 *点
outrem.setMinNeighborsInRadius (2);//设置查询点的邻域点 集数小于2的删除 
outrem.filter (*cloud_filtered); //在半径为0.8 在此半径内必须要有两个邻居点,此点才会保存

(7)投影滤波

将点投影到一个参数化模型上,这个参数化模型可以是平面、圆球、圆柱、锥形等进行投影滤波。 把三维点云投影到二维图像上,然后用图像处理的方法进行处理。

// 填充ModelCoefficients的值,使用ax+by+cz+d=0平面模型,其中 a=b=d=0,c=1 也就是X——Y平面 //定义模型系数对象,并填充对应的数据 
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients()); coefficients->values.resize(4); 
coefficients->values[0] = coefficients->values[1] = 0; 
coefficients->values[2] = 1.0; coefficients->values[3] = 0;
// 创建ProjectInliers对象,使用ModelCoefficients作为投影对象的模型参数 
pcl::ProjectInliers<pcl::PointXYZ> proj;
//创建投影滤波对象
proj.setModelType(pcl::SACMODEL_PLANE);
proj.setInputCloud(cloud);
proj.setModelCoefficients(coefficients);
proj.filter(*cloud_projected);
//设置对象对应的投影模型 //设置输入点云
//设置模型对应的系数
//投影结果存储

(8)模型滤波

根据点到模型的距离,设置距离阈值过滤非模型点, 基于模型的点分割操作,将模型外的点从点云中剔除

//x^2 + y^2 + z^2 = 1 
pcl::ModelCoefficients sphere_coeff; 
sphere_coeff.values.resize (4); sphere_coeff.values[0] = 0;
sphere_coeff.values[1] = 0; 
sphere_coeff.values[2] = 0; 
sphere_coeff.values[3] = 1;
pcl::ModelOutlierRemoval<pcl::PointXYZ> sphere_filter;
sphere_filter.setModelCoefficients (sphere_coeff);
sphere_filter.setThreshold (0.05); 
sphere_filter.setModelType (pcl::SACMODEL_SPHERE); 
sphere_filter.setInputCloud (cloud);
sphere_filter.filter (*cloud_sphere_filtered);

(9)高斯滤波(去噪、平滑)

GaussianKernel是基于高斯核的卷积滤波实现,高斯过滤器相当于一个具有平滑性能的低通滤波器, 通过该类处理后的点云,相对比较平滑

pcl::filters::Convolution<pcl::PointXYZRGB , pcl::PointXYZRGB> convolution; 
Eigen::ArrayXf gaussian_kernel(5); gaussian_kernel << 1.f/16, 1.f/4, 3.f/8, 1 .f/4, 1.f/16; 
convolution.setBordersPolicy(pcl::filters: :Convolution<pcl::PointXYZRGB, pcl::PointX YZRGB>::BORDERS_POLICY_IGNORE); 
convolution.setDistanceThreshold (static_c ast<float> (0.1)); 
convolution.setInputCloud (inputCloud); 
convolution.setKernel (gaussian_kernel);
convolution.convolve(*cloud);

在这里插入图片描述

(10)双边滤波(平滑)

双边滤波是一种非线性滤波器,它可以达到保持边缘、降噪平滑的效果。一定程度上拟补了高斯滤波的缺点。 双边滤波对高斯噪声效果比较好。
在这里插入图片描述

(11)形态学滤波

主要为了有效的分割出地平面的点云
在这里插入图片描述

(12)渐进三角网加密滤波(PTD)

在这里插入图片描述

(13)布料滤波

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/539283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CS 224N总结

CS 224N网址&#xff1a;Stanford CS 224N | Natural Language Processing with Deep Learning Lecture1 PPT网址&#xff1a;PowerPoint Presentation (stanford.edu) 这一讲主要讲了NLP研究的对象&#xff0c;我们如何表示单词的含义&#xff0c;以及Word2Vec方法的基本原…

Ubuntu22 k8s 1.27.1 安装及集群搭建教学(2023.5.16 k8s 最新版本教学,只看这一篇就够了哦!保姆级教程!不行你来找我!)

Ubuntu22 k8s 1.27.1 安装及集群搭建教学&#xff08;2023.5.16 k8s 最新版&#xff0c;只看这一篇就够了哦&#xff01;保姆级教程&#xff01;&#xff01;不行你来找我&#xff01;&#xff09; 温馨提示请仔细阅读&#xff1a;❤️❤️❤️❤️❤️❤️❤️❤️ 1. 由于新版…

Linux系统学习须牢记这几点

工欲善其事须先利其器&#xff0c;想了解Linux技术&#xff0c;先要有一套教学平台,请教同行或者老师来为我们解答&#xff0c;当然也可以下载Cygwin进行学习。但是自主学习的这一过程很困难&#xff0c;因为没有别人的帮助&#xff0c;我们或许会感到迷茫&#xff0c;也会出现…

Spring整合Mybatis、Junit

文章目录 1 Spring整合Mybatis思路分析1.1 环境准备步骤1:准备数据库表步骤2:创建项目导入jar包步骤3:根据表创建模型类步骤4:创建Dao接口步骤5:创建Service接口和实现类步骤6:添加jdbc.properties文件步骤7:添加Mybatis核心配置文件步骤8:编写应用程序步骤9:运行程序 1.2 整合…

STM32F1定时器(TIM1~TIM8)

一、stm32f1定时器简介 1.1、定时器分类 STM32共11个定时器&#xff0c;2个高级控制定时器TIM1和TIM8&#xff0c;4个通用定时器TIM2~TIM5&#xff0c;两个基本定时器TIM6和TIM7&#xff0c;两个看门狗定时器和一个系统滴答定时器Systick. 高级定时器TIM1和TIM8的时钟由APB1产…

想改进婴儿fNIRS数据分析?基于这些先进方法的评估值得一看!

导读 在过去的十年中&#xff0c;fNIRS提供了一种非侵入性的方法来研究发展人群的神经激活。尽管fNIRS在发展认知神经科学中的应用越来越多&#xff0c;但在如何预处理和分析婴儿fNIRS数据方面却缺乏一致性或共识。本研究考察了对婴儿fNIRS数据应用更高级统计分析的可行性&…

智聚北京!相约全球人力资源数智化峰会

人力资源是推动经济社会发展的第一资源。作为我国经济压舱石的中央企业在对标世界一流企业和管理提升方面的持续创新&#xff0c;各行业领军企业围绕组织变革、管理升级、全球化发展走深走实。人力资源管理正从传统职能管理与管控&#xff0c;向紧贴业务战略实现、组织边界和人…

阿里巴巴-1688-退款退货明细下载(导出)

DUMUZ是什么&#xff1f; Dumuz是一款软件产品&#xff0c;可模拟人在电脑上的不同系统之间操作行为&#xff0c; 替代人在电脑前执行具有规律与重复性高的办公流程。 目前基于实际业务场景在软件搭建了模拟实现天猫/淘宝批量订单发货、备注插旗、页面商品数据采集、已买宝贝订…

小米AI实验室多模态图片翻译论文入选自然语言处理领域顶级会议ACL 2023

近日&#xff0c;ACL 2023的论文录用结果公布&#xff0c;小米AI实验室机器翻译团队联合厦门大学苏劲松教授团队在多模态图片翻译方向的最新研究成果已被ACL 2023主会录用&#xff0c;标志着小米在多模态机器翻译方向取得了重要进展。 ACL&#xff08;Annual Meeting of the As…

单片机--实战练习

目录 【1】GPIO 1.定义 2.应用 I - Input - 输入采集 O - Output - 输出控制 ​编辑​编辑 3.GPIO结构框图 4.功能描述 输入功能 输出功能 5.相关寄存器 【2】点亮一盏LED灯 1.实验步骤 2.编程实现 3.编译下载 4.复位上电 练习&#xff1a;实现LED灯闪烁…

Cocos Shader 转场特效合集!卡牌必备,免费开源!

接前两期&#xff0c;孙二喵的 AIGC 卡牌接近尾声了&#xff01;链接&#xff1a; AIGC 制作卡牌1AIGC 制作卡牌2 最近&#xff0c;二喵遇到一个很头疼的问题&#xff01;就是如何实现既流畅、又生动的转场特效。 经过一番大战之后&#xff0c;我实验了多个效果&#xff0c;一共…

记录--vue3优雅的使用element-plus的dialog

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 如何优雅的基于 element-plus,封装一个梦中情 dialog 优点 摆脱繁琐的 visible 的命名&#xff0c;以及反复的重复 dom。 想法 将 dialog 封装成一个函数就能唤起的组件。如下&#xff1a; addDialog(…

Python每日一练(20230518) 螺旋矩阵 I\II\III\IV Spiral Matrix

目录 1. 螺旋矩阵 I Spiral Matrix i &#x1f31f;&#x1f31f; 2. 螺旋矩阵 II Spiral Matrix ii &#x1f31f;&#x1f31f; 3. 螺旋矩阵 III Spiral Matrix iii &#x1f31f;&#x1f31f; 4. 螺旋矩阵 IV Spiral Matrix iv &#x1f31f;&#x1f31f; &#…

探索Vue的组件世界-组件通信

目录 组件跨层级访问 访问外层组件 定向消息 ref&#xff08;父组件访问子组件&#xff09; 依赖注入 依赖注入&#xff0c;vue2.0实现源码 组件封装 组件二次封装 小结 组件跨层级访问 访问外层组件 // 获取 根组件 的数据 this.$root.pri;// 写入 根组件 的数据 t…

人机融合智能的测量、计算与评价

老子在《道德经》第二十一章写道:"道之为物,惟恍惟惚。惚兮恍兮,其中有象;恍兮惚兮,其中有物。窈兮冥兮,其中有精;其精甚真,其中有信。"&#xff08;“道”这个东西&#xff0c;没有清楚的固定实体。它是那样的恍恍惚惚啊&#xff0c;其中却有形象。它是那样的恍恍惚…

怎样才能做好企业内部wiki知识库呢?

企业内部wiki知识库是一种常用的知识管理方式。通过建立企业内部wiki知识库&#xff0c;企业可以更好的管理和共享知识&#xff0c;提高员工的工作效率和生产力。 详解如何做好企业内部wiki知识库的方法&#xff1a; 一、设计知识库架构 企业内部wiki知识库的架构设计是非常…

抖音seo源码优化/企业号搜索排名/开源搭建

什么是抖音seo&#xff1f; 抖音SEO是指通过提高在抖音平台的关键词排名&#xff0c;来获取流量、获取客户的目的。抖音的流量主要分为付费流量、推荐流量和搜索流量&#xff0c;其中搜索流量因为付费太贵、上热门太累而成为另一种进入方式1。抖音拥有庞大的用户基数&#xff…

shell命令以及运行原理,命令行解释器/bash,Linux Kernel与Shell简单理解等

引入 输入指令的过程本质上就是在输入一个字符串&#xff0c;然后指令的本质就是编译好的程序.exe与脚本。它们都是在系统的特定路径之下放着呢。然后我们所有指令最终都是要到操作系统内部去运行的&#xff0c;也就是说各种各样的指令都需要操作系统的参与。我们有各种各样的…

WordPress 如何开启多站点 含Apache和Nginx伪静态规则

WordPress 3.0以上的版本支持直接开启多站点模式,这样一来,你可以在一个后台切换多个站点进行管理。 最近打算折腾一个主题演示站,给每个主题使用独立的子站点来搭建演示,如果是Apache环境,配置就比较容易,但是倡萌使用的是 Nginx,花了大量的时间测试了N多网络上的伪静…

什么是无头浏览器?如何使用Golang实现无头浏览器截图?

前言 在Web开发中&#xff0c;有时需要对网页进行截图&#xff0c;以便进行页面预览、测试等操作。 而使用无头浏览器来实现截图功能&#xff0c;可以避免手动操作的繁琐和不稳定性。 这篇文章将介绍&#xff1a;使用Golang进行无头浏览器的截图&#xff0c;轻松实现页面预览…