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

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

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

相关文章:

  • 【Canvas与桌面】文山甲密铺桌面壁纸 1920*1080
  • 编写一个简单的Iinput_dev框架
  • 量子变分算法 (python qiskit)
  • 《Contrastive Language-Image Pre-Training with Knowledge Graphs》中文校对版
  • 基于JAVA+SpringBoot+Vue的华府便利店信息管理系统
  • 最新PHP网盘搜索引擎系统源码 附教程
  • 个体化神经调控 Neurolnavigation介绍
  • 基于SSM“多鱼”旧物交易平台的设计与实现
  • shodan2:绕过shodan高级会员限制+metasploit批量验证漏洞
  • Python浪漫之画一个圆月亮
  • 6.Linux按键驱动-阻塞与非阻塞
  • 安全知识见闻-脚本语言对与安全的重要性
  • 使用FRP搭建内网穿透服务(新版toml配置文件,搭配反向代理方便内网网站访问)【使用frp搭建内网穿透】
  • 索引的使用和优化
  • 基于SSM“毛毛宠物店”宠物信息交流平台的设计与实现
  • Linux中C/C++程序编译过程与动静态链接库概述
  • LeetCode438.找到字符串中所有字母异位词
  • Macos系统使用wine安装window的exe软件
  • Redis 线程控制 总结
  • 图片懒加载