PCL 点云半径滤波

server/2024/12/23 6:26:16/

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.1.1 半径滤波实现

2.1.2 可视化函数

2.2完整代码

三、实现效果


PCL点云算法汇总及实战案例汇总的目录地址链接:

PCL点云算法与项目实战案例汇总(长期更新)


一、概述

        半径滤波(Radius Outlier Removal) 是一种点云滤波技术,主要用于去除孤立点或稀疏点。半径滤波通过检查每个点的邻域内的点的数量,来判断该点是否保留。如果某个点在给定半径内的邻居点数量低于用户定义的阈值,则该点会被认为是离群点并被删除。

1.1原理

        半径滤波的基本思想是:对于点云中的每个点,检查在一定半径内的邻居点数量。假如某点的邻居数量低于预定阈值,则认为该点为噪声点或异常点,将其剔除。半径和邻居数量这两个参数决定了滤波的效果。

1.2实现步骤

  1. 读取点云数据。
  2. 设置半径滤波的参数,包括搜索半径和最小邻居数。
  3. 应用半径滤波,生成过滤后的点云。
  4. 可视化原始点云和过滤后的点云。

1.3应用场景

  1. 去除噪声点:在点云数据采集中,由于传感器噪声、环境干扰等原因,可能会产生一些离群点,半径滤波可以有效去除这些噪声点。
  2. 稀疏点云处理:在处理稀疏点云时,半径滤波可以剔除那些孤立存在的点。
  3. 数据预处理:为点云的其他处理任务提供更干净的输入数据。

二、代码实现

2.1关键函数

2.1.1 半径滤波实现

通过设置邻域半径和最小邻居数量,应用半径滤波。

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/radius_outlier_removal.h>// 半径滤波函数
pcl::PointCloud<pcl::PointXYZ>::Ptr radiusOutlierRemoval(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,  // 输入点云float radius,                               // 半径大小int min_neighbors                           // 最小邻居数量
)
{// 创建半径滤波对象,并设置参数pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;outrem.setInputCloud(cloud);                // 设置输入点云outrem.setRadiusSearch(radius);             // 设置半径outrem.setMinNeighborsInRadius(min_neighbors);  // 设置最小邻居数// 滤波后的点云pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud(new pcl::PointCloud<pcl::PointXYZ>);outrem.filter(*filtered_cloud);  // 应用滤波return filtered_cloud;  // 返回过滤后的点云
}

2.1.2 可视化函数

使用 PCL 可视化库展示原始点云和半径滤波后的点云。

#include <pcl/visualization/pcl_visualizer.h>// 可视化原始点云和过滤后的点云
void visualizePointClouds(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,          // 原始点云pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud  // 过滤后的点云
)
{// 创建可视化器pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Radius Outlier Removal Viewer"));// 创建视口1,显示原始点云int vp_1;viewer->createViewPort(0.0, 0.0, 0.5, 1.0, vp_1);          // 创建左侧窗口viewer->setBackgroundColor(1.0, 1.0, 1.0, vp_1);           // 设置白色背景viewer->addText("Raw Point Clouds", 10, 10, "v1_text", vp_1);  // 添加标题// 设置原始点云的颜色为红色pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color_handler(cloud, 255, 0, 0);  // 红色viewer->addPointCloud<pcl::PointXYZ>(cloud, cloud_color_handler, "original_cloud", vp_1);  // 添加原始点云// 创建视口2,显示过滤后的点云int vp_2;viewer->createViewPort(0.5, 0.0, 1.0, 1.0, vp_2);          // 创建右侧窗口viewer->setBackgroundColor(0.98, 0.98, 0.98, vp_2);        // 设置浅灰色背景viewer->addText("Filtered Point Clouds", 10, 10, "v2_text", vp_2);  // 添加标题// 设置过滤后的点云的颜色为绿色pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> filtered_cloud_color_handler(filtered_cloud, 0, 255, 0);  // 绿色viewer->addPointCloud<pcl::PointXYZ>(filtered_cloud, filtered_cloud_color_handler, "filtered_cloud", vp_2);  // 添加过滤后的点云// 设置点的大小(可选)viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "original_cloud", vp_1);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "filtered_cloud", vp_2);// 启动可视化循环while (!viewer->wasStopped()){viewer->spinOnce(100);  // 刷新可视化器}
}

2.2完整代码

