三、PCL点云处理滤波器----(1)直通滤波器

2023-10-30

一、为什么要进行滤波?

在获取点云数据时,由于设备精度、操作者经验、环境因素等带来的影响,以及电磁波衍射特性、被测物体表面性质变化和数据拼接配准操作过程的影响,点云数据中将不可避免地出现一些噪声点。实际应用中除了这些测量随机误差产生的噪声点之外,由于受到外界干扰如视线遮挡、障碍物等因素的影响,点云数据中往往存在着一些离主体点云较远的离散点,即离群点。不同的获取设备点云噪声结构也有不同。

二、滤波的功能:

通过滤波完成的功能还包括孔洞修复、最小信息损失的海量点云数据压缩处理等 。在点云处理流程中滤波处理作为预处理的第一步,往往对后续处理流程影响很大,只有在滤波预处理中将噪声点、离群点、孔洞、数据压缩等 按照后续需求处理,才能够更好地进行配准、特征提取、曲面重建、可视化等后续流程。

三、直通滤波器:

直通滤波器主要的使用过程:

1、创建待处理点云对象,以及存储点云处理完成后的点云对象。
2、设置点云的容量:宽+高+长×宽;
3、设置点云内所有点的xyz坐标;
4、创建PassThroughFilter对象,并设置其滤波参数。
5、将待处理点云对象作为filter的输入进行滤波;
6、得到结果:在filter对象设置的x,y,z的范围之内的点将被保留,范围之外的点将被舍弃,实现直通滤波的功能

直通滤波器的作用:根据点云的属性在点的属性上设置范围,对点进行滤波,保留范围内的或保留范围外的.

通俗讲:点云数据有xyz三维坐标,选择一个方向的维度的数据,设置一个范围,在这个范围中的点云会被保留,不在此范围内的点云会被去除掉

1 )指定一个维度以及该维度下的值域
(2)遍历点云中的每个点,判断该点在指定维度上的取值
是否在值域内,删除取值不在值域内的点
(3)遍历结束,留下的点即构成滤波后的点云。

直通滤波器核心代码:

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);	//滤波后点云
	pcl::PassThrough<pcl::PointXYZ> pt;	// 创建滤波器对象
	pt.setInputCloud(cloud);			//设置存入点云
	pt.setFilterFieldName("x");			//设置滤波所需字段x
	pt.setFilterLimits(-0.1, 1);		//滤除在z轴方向上不在-0.1-1范围内的所有点
	pt.setFilterLimitsNegative(false);	//默认false,保留范围内的点云;true,保存范围外的点云
	//pt.setKeepOrganized(true);		//是否保持点云的组织结构(针对结构点云)
   // 上面两行填写true代表滤除(-0.1, 1)范围外的点云;false代表滤除(-0.1, 1)范围内的点云;二者是内外互补;
	pt.filter(*cloud_filtered);			//执行滤波,并将滤波后点云保存到cloud_filtered中

// 存在疑问点:滤波的范围如何选取,如何根据pcd文件来设置直通滤波的范围

完整代码:

#include <pcl/io/pcd_io.h>
#include <pcl/filters/passthrough.h>
#include <pcl/visualization/cloud_viewer.h>

using namespace std;

int main()
{
	//----------------------------------------- 加载点云 ----------------------------------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);	//待滤波点云
	if (pcl::io::loadPCDFile("bunny.pcd", *cloud) < 0)
	{
		PCL_ERROR("点云文件不存在!\n");
		system("pause");
		return -1;
	}
	cout << "->加载点云个数:" << cloud->points.size() << endl;
	//==========================================================================================

	//----------------------------------------- 直通滤波 ----------------------------------------
	cout << "->正在进行直通滤波..." << endl;
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);	//滤波后点云
	pcl::PassThrough<pcl::PointXYZ> pt;	// 创建滤波器对象
	pt.setInputCloud(cloud);			//设置输入点云
	pt.setFilterFieldName("x");			//设置滤波所需字段x
	pt.setFilterLimits(-0.1, 1);		//滤除在z轴方向上不在-0.1-1范围内的所有点
	pt.setFilterLimitsNegative(false);	//默认false,保留范围内的点云;true,保存范围外的点云
	//pt.setKeepOrganized(true);		//是否保持点云的组织结构(针对结构点云)
	pt.filter(*cloud_filtered);			//执行滤波,并将滤波后点云保存到cloud_filtered中
	//去除 NaN 点(只针对结构点云。散乱点云不需要)
	//vector<int> Idx;
	//pcl::removeNaNFromPointCloud(*cloud_filtered, *cloud_filtered, Idx);
	//==========================================================================================

	//-------------------------------------- 可视化(可选) -------------------------------------
	pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("滤波前后对比"));

	/*-----原始点云-----*/
	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);
	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);

	/*-----滤波后点云-----*/
	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, "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));
        std::this_thread::sleep_for(std::chrono::microseconds(100000));
	}
	//==========================================================================================

	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三、PCL点云处理滤波器----(1)直通滤波器 的相关文章

