【pcl入门教程滤波系列】之passThrough滤波

2024-01-11 01:48

本文主要是介绍【pcl入门教程滤波系列】之passThrough滤波,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

  最近开始接触点云的数据处理模块,点云做分割、检测、识别之前需要做大量的预处理操作。直通滤波算作最为简单、粗暴的一种滤波方式,就是直接对点云的X、Y、Z轴的点云坐标约束来进行滤波,可以约束只在Z轴,或者XYZ三个坐标轴共同约束来达到点云滤波效果。下面直接上代码进行简单解释:

代码示例

  下面这段代码是直通滤波最为频繁使用的函数:该简单示例通过读取pcd点云数据进行操作,最后保存为pcd文件。通过使用cloudcompare软件来进行查看直通滤波后的效果。

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>int main(int argc, char** argv)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);// Fill in the cloud datapcl::PCDReader reader;reader.read("16line.pcd", *cloud);std::cerr << "Cloud before filtering: " << cloud->points.size() << std::endl;// Create the filtering objectpcl::PassThrough<pcl::PointXYZ> pass; // 声明直通滤波pass.setInputCloud(cloud); // 传入点云数据pass.setFilterFieldName("z"); // 设置操作的坐标轴pass.setFilterLimits(0.0, 3.0); // 设置坐标范围// pass.setFilterLimitsNegative(true); // 保留数据函数pass.filter(*cloud_filtered);  // 进行滤波输出std::cerr << "Cloud after filtering: " << cloud_filtered->points.size() << std::endl;// save filterd data pcl::PCDWriter writer;writer.write("16line_filtered.pcd", *cloud_filtered, false);return 0;
}

设置过滤x或者y轴方向的部分代码:

	// Create the filtering objectpcl::PassThrough<pcl::PointXYZ> pass;pass.setInputCloud(cloud);pass.setFilterFieldName("x");pass.setFilterLimits(-5.0, 5.0);// pass.setFilterLimitsNegative(true);pass.filter(*cloud_filtered2);pass.setInputCloud(cloud_filtered2);pass.setFilterFieldName("y");pass.setFilterLimits(-5.0, 5.0);pass.filter(*cloud_filtered3);
实验结果可视化

下面简单贴出直通滤波过滤的结果点云:

原始点云可视化
x轴点云范围限制[-5.0, 5.0]

下面图片点云过滤是上一张图片的全局剩余的点云,这里在代码中的pass.setFilterLimitsNegative(true);就是这个功能作用,是否保存滤波的限制范围内的点云,默认为false,保存限制范围点云,true时候是相反。

x轴点云范围限制[-5.0, 5.0]
y轴点云范围限制[-5.0, 5.0]

  在查阅学习pcl直通滤波的过程中,发现网上所说 的关于不仅限于对单一坐标轴的过滤,其实主要就是再一次进行目标坐标轴过滤即可,通过重复使用直通滤波就可以进行三维区间的滤波。下面贴上代码部分,只是简单的增加一些变量和重复操作,并无特别复杂的地方:

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>int main(int argc, char** argv)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);// Fill in the cloud datapcl::PCDReader reader;reader.read("16line.pcd", *cloud);std::cerr << "Cloud before filtering: " << cloud->points.size() << std::endl;pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered2(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered3(new pcl::PointCloud<pcl::PointXYZ>);// Create the filtering objectpcl::PassThrough<pcl::PointXYZ> pass;pass.setInputCloud(cloud);pass.setFilterFieldName("x");pass.setFilterLimits(-5.0, 5.0);// pass.setFilterLimitsNegative(true);pass.filter(*cloud_filtered2);// filter range Y-axispass.setInputCloud(cloud_filtered2);pass.setFilterFieldName("y");pass.setFilterLimits(-5.0, 5.0);pass.filter(*cloud_filtered3);// filter range Z-axispass.setInputCloud(cloud_filtered3);pass.setFilterFieldName("z");pass.setFilterLimits(-0.5, 3.0);pass.filter(*cloud_filtered);std::cerr << "Cloud after filtering: " << cloud_filtered->points.size() << std::endl;// save filterd data pcl::PCDWriter writer;writer.write("16line_filtered.pcd", *cloud_filtered, false);return 0;
}
xy轴点云范围限制[-5.0, 5.0]

  通过简单添加直通滤波的几行代码,就可以选择是只是过滤XY轴的范围,还是XYZ三维空间的范围。其实就是接着上一次直通滤波的结果进行下一个坐标轴的过滤。