// C++头文件
#include <iostream>
// PCL头文件
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/radius_outlier_removal.h>  // 半径滤波
#include <pcl/visualization/pcl_visualizer.h>// 半径滤波函数
pcl::PointCloud<pcl::PointXYZ>::Ptr radiusOutlierRemoval(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,  // 输入点云float radius,                               // 半径大小int min_neighbors                           // 最小邻居数量
)
{// 创建半径滤波对象,并设置参数pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;outrem.setInputCloud(cloud);                // 设置输入点云outrem.setRadiusSearch(radius);             // 设置半径outrem.setMinNeighborsInRadius(min_neighbors);  // 设置最小邻居数// 滤波后的点云pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud(new pcl::PointCloud<pcl::PointXYZ>);outrem.filter(*filtered_cloud);  // 应用滤波return filtered_cloud;  // 返回过滤后的点云
}// 可视化原始点云和过滤后的点云
void visualizePointClouds(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,          // 原始点云pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud  // 过滤后的点云
)
{// 创建可视化器pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Radius Outlier Removal Viewer"));// 创建视口1,显示原始点云int vp_1;viewer->createViewPort(0.0, 0.0, 0.5, 1.0, vp_1);          // 创建左侧窗口viewer->setBackgroundColor(1.0, 1.0, 1.0, vp_1);           // 设置白色背景viewer->addText("Raw Point Clouds", 10, 10, "v1_text", vp_1);  // 添加标题// 设置原始点云的颜色为红色pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color_handler(cloud, 255, 0, 0);  // 红色viewer->addPointCloud<pcl::PointXYZ>(cloud, cloud_color_handler, "original_cloud", vp_1);  // 添加原始点云// 创建视口2,显示过滤后的点云int vp_2;viewer->createViewPort(0.5, 0.0, 1.0, 1.0, vp_2);          // 创建右侧窗口viewer->setBackgroundColor(0.98, 0.98, 0.98, vp_2);        // 设置浅灰色背景viewer->addText("Filtered Point Clouds", 10, 10, "v2_text", vp_2);  // 添加标题// 设置过滤后的点云的颜色为绿色pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> filtered_cloud_color_handler(filtered_cloud, 0, 255, 0);  // 绿色viewer->addPointCloud<pcl::PointXYZ>(filtered_cloud, filtered_cloud_color_handler, "filtered_cloud", vp_2);  // 添加过滤后的点云// 设置点的大小(可选)viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "original_cloud", vp_1);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "filtered_cloud", vp_2);// 启动可视化循环while (!viewer->wasStopped()){viewer->spinOnce(100);  // 刷新可视化器}
}int main(int argc, char** argv)
{// ------------------------------读取点云数据---------------------------------pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);if (pcl::io::loadPCDFile("ro_bunny.pcd", *cloud) < 0){PCL_ERROR("Could not read file\n");return (-1);  // 返回错误}// -------------------------------半径滤波---------------------------------float radius = 0.002;   // 设置搜索半径int min_neighbors = 6;  // 设置最小邻居数pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud = radiusOutlierRemoval(cloud, radius, min_neighbors);  // 应用半径滤波// ------------------------------可视化原始点云和过滤后的点云---------------------------------visualizePointClouds(cloud, filtered_cloud);  // 调用可视化函数return 0;
}

三、实现效果

3d2cbc2241b0852b516db97806dc.png" width="1200" />


http://www.ppmy.cn/server/126778.html

相关文章

无人机跟踪

无人机跟踪通常指的是无人机&#xff08;UAV&#xff09;利用视觉或其他传感器实时识别并跟踪特定目标的技术。在文中提到的背景下&#xff0c;主要涉及的是视觉目标跟踪&#xff0c;即通过摄像头捕捉的图像来实时监控和跟踪移动对象。 无人机跟踪技术主要基于以下几点&#x…

实战OpenCV之轮廓检测

基础入门 轮廓检测,是指在图像中找到物体边缘的过程。这些边缘通常代表物体的外部边界或者内部结构的重要特征。通过检测这些轮廓,我们可以获取关于物体形状、大小和位置等有价值的信息。在OpenCV中,我们可以通过cv::findContours()函数来完成该项工作,其接口原型如下。 v…

idea使用ant源码运行tomcat8.5

1 安装ant 下载ant 下载地址 使用apache-ant-1.10.15版本 将压缩包放到/Library/Java/ant解压 设置ant环境变量 打开finder到用户根目录 按下shiftcmd.显示隐藏文件 打开隐藏文件.zprofile 按照以下格式设置环境变量 #ant export ANT_HOME/Library/Java/ant/apache-a…

C++入门(有C语言基础)

string类 string类初始化的方式大概有以下几种&#xff1a; string str1;string str2 "hello str2";string str3("hello str3");string str4(5, B);string str5[3] {"Xiaomi", "BYD", "XPeng"};string str6 str5[2];str…

Qt 中的 QChartView

深入理解 Qt 的 QChartView&#xff1a;图表展示与交互 QChartView 是 Qt Charts 模块中的一个核心类&#xff0c;它用于在 Qt 应用程序中显示图表&#xff0c;并支持多种用户交互方式。它继承自 QGraphicsView&#xff0c;通过封装 QChart&#xff0c;为用户提供了强大的图表…

【IEEE PDF eXpress】格式不对

目录 一、问题二、解决方法 一、问题 word的文档&#xff0c;用IEEE PDF eXpress网站生成pdf后&#xff0c;提交论文出现错误&#xff1a; Document validation failed due to the following errors: Content exceeds IEEE template margins for its format (Page 1:Bottom).…

2025 SSM与SpringBoot计算机毕业设计选题推荐【2025Java方向】

文末有博主联系方式 在选择计算机毕业设计题目时&#xff0c;选一个合适的方向和技术栈非常重要。对于使用Java方向的SSM&#xff08;Spring、Spring MVC、MyBatis&#xff09;和Spring Boot技术的开发项目&#xff0c;这里为大家整理了50个精选的毕业设计题目&#xff0c;供2…

微服务JMeter解析部署使用全流程

目录 1、介绍 2、下载 3、运行 4、设置简体中文版 5、开始测试 1、添加线程组 2、添加监听器 3、添加请求 先.测试userController里的查询方法 6、查看结果 1、查看结果树 2、汇总报告 3、聚合报告 7、JMeter报错 1、介绍 Apache JMeter 是 Apache 组织基于 Java…