Matlab和PCL中的点云滤波

news2024/10/7 12:26:48

·而在PCL中总结了几种需要进行点云滤波处理的情况,这几种情况分别是:
(1)点云数据密度不规则需要平滑。
(2)因为遮挡等问题造成离群点需要去除。
(3)大量数据需要进行“下采样”(Downsample)。
(4)噪声数据需要去除。

·对应的解决方法是:
(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.0,1.0)
//pass.setFilterLimitsNegative (true);//设置保留范围内 还是 过滤掉范围内
pass.filter (*cloud_filtered); //执行滤波,保存过滤结果在cloud_filter

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

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)

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

#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);

统计滤波器(去噪)
统计滤波器主要用于去除明显离群点。 离群点特征在空间中分布稀疏。定义某处点云小于某个密度,既点云无效。计算每个点到其最近的k个点平均距离。则点云中所有点的距离应构成高斯分布。根据给定均值与方差,可剔除方差之外的点。

#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);

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

#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); // 执行滤波

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

#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); //

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

// 填充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);//投影结果存储

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

//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);

高斯滤波(去噪、平滑)
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::PointXYZRGB>::BORDERS_POLICY_IGNORE);
convolution.setDistanceThreshold (static_cast<float> (0.1));
convolution.setInputCloud (inputCloud);
convolution.setKernel (gaussian_kernel);
convolution.convolve(*cloud);

双边滤波(平滑)
双边滤波是一种非线性滤波器,它可以达到保持边缘、降噪平滑的效果。一定程度上拟补了高斯滤波的缺点。 双边滤波对高斯噪声效果比较好。
在这里插入图片描述
PCL中filters模块
pcl::PassThroughtpcl::PointXYZ pass; 直通滤波器
pcl::VoxelGrid< pcl::PointXYZ > vox;体素滤波器
pcl::StatisticalOutlierRemovalpcl::PointXYZ sor;统计滤波器
pcl::RadiusOutlierRemovalpcl::PointXYZ rador;半径滤波器
pcl::UniformSamplinqpcl::PointXYz unisam;均匀采样
pcl::ConditionalRemovalpcl::PointXYZ condr;条件滤波器
pcl::ProjectInlierspcl::PointXYZ proj;投影滤波器
pcl::ModelOutlierRemovalpcl::PointXYZ modr;模型滤波器
pcl::BilateralFilterpcl::PointXYZ bf:双边滤波
pcl::filters::GaussianKernal<PointInT,PointOutT>高斯滤
pcl::ExtractIndicespcl::PointxYz extr;索引提取
空间裁剪滤波
pcl::Clipper3Dpcl::PointXYZ
pcl::BoxCliper3Dpcl::PointXYZ
pcl::CropBoxpcl::PointXYZ
pcl::CropHullpcl::PointXYZ

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

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

相关文章

什么是ITIL中的变更管理

商业环境和客户期望在不断变化&#xff0c;数字化转型已成为各行各业企业成功的关键因素。数字化转型的关键在于利用可用 应对业务挑战和抓住机遇的技术。当你分解它时&#xff0c;数字化转型基本上是信息技术管理更好地消除有问题的领域&#xff0c;并使您的 IT 基础架构能够应…

WebView缓存机制

一 前言 由于H5具备 开发周期短、灵活性好 的特点&#xff0c;所以现在 Android App大多嵌入了 Android Webview 组件进行 Hybrid 开发 但我知道你一定在烦恼 Android Webview 的性能问题&#xff0c;特别突出的是&#xff1a;加载速度慢 & 消耗流量 今天&#xff0c;我将…

Django 模型的继承

Django 模型的继承项目管理模型关联关系模块的包管理模型的继承项目管理 到目前为止&#xff0c;都是属于httprunner中的用例部分&#xff0c;针对核心功能进行的开发工作&#xff0c;要把平台做成一个用户可以使用的程度还需要些额外的功能&#xff0c;比如项目管理&#xff…

13薪| 8k-14k Java开发工程师

"众推职聘”以交付结果为宗旨的全流程化招聘服务平台&#xff01;今日招聘信息↓工作内容1.参与软件项目和产品概要设计&#xff0c;负责详细功能设计、编码实现及相关文档编写&#xff1b;2.根据模块设计完成相应的模块编码及单元测试&#xff1b;3.对用户行为、需求及反…

zeek集群简述

Zeek不是多线程的&#xff0c;因此&#xff0c;一旦达到单处理器内核的限制&#xff0c;当前唯一的选择就是将工作负载分散到多个内核&#xff0c;甚至多个物理计算机上。Zeek的集群部署场景是构建这些大型系统的当前解决方案。Zeek附带的工具和脚本提供了一种结构&#xff0c;…

自注意力和位置编码(比较卷积神经网络、循环神经网络和自注意力)

在自注意力中&#xff0c;查询、键和值都来自同一组输入。 卷积神经网络和自注意力都拥有并行计算的优势&#xff0c;而且自注意力的最大路径长度最短。但是因为其计算复杂度是关于序列长度的二次方&#xff0c;所以在很长的序列中计算会非常慢。 为了使用序列的顺序信息&…

Nostr with NIP-05 Verification Guide

