当前位置: 首页 > news >正文

PCL学习之滤波算法

前言

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

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

(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)布料滤波

在这里插入图片描述

相关文章:

PCL学习之滤波算法

前言 点云滤波作为常见的点云处理算法&#xff0c;一般是点云处理的第一步&#xff0c;对后续处理有很重要作用。滤波 有很多方面也有很多种功能&#xff0c;比如去除噪声点、离群点、点云平滑以及空洞、数据压缩等 原始点云数据往往包含大量散列点、孤立点&#xff0c;在获取…...

第二章 链表

目录 一、移除链表元素二、设计链表三、反转链表四、两两交换链表中的节点五、删除链表倒数第N个节点六、链表相交七、环形链表Ⅱ 一、移除链表元素 Leetcode 203 class Solution { public:ListNode* removeElements(ListNode* head, int val) {ListNode* dummyHead new Lis…...

Spring Security OAuth2实现单点登录:简化多个系统之间的登录流程

Spring Security OAuth2实现单点登录&#xff1a;简化多个系统之间的登录流程 一、介绍OAuth21. OAuth2的定义和作用2. OAuth2的优点和使用场景 二、Spring Security1. Spring Security的介绍2. Spring Security的特点和优势 三、OAuth2与Spring Security的结合1. OAuth2在Spri…...

语义分析器

语义分析器&#xff08;Semantic Analyzer&#xff09;是编译器中的一个重要组成部分&#xff0c;它负责对源代码进行语义分析&#xff0c;检查源代码是否符合语义规范&#xff0c;并进行错误处理和类型推导等操作。 举个例子&#xff0c;假设有以下的源代码&#xff1a; int…...

爬虫基本原理

爬虫基本原理 1.1获取网页1.1.1提取信息1.1.2保存数据 1.2请求1.2.1 请求方法1.2.2 请求网址1.2.3 请求头1.2.4请求体1.3响应 1.1获取网页 爬虫首先要做的工作就是获取网页&#xff0c;这里就是获取网页的源代码。源代码里包含了网页的部分有用信息&#xff0c;所以只要把源代…...

常见电子元器件和电路

目录 常见电子元器件一览表(字母标志)NTC(负温度系数热敏电阻)压敏电阻X2电容(抑制电源电磁干扰用电容器)泄放电阻共模电压共模电感整流桥滤波电容RCD吸收二极管Y电容整流器的原理输出整流肖特基二极管 功率晶体管&#xff08;GTR&#xff0c;三极管)双极型晶体管(BJT&#xff…...

English Learning - L3 Lesson1 VOA-Color 译文

听碎 VOA NOW, THE VOA SPECIAL ENGLISH PROGRAM WORDS AND THEIR STORIES Every people has its own way of saying things, its own special expressions. Many everyday American expressions are based on colors. 各国人民都有自己说话的方式&#xff0c;有自己独特的表…...

如何在linux中配置JDK环境变量

在linux系统部署皕杰报表&#xff0c;因皕杰报表是一款纯java报表工具&#xff0c;运行时需要jre环境&#xff0c;所以要在服务器上配置三个jdk环境变量path、classpath、JAVA_HOME。 那么为什么要配置jdk环境变量呢&#xff1f;因为java软件运行时要用到一些java命令&#xff…...

横截面收益率(二) 阿尔法策略是如何构建的

资本资产定价模型自从首次被提出以来在金融经济学中一直处于中心地位。 在一系列简化假定条件下&#xff0c;资本资产定价模型表明&#xff0c;任何证券的收益率与该证券 的系统性风险&#xff08;或者贝塔值&#xff09;呈线性关系。因此&#xff0c;依据资本资产定价模型横截…...

【ConfluxNews】2023.5.15 警惕任何未经合约审计的项目

1.【网络状态】当前版本V2.2.3&#xff0c;全网算力≈8T&#xff0c;昨日交易次数20K&#xff0c;昨日新增账户0.17K&#xff0c;昨日新增合约0个&#xff1b; 2.【POS参数】总锁仓275M&#xff0c;节点总数284&#xff0c;年利率13.7%&#xff08;理论计算&#xff09;&#x…...

MySQL学习---17、MySQL8其它新特性

1、MySQL新增特性 1.1 更简便的NoSQL支持 NoSQL泛指非关系型数据库和数据存储。随着互联网平台的规模飞速发展&#xff0c;传统的关系型数据库已经越来越不能瞒住需求。从5.6版本开始&#xff0c;MySQL就开始支持简单的NoSQL存储功能。MySQL 8对这一功能做了优化&#xff0c;…...

快速入门matlab——变量练习

学习目标&#xff1a;1.掌握matlab编程中最常用的几种变量类型 2.对变量类型的属性有所熟悉&#xff0c;不要求记忆&#xff0c;知道了解即可 3.要求熟练运用这几种变量类型创建自己的变量 clear all; % 清除Workspace中的所有…...

c++ 11标准模板(STL) std::set(三)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…...

ChatGPT详细介绍

ChatGPT: 自然语言处理的强大工具 ChatGPT是一种基于人工智能的自然语言处理模型&#xff0c;它是由OpenAI开发的一款先进的语言模型。ChatGPT基于GPT-3.5架构&#xff0c;具有强大的语言生成和理解能力。它被设计用于与人类进行自然对话&#xff0c;并提供广泛的应用场景。 …...

【算法】【算法杂谈】让[0,x)区间上的出现概率变为x^k

目录 前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本 思考感悟写在最后 前言 当前所有算法都使用测试用例运行过&#xff0c;但是不保证100%的测试用例&#xff0c;如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识&#xff01; 问题介…...

【2023华为OD笔试必会25题--C语言版】《21 对称美学》——字符串、递归

本专栏收录了华为OD 2022 Q4和2023Q1笔试题目,100分类别中的出现频率最高(至少出现100次)的25道,每篇文章包括原始题目 和 我亲自编写并在Visual Studio中运行成功的C语言代码。 仅供参考、启发使用,切不可照搬、照抄,查重倒是可以过,但后面的技术面试还是会暴露的。✨✨…...

为减少来自环境使用的无线传感器网络的传输次数而开发的方法(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 随着无线传感器网络(Wireless Sensor Network,WSN)的广泛应用,业界开始应用环境能量收集技术解决传感器节点的能量补充问题。而…...

springboot+vue滴答拍摄影项目(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的滴答拍摄影项目。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌…...

SQL基础培训13-索引和优化

进度13-索引和优化-SQL基础培训 知识点: 你可以把索引理解为一种特殊的目录。索引分聚集索引(clustered index,也称聚类索引、簇集索引) 和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。 1、聚集索引 以汉语字典举例,汉语字典有部首目录和检字表,还…...

拥抱5G发展机遇,从边缘计算上车

随着5G技术的逐渐普及和应用&#xff0c;边缘计算成为了当前信息技术领域的热门话题。边缘计算是指将计算和数据存储移动到网络的边缘&#xff0c;即源站以外的网络设备。与云计算相比&#xff0c;边缘计算更加贴近数据生成和处理的实时应用场景&#xff0c;具有更高的性能和更…...

小白程序员入门网络安全:收藏版,从零开始学密码学

小白程序员入门网络安全&#xff1a;收藏版&#xff0c;从零开始学密码学 本文带领读者进入网络安全的世界&#xff0c;从密码学的发展历史、古典密码、分组密码、流密码、杂凑函数到公钥密码&#xff0c;全面介绍了密码学的基础知识和应用。文章涵盖了凯撒密码、维吉尼亚密码…...

别再为UniApp和WebView通信发愁了!一个真实项目中的消息传递实战(附完整SDK配置流程)

UniApp与WebView通信实战&#xff1a;从原理到避坑指南 在混合应用开发领域&#xff0c;UniApp与WebView的通信问题一直是开发者面临的常见挑战。想象这样一个场景&#xff1a;你的教育类App中嵌入了H5活动页面&#xff0c;当用户完成模考后需要跳转到成绩分析页&#xff0c;或…...

英雄联盟终极助手:如何用League Akari工具包提升游戏体验

英雄联盟终极助手&#xff1a;如何用League Akari工具包提升游戏体验 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是一款基于L…...

Phi-4-mini-reasoning推理效果展示:复杂数学题求解与逻辑链生成案例集

Phi-4-mini-reasoning推理效果展示&#xff1a;复杂数学题求解与逻辑链生成案例集 1. 模型核心能力概览 Phi-4-mini-reasoning是一款专注于数学推理和逻辑链生成的轻量级开源模型。这个模型最大的特点是能够处理复杂的数学问题&#xff0c;并给出详细的推理步骤。它支持长达1…...

ARM64缓存一致性实战:手把手教你理解PoC和PoU,搞定DMA与JIT编译器的坑

ARM64缓存一致性实战&#xff1a;深入理解PoC与PoU的工程实践 在底层系统开发领域&#xff0c;缓存一致性始终是工程师们面临的核心挑战之一。特别是在ARM64架构下&#xff0c;PoC&#xff08;Point of Coherency&#xff09;和PoU&#xff08;Point of Unification&#xff09…...

Java SPI实战:从零实现一个可插拔的日志框架(附完整代码)

Java SPI实战&#xff1a;构建可插拔日志框架的深度探索 在当今快速迭代的软件开发领域&#xff0c;模块化和可扩展性已成为架构设计的核心诉求。想象一下这样的场景&#xff1a;你的应用需要同时支持控制台日志、文件日志和网络日志&#xff0c;但又不希望将具体实现硬编码在…...

Intv_AI_MK11智能运维(AIOps)实战:日志分析与故障预测

Intv_AI_MK11智能运维&#xff08;AIOps&#xff09;实战&#xff1a;日志分析与故障预测 1. 运维场景痛点分析 凌晨3点&#xff0c;某电商平台的服务器突然出现异常流量激增。值班运维工程师小张面对海量日志束手无策&#xff0c;等他终于定位到是某个微服务接口出现死循环时…...

biliTickerBuy:漫展抢票不再靠运气,Python技术让成功率翻倍

biliTickerBuy&#xff1a;漫展抢票不再靠运气&#xff0c;Python技术让成功率翻倍 【免费下载链接】biliTickerBuy b站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy 还在为抢不到心仪的动漫展门票而烦恼吗&#xff1f;面对秒光…...

电脑录屏软件功能全解析,从Win自带到专业级,一篇看懂

电脑录屏软件有哪些&#xff1f;无论你是学生、职场人士还是内容创作者&#xff0c;都可能需要用到电脑录屏软件。但录屏工具的选择太多了&#xff0c;从系统自带的工具到专业级软件&#xff0c;功能和操作方面都有很大差异。本文会从以下几个角度帮你理清思路&#xff1a;电脑…...

代码分割实践

代码分割实践&#xff1a;提升前端性能的利器 在现代前端开发中&#xff0c;应用体积的膨胀导致加载时间变长&#xff0c;用户体验下降。代码分割&#xff08;Code Splitting&#xff09;通过将代码拆分为多个小块&#xff0c;按需加载&#xff0c;显著优化性能。无论是单页应…...