在平面模型上提取凹多边形的点云处理

在三维点云数据处理中,提取平面上的多边形轮廓是一个常见任务。本文将介绍如何利用PCL(Point Cloud Library)从一个平面模型上提取凹多边形。具体步骤包括点云数据加载、去除噪声、平面分割、点云投影、凹多边形提取以及保存结果。


1. 点云数据的加载与滤波

首先,我们从一个.pcd文件中加载点云数据,并通过直通滤波(PassThrough)去除噪声。滤波器用于减少点云中无效点,以便更清晰地提取感兴趣的表面。具体操作如下:

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>), cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCDReader reader;
reader.read("../table_scene_mug_stereo_textured.pcd", *cloud);pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud(cloud);
pass.setFilterFieldName("z");
pass.setFilterLimits(0, 1.1);
pass.filter(*cloud_filtered);

以上代码首先读取点云数据 table_scene_mug_stereo_textured.pcd,然后通过设置 z 轴范围的阈值 [0, 1.1],去除该范围之外的噪声点。处理后,保留的点云数据存储在 cloud_filtered 中。

2. 平面分割

在点云处理中,平面分割是提取平面模型的关键步骤。这里我们使用 RANSAC 随机采样一致性算法来从滤波后的点云中找到一个平面模型。该算法通过迭代随机选择点,来拟合符合平面条件的点集。

pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
pcl::SACSegmentation<pcl::PointXYZ> seg;
seg.setOptimizeCoefficients(true);
seg.setModelType(pcl::SACMODEL_PLANE);
seg.setMethodType(pcl::SAC_RANSAC);
seg.setDistanceThreshold(0.01);
seg.setInputCloud(cloud_filtered);
seg.segment(*inliers, *coefficients);

代码中,setModelType 设置分割模型为 SACMODEL_PLANE,即平面模型;setMethodType 设置分割方法为 SAC_RANSAC,它能够在有噪声的情况下找到平面模型;setDistanceThreshold 定义了与平面的最大允许距离。

分割过程结束后,存储了属于平面模型的内点索引(inliers)和平面模型的系数(coefficients),即描述平面位置和朝向的信息。

3. 点云投影

为了将平面模型点云严格投影到分割平面上,使用 ProjectInliers 投影滤波器将分割出的平面模型点云在平面上进行投影。这一步确保所有内点严格位于平面上,有助于生成更精确的多边形轮廓。

pcl::ProjectInliers<pcl::PointXYZ> proj;
proj.setModelType(pcl::SACMODEL_PLANE);
proj.setIndices(inliers);
proj.setInputCloud(cloud_filtered);
proj.setModelCoefficients(coefficients);
proj.filter(*cloud_projected);

在这里,我们将投影模型设置为平面,并使用分割后的 inlierscoefficients。输出的投影点云 cloud_projected 包含了所有严格位于平面上的点。

4. 提取凹多边形

凹多边形提取是本代码的核心步骤。通过 ConcaveHull 函数,我们可以从投影点云中提取凹多边形轮廓。凹多边形与凸多边形不同,它可以更好地贴合不规则的平面边缘。

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_hull(new pcl::PointCloud<pcl::PointXYZ>);
pcl::ConcaveHull<pcl::PointXYZ> chull;
chull.setInputCloud(cloud_projected);
chull.setAlpha(0.1);
chull.reconstruct(*cloud_hull);

ConcaveHull 类的 setAlpha 参数控制多边形的形状,较小的 alpha 值(如 0.1)生成的多边形更贴近原始点云,alpha 值越大生成的轮廓越平滑。reconstruct 函数执行多边形生成操作,结果存储在 cloud_hull 中。

5. 保存并输出结果

提取的凹多边形轮廓保存为一个新的 .pcd 文件,便于后续操作或可视化。

pcl::PCDWriter writer; writer.write("../table_scene_mug_stereo_textured_hull.pcd", *cloud_hull, false);


总结

