PCL 点云模型滤波(圆形)

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.1.1 生成点云数据

2.1.2 模型滤波函数

2.1.3 可视化函数

2.2完整代码

三、实现效果


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

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


一、概述

        模型点云滤波 是通过基于特定几何形状的模型(例如球体、平面等)来识别点云中符合该模型的点,并将它们从点云中提取出来或者移除。这种滤波技术广泛应用于点云数据的分割、去噪和特征提取等任务。

1.1原理

        通过预设几何模型(如球体、平面等),在点云数据中搜索与该模型拟合度高的点,并将其从点云中提取出来或过滤掉。具体的滤波过程依赖于模型系数以及距离阈值,以确保提取的点符合指定的几何特征。

1.2实现步骤

  1. 生成包含噪声和球体的模拟点云数据。
  2. 定义球体模型,并设定模型参数(如球心和半径)。
  3. 使用 pcl::ModelOutlierRemoval 对点云数据进行模型滤波,提取符合球体模型的点云。
  4. 可视化原始点云与滤波后的点云对比。

1.3应用场景

  1. 几何特征提取:从点云数据中提取特定几何形状(如平面、球体等)。
  2. 去除噪声点:移除不符合模型的噪声点。
  3. 点云分割:将点云划分为符合模型的点和不符合模型的点。

二、代码实现

2.1关键函数

2.1.1 生成点云数据

生成包含噪声点和球体点的模拟点云数据

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>// 生成噪声点和球体点的点云
pcl::PointCloud<pcl::PointXYZ>::Ptr generatePointCloud(int noise_size, int sphere_size)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);cloud->width = noise_size + sphere_size;cloud->height = 1;cloud->points.resize(cloud->width * cloud->height);// 生成噪声点for (size_t i = 0; i < noise_size; ++i){cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);}// 生成球体点double rand_x1 = 1, rand_x2 = 1;for (size_t i = noise_size; i < noise_size + sphere_size; ++i){while (pow(rand_x1, 2) + pow(rand_x2, 2) >= 1){rand_x1 = (rand() % 100) / (50.0f) - 1;rand_x2 = (rand() % 100) / (50.0f) - 1;}double pre_calc = sqrt(1 - pow(rand_x1, 2) - pow(rand_x2, 2));cloud->points[i].x = 2 * rand_x1 * pre_calc;cloud->points[i].y = 2 * rand_x2 * pre_calc;cloud->points[i].z = 1 - 2 * (pow(rand_x1, 2) + pow(rand_x2, 2));rand_x1 = 1;rand_x2 = 1;}return cloud;
}

2.1.2 模型滤波函数

根据定义的球体模型,对点云数据进行模型滤波,提取符合球体模型的点。

#include <pcl/filters/model_outlier_removal.h>
#include <pcl/model_coefficients.h>// 对点云进行模型滤波,提取符合球体模型的点
pcl::PointCloud<pcl::PointXYZ>::Ptr applyModelFilter(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{pcl::ModelCoefficients sphere_coeff;sphere_coeff.values.resize(4); // 定义球体模型参数sphere_coeff.values[0] = 0;    // 球心的 x 坐标sphere_coeff.values[1] = 0;    // 球心的 y 坐标sphere_coeff.values[2] = 0;    // 球心的 z 坐标sphere_coeff.values[3] = 1;    // 球体的半径pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);pcl::ModelOutlierRemoval<pcl::PointXYZ> filter;filter.setModelCoefficients(sphere_coeff);   // 设置球体模型参数filter.setThreshold(0.05);                   // 设置距离阈值filter.setModelType(pcl::SACMODEL_SPHERE);   // 设置模型类型为球体filter.setInputCloud(cloud);filter.filter(*cloud_filtered);              // 滤波操作return cloud_filtered;
}

2.1.3 可视化函数

#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("Model Filter Viewer"));int vp_1, vp_2;viewer->createViewPort(0.0, 0.0, 0.5, 1.0, vp_1);   // 创建左侧窗口viewer->setBackgroundColor(1.0, 1.0, 1.0, vp_1);    // 设置白色背景viewer->addText("Original PointCloud", 10, 10, "vp1_text", vp_1);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color(cloud, 255, 0, 0); // 原始点云红色viewer->addPointCloud(cloud, cloud_color, "original_cloud", vp_1);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 PointCloud", 10, 10, "vp2_text", vp_2);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> filtered_color(filtered_cloud, 0, 255, 0); // 滤波点云绿色viewer->addPointCloud(filtered_cloud, filtered_color, "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完整代码

#include <iostream>
#include <pcl/point_types.h>
#include <pcl/filters/model_outlier_removal.h>
#include <pcl/visualization/pcl_visualizer.h>// 生成包含噪声和球体点的点云
pcl::PointCloud<pcl::PointXYZ>::Ptr generatePointCloud(int noise_size, int sphere_size)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);cloud->width = noise_size + sphere_size;cloud->height = 1;cloud->points.resize(cloud->width * cloud->height);// 生成噪声点for (size_t i = 0; i < noise_size; ++i){cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);}// 生成球体点double rand_x1 = 1, rand_x2 = 1;for (size_t i = noise_size; i < noise_size + sphere_size; ++i){while (pow(rand_x1, 2) + pow(rand_x2, 2) >= 1){rand_x1 = (rand() % 100) / (50.0f) - 1;rand_x2 = (rand() % 100) / (50.0f) - 1;}double pre_calc = sqrt(1 - pow(rand_x1, 2) - pow(rand_x2, 2));cloud->points[i].x = 2 * rand_x1 * pre_calc;cloud->points[i].y = 2 * rand_x2 * pre_calc;cloud->points[i].z = 1 - 2 * (pow(rand_x1, 2) + pow(rand_x2, 2));rand_x1 = 1;rand_x2 = 1;}return cloud;
}// 对点云进行模型滤波,提取符合球体模型的点
pcl::PointCloud<pcl::PointXYZ>::Ptr applyModelFilter(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{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::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);pcl::ModelOutlierRemoval<pcl::PointXYZ> filter;filter.setModelCoefficients(sphere_coeff);filter.setThreshold(0.05);filter.setModelType(pcl::SACMODEL_SPHERE);filter.setInputCloud(cloud);filter.filter(*cloud_filtered);return cloud_filtered;
}// 可视化原始点云和滤波后的点云
void visualizePointClouds(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud
)
{pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Model Filter Viewer"));int vp_1, vp_2;viewer->createViewPort(0.0, 0.0, 0.5, 1.0, vp_1);viewer->setBackgroundColor(1.0, 1.0, 1.0, vp_1);viewer->addText("Original PointCloud", 10, 10, "vp1_text", vp_1);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color(cloud, 255, 0, 0);viewer->addPointCloud(cloud, cloud_color, "original_cloud", vp_1);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 PointCloud", 10, 10, "vp2_text", vp_2);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> filtered_color(filtered_cloud, 0, 255, 0);viewer->addPointCloud(filtered_cloud, filtered_color, "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()
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud = generatePointCloud(500, 10000);  // 生成点云数据pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud = applyModelFilter(cloud); // 应用模型滤波visualizePointClouds(cloud, filtered_cloud);  // 可视化原始点云和滤波后的点云return 0;
}