What is a NIPNIPs (Nostr Implementation Possibilities) document what MUST, what SHOULD and what MAY be implemented by Nostr-compatible relay and client software. See a complete list of nips here.NIP-05 提案是针对用户 Nostr 帐户的验证方法&#xff0c;可以将其…

The update is not applicable to your computer

在安装windows CVE-2022-44698补丁的时候出现了报错&#xff0c;"Windows Update Standalone Installer The update is not applicable to your computer" 1.找到漏洞对应的官方文章 CVE-2022-44698 - Security Update Guide - Microsoft - Windows SmartScreen S…

学术科研无从下手?27 条机器学习避坑指南,让你的论文发表少走弯路

内容一览&#xff1a;如果你刚接触机器学习不久&#xff0c;并且未来希望在该领域开展学术研究&#xff0c;那么这份为你量身打造的「避坑指南」可千万不要错过了。 关键词&#xff1a;机器学习 科研规范 学术研究 机器学习学术小白&#xff0c;如何优雅避坑坑、让自己的论文顺…

力扣sql简单篇练习(九)

力扣sql简单篇练习(九) 1 合作过至少三次的演员和导演 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT actor_id,director_id FROM ActorDirector GROUP BY actor_id,director_id HAVING count(timestamp)>31.3 运行截图 2 患某种疾病的患…

结构体内存对齐;内存优化

结构体需要根据数据类型进行内存对齐。 所有数据类型占据空间的大小&#xff0c;一定是它基础类型的倍数。 首先按照最大的数据类型格式来作为最小分割单元。 最大整数倍 struct stu {char gender;unsigned int age; }student1;int main() {printf("sizeof this struct i…

SpringCloud Config分布式配置中心

目录 一、概述 二、Config服务端配置与测试 配置读取规则 三、Config客户端配置与测试 bootstrasp.yml 四、Config客户端之动态刷新 一、概述 官网&#xff1a;Spring Cloud Config 微服务意味着要将单体应用中的业务拆分成一个个子服务&#xff0c;每个服务的粒度相对…

【Java】IDEA调试线上服务

目录IEDA打开线上服务对应的代码&#xff0c;Edit Configuration创建与远程服务的连接复制黄匡生成的参数&#xff0c;添加到服务器启动命令中服务器的服务重新启动&#xff0c;并注意调试端口5005是否被防火墙拦截本地IDEA启动&#xff0c;控制台打印如图即成功代码上加断点&a…

Linux做选择题时的要点

1.线程独有&#xff1a;栈&#xff0c;寄存器&#xff0c;信号屏蔽字&#xff0c;errno...等信息&#xff0c;因此各个线程各自有各自的栈区&#xff0c;但是堆区共用。 2.用户态线程的切换在用户态实现&#xff0c;不需要内核支持。 3.每个线程在进程虚拟地址空间中会分配拥…

部署在Docker中的iServer进行服务迁移

目录前言一&#xff1a;备份与恢复1.备份2.恢复二&#xff1a;迁移配置文件作者&#xff1a;kxj 前言 Linux 容器虚拟技术&#xff08;LXC&#xff0c;Linux Container&#xff09;是一种轻量级的虚拟化手段&#xff0c;它利用内核虚拟化技术提供轻量级的虚拟化&#xff0c;来…

【八大数据排序法】希尔排序法的图形理解和案例实现 | C++

第十七章 希尔排序法 目录 第十七章 希尔排序法 ●前言 ●认识排序 ●一、希尔排序法是什么&#xff1f; 1.简要介绍 2.图形理解 3.算法分析 ●二、案例实现 1.案例一 ●总结 前言 排序算法是我们在程序设计中经常见到和使用的一种算法&#xff0c;它主要是将一…

C++引用(特性+使用场景+常引用)

文章目录1. 概念2. 关于别名的理解3. 引用的特性1.引用必须在定义时初始化2.一个变量可以有多个别名3.引用一旦引用一个实体&#xff0c;再不能引用其他实体4.使用场景1. 引用做参数2. 引用做返回值1. 传值返回是否为n直接返回临时变量作为返回值2. 传引用返回编译器傻瓜式判断…

11、循环语句

目录 一、while语句 二、do…while语句 三、for语句 一、while语句 使用while语句可以执行循环结构&#xff0c;其一般形式如下&#xff1a; while语句的执行流程图&#xff1a; while语句首先检验一个条件&#xff0c;也就是括号中的表达式。当条件为真时&#xff0c;就执…

跟同事杠上了,用雪花算法生成的id做主键对MySQL性能有影响?

公司最近开发了一个新项目&#xff0c;设计表时由于有些字段需要对外展示&#xff0c;所以使用了雪花算法生成的id做主键。 不过有位同事对此提出了异议&#xff0c;认为雪花算法生成的id不是顺序递增的&#xff0c;会对MySQL的性能造成影响。 经过交流&#xff0c;发现持有这…

【Linux 系统运维基础】Linux目录 以及重要配置文件

Linux目录 以及重要配置文件 文本讲述了Linux中目录含义 以及我们工作中常用到的路径 1. 目录含义 2. 常用路径地址 2.1 网卡配置文件 /etc/sysconfig/network-scripts但是网卡的名称是有区别的&#xff0c;使用不同服务器生产商的名称是不同的。如下图&#xff1a; 网卡配置…