本文介绍了从平面点云模型中提取凹多边形轮廓的全过程。我们首先对原始点云数据进行滤波以去除无关噪声,然后通过 RANSAC 算法提取平面模型,紧接着将平面点云投影到平面上,最后使用 ConcaveHull 提取出平面上的凹多边形轮廓。

这些步骤在点云处理中十分关键。通过对点云的分割和轮廓提取,可以更好地识别、提取物体的边界信息。这种技术应用广泛,尤其在物体识别、三维建模、机器视觉等领域,对于构建结构化的三维模型和进行形状分析非常有帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode:263. 丑数 + 数学】

在这里插入代码片 &#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕…

apply call bind 简介

Function.prototype.call(thisArg [, arg1, arg2, …]) call() 简述 call() 方法 调用一个函数, 其具有一个指定的 this 值和分别地提供的参数(参数的列表)。当第一个参数为 null、undefined 的时候&#xff0c; 默认 this 上下文指向window。 call() 简单实例 const name …

【项目复现】——DDoS-SDN Detection Project

文章目录 概要整体架构流程1. 系统和网络配置2. SDN控制器配置3. 流量生成4. 数据采集5. DDoS检测机制6. 机器学习模型训练7. 实时检测部署 前期准备复现流程第一步&#xff1a;系统和网络配置1.1 安装和设置操作系统1.2 安装VirtualBox和Mininet1.3 创建SDN网络拓扑 第二步&am…

探索现代软件开发中的持续集成与持续交付(CI/CD)实践

探索现代软件开发中的持续集成与持续交付&#xff08;CI/CD&#xff09;实践 随着软件开发的飞速进步&#xff0c;现代开发团队已经从传统的开发模式向更加自动化和灵活的开发流程转变。持续集成&#xff08;CI&#xff09; 与 持续交付&#xff08;CD&#xff09; 成为当下主…

w~自动驾驶合集6

我自己的原文哦~ https://blog.51cto.com/whaosoft/12286744 #自动驾驶的技术发展路线 端到端自动驾驶 Recent Advancements in End-to-End Autonomous Driving using Deep Learning: A SurveyEnd-to-end Autonomous Driving: Challenges and Frontiers 在线高精地图 HDMa…

iOS AVAudioSession 详解【音乐播放器的配置】

前言 在 iOS 音频开发中&#xff0c;AVAudioSession 是至关重要的工具&#xff0c;它控制着应用的音频行为&#xff0c;包括播放、录音、后台支持和音频中断处理等。对于音乐播放器等音频需求强烈的应用&#xff0c;设计一个合理的 AVAudioSession 管理体系不仅能保证音频播放…

三周精通FastAPI:16 Handling Errors处理错误

官网文档&#xff1a;https://fastapi.tiangolo.com/zh/tutorial/handling-errors 处理错误 某些情况下&#xff0c;需要向客户端返回错误提示。 这里所谓的客户端包括前端浏览器、其他应用程序、物联网设备等。 需要向客户端返回错误提示的场景主要如下&#xff1a; 客户端…

FastAPI、langchain搭建chatbot,langgraph实现历史记录

环境&#xff1a;openEuler、python 3.11.6、Azure openAi、langchain 0.3.3、langgraph 0.2.38 背景&#xff1a;基于FastAPI、langchain实现一个QA系统&#xff0c;要求实现历史记录以及存储特征信息 时间&#xff1a;20241022 说明&#xff1a;在历史记录的存储中&…

R语言机器学习算法实战系列(十四): CatBoost分类算法+SHAP值 (categorical data gradient boosting)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍CatBoost的原理CatBoost的步骤教程下载数据加载R包导入数据数据预处理数据描述数据切割设置数据对象调节参数训练模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC Curv…

mysql 通过GROUP BY 聚合并且拼接去重另个字段

我的需求&#xff1a; 我想知道同一个手机号出现几次&#xff0c;并且手机号出现在哪些地方。下面是要的效果。 源数据: CREATE TABLE bank (id bigint(20) unsigned NOT NULL AUTO_INCREMENT,user_id int(11) NOT NULL DEFAULT 0,tel varchar(255) COLLATE utf8mb4_unicode_…