三、实现效果

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

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

相关文章

树和二叉树知识点大全及相关题目练习【数据结构】

树和二叉树 要注意树和二叉树是两个完全不同的结构、概念&#xff0c;它们之间不存在包含之类的关系 树的定义 树&#xff08;Tree&#xff09;是n&#xff08;n≥0&#xff09;个结点的有限集&#xff0c;它或为空树&#xff08;n 0&#xff09;&#xff1b;或为非空树&a…

lambda表达式底层实现:反编译LambdaMetafactory + 转储dump + 运行过程 + 反汇编 + 动态指令invokedynamic

一、结论先行 lambda 底层实现机制 1.lambda 表达式的本质&#xff1a;函数式接口的匿名子类的匿名对象 2.lambda表达式是语法糖 语法糖&#xff1a;编码时是lambda简洁的表达式&#xff0c;在字节码期&#xff0c;语法糖会被转换为实际复杂的实现方式&#xff0c;含义不变&am…

基于springboot的数据库原理教学案例案例库管理系统

目录 毕设制作流程功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行代码执行流程核心代码部分展示可行性分析软件测试详细视频演示源码获取 毕设制作流程 &#xff08;1&#xff09;与指导老师确定系统主要功能&#xff1b; &#xff08;2&am…

PMP--三模--解题--71-80

文章目录 7.成本管理--S曲线--S曲线对累计值进行监督和报告--S曲线可以同时报告成本与进度情况。适用于预测和敏捷项目。14.敏捷--信息发射源--是一种可见的实物展示其向组织内其他成员提供信息在不干扰团队的情况下即时实现知识共享。71、 [单选] 项目经理正在为刚刚进入第三次…

windows配置C++编译环境和VScode C++配置(保姆级教程)

1.安装MinGW-w64 MinGW-w64是一个开源的编译器套件,适用于Windows平台,支持32位和64位应用程序的开发。它包含了GCC编译器、GDB调试器以及其他必要的工具,是C++开发者在Windows环境下进行开发的重要工具。 我找到了一个下载比较快的链接:https://gitcode.com/open-source-…

FastAPI 第九课 -- 表单数据

目录 一. 前言 二. 声明表单数据模型 三. 在路由中接收表单数据 四. 表单数据的验证和文档生成 五. 处理文件上传 一. 前言 在 FastAPI 中&#xff0c;接收表单数据是一种常见的操作&#xff0c;通常用于处理用户通过 HTML 表单提交的数据。 FastAPI 提供了 Form 类型&a…

C++发邮件:如何轻松实现邮件自动化发送?

