当前位置: 首页 > article >正文

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

在三维点云数据处理中,提取平面上的多边形轮廓是一个常见任务。本文将介绍如何利用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.kler.cn/news/366921.html

相关文章:

  • 【设计模式-状态模式】
  • 【HTML】之form表单元素详解
  • 博客搭建之路:hexo增加搜索功能
  • LeetCode_231. 2 的幂_java
  • ArcGIS001:ArcGIS10.2安装教程
  • 使用text-embedding-3-small生成向量并将向量插入Mlivus Cloud用于语义搜索的深度解析与实战操作
  • Unity引擎:游戏开发的核心力量
  • python 深度学习 项目调试 图像分割 segment-anything
  • 微信小程序 - 动画(Animation)执行过程 / 实现过程 / 实现方式
  • RabbitMQ 发布确认高级部分
  • 语音交互:重塑人机对话的未来
  • 【Nas】X-Doc:jellyfin“该客户端与媒体不兼容,服务器未发送兼容的媒体格式”问题解决方案
  • 量子计算突破:下一个科技革命的风口浪尖在哪里?
  • Spring Boot 集成 PDFBox 实现PDF电子签章的简单应用
  • AI大模型开发架构设计(16)——ChatGPT Code Interpreter应用场景和技术原理动手实践
  • 【Python爬虫实战】Selenium自动化网页操作入门指南
  • 数据结构------手撕链表(一)【不带头单向非循环】
  • 掌握预测的准确性——使用 VAEneu 和 CRPS 的概率方法
  • PMP–一、二、三模–分类–11.风险管理–机会风险应对策略
  • 【C++笔记】内存管理
  • 实现简道云与企业微信的自动化数据集成
  • [C#][winform]基于yolov8的道路交通事故检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面
  • Java-图书管理系统
  • LeetCode105. 从前序与中序遍历序列构造二叉树(2024秋季每日一题 49)
  • 地磁传感器(学习笔记上)
  • 微信小程序文字转语音播报案例