【自然语言处理】BERT模型

BERT&#xff1a;Bidirectional Encoder Representations from Transformers BERT 是 Google 于 2018 年提出的 自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;它基于 Transformer 架构的 Encoder 部分。BERT 的出现极大提升了 NLP 任务的性能&#xff0c;如问答系…

Python | Leetcode Python题解之第509题斐波那契数

题目&#xff1a; 题解&#xff1a; class Solution:def fib(self, n: int) -> int:if n < 2:return nq [[1, 1], [1, 0]]res self.matrix_pow(q, n - 1)return res[0][0]def matrix_pow(self, a: List[List[int]], n: int) -> List[List[int]]:ret [[1, 0], [0, …

自动化部署-02-jenkins部署微服务

文章目录 前言一、配置SSH-KEY1.1 操作jenkins所在服务器1.2 操作github1.3 验证 二、服务器安装git三、jenkins页面安装maven四、页面配置自动化任务4.1 新建任务4.2 选择4.3 配置参数4.4 配置脚本 五、执行任务5.1 点击执行按钮5.2 填写参数5.3 查看日志 六、查看服务器文件七…

51单片机STC8G串口Uart配置

测试环境 单片机型号&#xff1a;STC8G1K08-38I-TSSOP20&#xff0c;其他型号请自行测试&#xff1b; IDE&#xff1a;KEIL C51&#xff1b; 寄存器配置及主要代码 STC8G系列单片机具有4个全双工异步串行通信接口&#xff1b;本文以串口1为例&#xff0c;串口1有4种工作方式…

java疫苗发布和接种预约系统源码(springboot)

项目简介 疫苗发布和接种预约系统实现了以下功能&#xff1a; 疫苗发布和接种预约系统的主要使用者分为&#xff1a; 管理员对公告信息&#xff0c;医院信息&#xff0c;疫苗信息&#xff0c;医生信息&#xff0c;用户信息&#xff0c;论坛帖子信息以及预约接种信息等信息进行…

C语言程序设计:现代设计方法习题笔记《chapter5》下篇

第七题 题目分析&#xff1a;求最大最小值转换为条件判断问题&#xff0c;最大值有四种可能&#xff0c;最小值相应有三种情况&#xff0c;给出下列代码。 示例代码&#xff1a; #include <stdio.h>int main() {int num1, num2, num3, num4; // 定义四个变量来存储输入…

nfs服务部署案例

目录 nfs服务介绍 案例信息 服务端部署 安装服务 启动服务 修改配置文件 重新加载配置文件 创建存储目录 客户端部署 安装服务 挂载nfs目录 测试 nfs服务介绍 nfs是网络文件系统&#xff0c;类似与windows的共享文件&#xff0c;用于存储文件。 nfs依赖于rpc服务才…

【C++】抱C++中的函数式编程:使用`std::function`和Lambda表达式简化代码

C自C11标准引入了lambda表达式、std::function和std::bind&#xff0c;为开发者带来了强大的函数式编程特性。函数式编程让代码更加灵活、简洁、可重用&#xff0c;并使得开发者可以轻松处理回调、事件驱动编程和更复杂的函数组合。本文将详细介绍C中函数式编程的关键工具&…

解码专业术语——应用系统开发项目中的专业词汇解读

文章目录 引言站点设置管理具体要求包括&#xff1a; Footer管理基于URL的权限控制利用数据连接池优化数据库操作什么是数据连接池&#xff1f;优化的优势 利用反射改造后端代码&#xff0c;AJAX反射的作用及其在后端代码中的应用AJAX 实现前后端无刷新交互 引言 创新实践项目二…

Linux常用命令1

切换目录 cd [rootlocalhost menge]# cd /[rootlocalhost /]# cd: cd [-L|[-P [-e]] [-]] [目录] 查看当前的目录 pwd 浏览目录内容 ls ls浏览后颜色表示 白色&#xff1a;普通文件 蓝色&#xff1a;目录 红色&#xff1a;压缩包文件 黄色&#xff1a;设备文件 绿…