C发邮件的详细步骤与教程指南&#xff1f;如何在C中发邮件&#xff1f; 无论是定期发送报告、通知客户还是管理内部沟通&#xff0c;自动化邮件系统都能显著提升工作效率。AokSend将详细介绍如何使用C发邮件&#xff0c;实现邮件自动化发送&#xff0c;帮助您轻松管理邮件通信…

车视界系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;汽车品牌管理&#xff0c;汽车颜色管理&#xff0c;用户管理&#xff0c;汽车信息管理&#xff0c;汽车订单管理系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;汽车信息&#xff0c;我…

4.1、FineReport单元格扩展和父子格

单元格扩展 1、配置数据集 2、纵向扩展 方法一&#xff1a; 方法二&#xff1a; 结果 多个字段纵向 2、横向扩展 方法一&#xff1a; 方法二&#xff1a; 结果 父子格 没什么特殊要求&#xff0c;就保持默认 1、右边的值默认以左边为左父格 2、下边的值默认以上边…

【Windows】如何取消显示Windows聚焦在桌面上生成的“了解此图片”图标

如下图所示&#xff0c;在更换Windows聚焦显示的时候&#xff0c;会在桌面多出一个“了解此图片”的图标&#xff0c;看着很烦&#xff0c;但又因为Windows聚焦自带的壁纸比其他主题的壁纸好看很多。 下面是消除办法&#xff1a; 打开注册表&#xff08;按WindowsR&#xff0…

【COSMO-SkyMed系列的4颗卫星主要用途】

COSMO-SkyMed系列的4颗卫星主要用于提供一个多用途的对地观测平台&#xff0c;服务于民间、公共机构、军事和商业领域。以下是这4颗卫星的主要用途&#xff1a; 民防与环境风险管理&#xff1a; 卫星的高分辨率雷达图像可用于监测自然灾害&#xff0c;如地震、洪水、滑坡等&am…

51单片机学习第六课---B站UP主江协科技

DS18B20 1、基本知识讲解 2、DS18B20读取温度值 main.c #include<regx52.h> #include"delay.h" #include"LCD1602.h" #include"key.h" #include"DS18B20.h"float T; void main () {LCD_Init();LCD_ShowString(1,1,"temp…

汽车革命下半场AI先锋:广汽为新“智”汽车装配大模型“底盘”

汽车革命的上半场是电动化&#xff0c;下半场是智能化&#xff0c;这是全球汽车产业普遍认同的观点。当前&#xff0c;我国汽车产业已经在电动化上半场取得了显著成效&#xff0c;在下半场智能化的全球战场能否胜出&#xff0c;关键看车企的创新意愿和研发实力。 在2024年9月1…

【Orange Pi 5嵌入式应用编程】-用户空间GPIO控制

用户空间GPIO控制 文章目录 用户空间GPIO控制1、嵌入式Linux的GPIO子系统介绍1.1 sysfs文件访问GPIO1.2 通过字符设备访问GPIO1.3 库与工具2、RK3588的GPIO介绍3、用户空间操作GPIO编程3.1 硬件准备3.2 通过libgpio操作GPIO3.2.1 GPIO输出3.2.3 GPIO输入3.2.3 边沿事件检测(中断…

《Windows PE》3.2.3 NT头-扩展头

■扩展头&#xff08;可选标头仅限映像文件&#xff09; OptionalHeader字段描述了可执行文件的更多细节和布局信息&#xff0c;如图像基址、入口点、数据目录、节表等。它的具体结构取决于文件的机器架构&#xff0c;可以是IMAGE_OPTIONAL_HEADER32&#xff08;32位&#xff…

【论文笔记】Flamingo: a Visual Language Model for Few-Shot Learning

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Flamingo: a Visual Langu…

html空单元格的占位

先上代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title></head><body> <H1>我的WEB页面</H1><table border"2px" bgcolor"#7fffd4&…

【Ubuntu】安装常用软件包-mysql

我的几个服务是部署在docker的同一个网络里&#xff0c;这样相互访问就可以通过docker容器的名字访问&#xff0c;比如容器A访问容器B&#xff0c;就可以http://B:8080/xxx 这样访问&#xff0c;不用关心ip是多少。 所以mysql前面文章给安装到主机里&#xff0c;感觉有点坑自己…

JavaScript 网页设计案例 简单的电商案例 页面切换 数据搜索 动态网页

JavaScript 网页设计案例 简单的电商案例 页面切换 数据搜索 动态网页 1. 案例描述 以下是一个简单的产品展示网页&#xff0c;用户可以通过点击不同的产品类别按钮来查看相应的产品&#xff0c;且在鼠标悬停时显示产品详情。页面还将包含一个搜索框&#xff0c;用户可以输入…

深蕾半导体Astra™ SL1620详细介绍,嵌入式物联网处理器

一&#xff0c;SL1620是什么 Astra™ SL系列是深蕾半导体推出的高度集成的嵌入式物联网处理器SoC&#xff08;System on Chip&#xff09;系列产品&#xff0c;专为多模式消费者、企业和工业物联网工作负载而设计。SL1620是Astra™ SL系列中的一款成本和功耗优化的安全嵌入式So…