xyz轴点云范围限制
源码部分功能浅析

具体函数模块功能主要介绍:

pcl::PassThrough官方API接口有两种数据结构模式供你使用(在声明直通滤波时候):PointT或者是pcl::PCLPointCloud2

官方给出的示例:

    * pcl::PassThrough<PointType> ptfilter (true); // Initializing with true will allow us to extract the removed indices* ptfilter.setInputCloud (cloud_in);* ptfilter.setFilterFieldName ("x");* ptfilter.setFilterLimits (0.0, 1000.0);* ptfilter.filter (*indices_x);* // The indices_x array indexes all points of cloud_in that have x between 0.0 and 1000.0* indices_rem = ptfilter.getRemovedIndices ();* // The indices_rem array indexes all points of cloud_in that have x smaller than 0.0 or larger than 1000.0* // and also indexes all non-finite points of cloud_in* ptfilter.setIndices (indices_x);* ptfilter.setFilterFieldName ("z");* ptfilter.setFilterLimits (-10.0, 10.0);* ptfilter.setNegative (true);* ptfilter.filter (*indices_xz);* // The indices_xz array indexes all points of cloud_in that have x between 0.0 and 1000.0 and z larger than 10.0 or smaller than -10.0* ptfilter.setIndices (indices_xz);* ptfilter.setFilterFieldName ("intensity");* ptfilter.setFilterLimits (FLT_MIN, 0.5);* ptfilter.setNegative (false);* ptfilter.filter (*cloud_out);* // The resulting cloud_out contains all points of cloud_in that are finite and have:* // x between 0.0 and 1000.0, z larger than 10.0 or smaller than -10.0 and intensity smaller than 0.5.
小结

  直通滤波比较简单粗暴的滤除点云的方式,实际运用中一般是作为第一步来进行点云的初步筛选与限制。可能你会觉得使用直通滤波不太智能化,要是对多个坐标轴进行滤波要操作多次的过程,那么你可以选择使用条件滤波来满足你的需求。下一篇就会介绍条件滤波。

参考

https://pcl-tutorials.readthedocs.io/en/pcl-1.11.0/passthrough.html#passthrough

这篇关于【pcl入门教程滤波系列】之passThrough滤波的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/592756

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Open3D 基于法线的双边滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 输入参数: 输出参数: 参数影响: 2.2完整代码 三、实现效果 3.1原始点云 3.2滤波后点云 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述         基于法线的双边

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

6.4双边滤波

目录 实验原理 示例代码1 运行结果1 实验代码2 运行结果2 实验原理 双边滤波(Bilateral Filtering)是一种非线性滤波技术,用于图像处理中去除噪声,同时保留边缘和细节。这种滤波器结合了空间邻近性和像素值相似性的双重加权,从而能够在去噪(平滑图像)的同时保留图像的边缘细节。双边滤波器能够在的同时,保持边缘清晰,因此非常适合用于去除噪声和保持图像特征。在Op

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

Java基础回顾系列-第三天-Lambda表达式

Java基础回顾系列-第三天-Lambda表达式 Lambda表达式方法引用引用静态方法引用实例化对象的方法引用特定类型的方法引用构造方法 内建函数式接口Function基础接口DoubleToIntFunction 类型转换接口Consumer消费型函数式接口Supplier供给型函数式接口Predicate断言型函数式接口 Stream API 该篇博文需重点了解:内建函数式