当前位置: 首页 > 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;具有更高的性能和更…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...