随机推荐

  • 深聊性能测试,从入门到放弃之:性能测试技术栈,看完这篇,保证刷新你对性能测试的认知~~

    性能测试技术栈 1 引言 2 性能测试基础 2 1 性能测试理论 2 2 测试开发技能 3 性能监听诊断 3 1 前端监听诊断 3 2 服务器监听诊断 3 2 1 Linux 3 2 2 Windows Server 3 3 中间件监听诊断
  • 实现http到https的重定向

    vim etc httpd conf httpd conf DocumentRoot var www html redirect temp https www a com RewriteEngine on RewriteRule https
  • tensorflow笔记【9】深度学习-几个经典网络的基本结构

    tensorflow笔记 9 深度学习 几个经典网络的基本结构 文章目录 前言 一 卷积神经网络 二 经典网络结构 1 自制CNN 2 LeNet 3 AlexNet 4 VGGNet 5 InceptionNet 6 ResNet 总结
  • Java - Java基础(一)

    一 计算机基础知识 1 计算机简介 第一台通用计算机 ENIAC 2 数据的存储和运算 计算机中对于数据的存储和运算 都是通过二进制数据来完成 3 人机交互方式 图形化界面 DOS命令行 D 切换盘符 dir 查看当前路径下的文件信息 cd
  • Android中的drawable像素密度适配详解

    本文大纲 1 为什么要分drawable xxx目录 2 Bitmap的介绍 3 不同drawable xxx中的图片内存测试 1 为什么要分drawable xxx目录 android项目资源中对于drawable文件夹可以分为以下类型的
  • 【Transformer】10、HRFormer:High-Resolution Transformer for Dense Prediction

    文章目录 一 背景 二 方法 三 效果 论文链接 https arxiv org abs 2110 09408 代码链接 https github com HRNet HRFormer 一 背景 ViT 的提出让人们看到了 Transfor
  • 一文弄懂神经网络中的BP反向传播算法

    注 本文转自 一文弄懂神经网络中的BP反向传播算法 Charlotte77 博客园 安利 Charlotte77 的深度学习系列博客 最近在看深度学习的东西 一开始看的吴恩达的UFLDL教程 英文版 有中文版就直接看了 后来发现有些地方总是
  • 网卡中断优化

    1 中断的配置 root zxinos etc init d irq balancer status Checking for service irqbalance running etc init d irq balancer 是linu
  • 浅谈sleep、wait、yield、join区别

    sleep sleep 方法是属于 Thread 类中的 sleep 过程中线程不会释放锁 只会阻塞线程 让出cpu给其他线程 但是他的监控状态依然保持着 当指定的时间到了又会自动恢复运行状态 可中断 sleep 给其他线程运行机会时不考虑
  • 小甲鱼学python学习笔记

    一 序章 1 python缩进问题 if a 0 else while a 0 2 字符串拼接与控制台输入输出 input 可从控制台读入数据 括号内地字符串为输入时的提示 输入结果可通过变量保存 print 控制台输出 s input p
  • Linux 常用指令大全

    我是目录 1 指令格式 2 Windows 和 Linux 通用内容 3 路径的命令 1 cd 切换到某个目录 相对路径 绝对路径 2 pwd 显示当前路径 3 ls 列出目录下的所有子目录与文件 或 文件的信息 4 目录 文件的指令 1
  • 技术干货:解密最受欢迎的开源 Serverless 框架弹性技术实现

    Knative 是一款基于 Kubernetes 的开源 Serverless 应用编排框架 其目标是制定云原生 跨平台的 Serverless 应用编排标准 Knative 主要功能包括基于请求的自动弹性 缩容到 0 多版本管理 基于流量
  • 前端面试实习生(基础题)

    前言 经过一年的学习 我对vue框架有了清楚的认识 我就想着去找实习工作 这些天我投了100多份简历 接到了两个线上笔试 第一个面试题使用vue完成一个网页的模块 有要有分页与传输数据 这不重要 很容易写出来了 关键是第二个线上笔试题 很基
  • [iOS]深入浅出 iOS 之多线程 NSThread

    线程专题 http www cocoachina com bbs read php tid 43852 OS 支持多个层次的多线程 编程 层次越高的抽象程度越高 使用起来也越方便 也是苹果最推荐使用的方法 下面简要说明这三种不同范式 Thr
  • Netjs框架基础

    一 框架介绍 Nestjs 是以用于构建高可用可伸缩的后端应用框架 并且全面支持 Typescript 在背后 Nestjs 使用了强大的 http 框架 默认是 express 并且可以配置选择其他的 Http 服务框架 二 Contro
  • simswap安装过程中遇到的一些问题

    simswap与deepfacelab很像 但是simswap的泛用性远强于deepfacelab 个人认为simswap名气不如deepfacelab的原因有以下几点 1 缺乏发行版 2 缺乏文档 3 最终训练效果不一定好 本文旨在记录一
  • 它们把色情版 “微信” 的底裤都给挖出来了,网友: 草率了。。。

    作者 暗影安全实验室 来源 anquanke com post id 219729 背景 近日 恒安嘉新暗影安全实验室平台监测到一款名为 乐宝 的仿冒应用 安全研究人员第一时间对该应用进行了研究分析 发现该应用表面上是一款与微信具有相似页面
  • wireshark 导出指定tcp流的数据包

    数据包回放时 如果我们只想将pcap包中的部分数据进行回放 怎么办呢 首先使用wireshark打开文件 在过滤器中进行过滤 比如我只想要tcp stream eq 0的数据 可以如下操作 过滤好数据 然后依次操作 文件 gt 导出特定分组
  • 离散余弦变换

    离散余弦变换 DCT for Discrete Cosine Transform 是与傅里叶变换相关的一种变换 它类似于离散傅里叶变换 DFT for Discrete Fourier Transform 但是只使用实数 离散余弦变换相当于
  • 三、PCL点云处理滤波器----(1)直通滤波器

    一 为什么要进行滤波 在获取点云数据时 由于设备精度 操作者经验 环境因素等带来的影响 以及电磁波衍射特性 被测物体表面性质变化和数据拼接配准操作过程的影响 点云数据中将不可避免地出现一些噪声点 实际应用中除了这些测量随机误差产生的噪声点之