首页 > 其他分享 >平面点云凹边界提取

平面点云凹边界提取

时间:2024-11-07 12:19:30浏览次数:3  
标签:提取 剖分 hull 外接圆 shape pcl 点云 平面 三角形

目录

1 原理介绍

        α-shape 的基础概念

数学公式推导

2.1 外接圆半径

2.2 根据 α 参数筛选三角形

2.3 构建 α-shape

2.4 参数调整与优化

3 α-shape 的构建步骤

4 示例代码

        取点云的凹边界是计算几何中的一个经典问题。凹边界与凸边界不同,它能捕捉到数据的细节和凹形结构。在点云处理中,凹边界提取用于描述点云的外形。以下是关于凹边界提取的详细介绍:

1 原理介绍

        凹边界提取的基本思想是找到一个边界,该边界可以包围点云中的所有点,同时允许凹陷,以更紧密地拟合点云的形状。凹边界的计算通常基于一个参数,该参数决定了边界的细节程度。常用的方法包括 α-球体(α-shape)方法。

α-shape 的基础概念

  1. Delaunay 三角剖分: 给定一个点集,Delaunay 三角剖分是该点集的一个三角剖分,其特点是任何一个三角形的外接圆的内部不包含其他点。Delaunay 三角剖分是构建 α-shape 的基础。

  2. α-ball: α-ball 是指半径为 α 的球体。在二维情况下,这个球体是一个圆。在 α-shape 方法中,我们使用 α-ball 来确定哪些边和面(在三维中)属于 α-shape。

  3. α-shape: 对于给定的点集和 α 值,α-shape 是由 Delaunay 三角剖分中的一部分边和面构成的多边形或多面体。具体而言,如果一个三角形的外接圆半径小于 α,则该三角形在 α-shape 中被保留。

数学公式推导

2.1 外接圆半径

        给定一个三角形,其顶点为 A(x1,y1), B(x2,y2), C(x3,y3),我们可以计算三角形的三条边的长度:

外接圆半径 R 可以通过三角形的边长及其面积来计算。公式如下:

其中 a,b,c 是三角形的三条边的长度,A 是三角形的面积,计算方法如下:

是三角形的半周长

2.2 根据 α 参数筛选三角形

  • α 参数: 这是一个用户定义的参数,控制 α-shape 的细节程度。α 值越小,保留的细节越多。

  • 筛选过程:

    • 遍历 Delaunay 三角剖分中的每个三角形。
    • 如果三角形的外接圆半径小于或等于 α,则保留该三角形;否则,去除。
  • 结果: 通过这种筛选,我们将只保留那些满足 α 条件的三角形或四面体,它们构成 α-shape 的基本单元。

2.3 构建 α-shape

  • 连接: 将保留的三角形或四面体连接起来构成一个多边形或多面体,即 α-shape。

  • 拓扑结构: 保证这些单元之间的拓扑连接性,以形成一个封闭的形状。

2.4 参数调整与优化

  • α 参数调整: 根据具体需求调整 α 值,观察 α-shape 的变化。较小的 α 值可能生成更复杂的形状,而较大的 α 值则更接近于凸包。

  • 优化: 通过优化算法或启发式方法找到最佳 α 值,使得生成的 α-shape 能够最准确地描述点集的结构。

3 α-shape 的构建步骤

  1. 计算 Delaunay 三角剖分: Delaunay 三角剖分的性质是对于任意一个三角形,其外接圆内不包含任何其他点。这一性质使得 Delaunay 三角剖分在构建 α-shape 时非常有效,因为我们可以通过简单地遍历三角形并计算其外接圆半径来决定是否保留这个三角形。

  2. 计算外接圆半径: 对于 Delaunay 三角剖分中的每个三角形,计算其外接圆半径 R。

  3. 筛选三角形: 遍历所有的三角形,保留那些外接圆半径 R≤α 的三角形。这是因为较小的 α 值会去除那些包含较多空洞的三角形,而较大的 α 值会保留更多的细节。

  4. 生成 α-shape: 使用保留下来的三角形生成 α-shape,即为最终的凹边界。

4 示例代码

#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/surface/concave_hull.h>
#include <pcl/io/ply_io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/geometry/planar_polygon.h>
int main() {
    // 创建点云对象并加载数据
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("cloud1.pcd", *cloud) == -1) {
        PCL_ERROR("Couldn't read file input.pcd\n");
        return -1;
    }

    // 创建 ConcaveHull 对象并设置参数
    pcl::ConcaveHull<pcl::PointXYZ> concave_hull;
    concave_hull.setInputCloud(cloud);
    concave_hull.setAlpha(0.5); // 设置 alpha 值,0.1 是一个经验值

    // 计算凹边界
    pcl::PointCloud<pcl::PointXYZ>::Ptr hull(new pcl::PointCloud<pcl::PointXYZ>);
    std::vector<pcl::Vertices> polygons;
    concave_hull.reconstruct(*hull, polygons);

    // 初始化可视化器
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
    viewer->setBackgroundColor(0, 0, 0);

    // 添加点云和凹边界到可视化器
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color(cloud, 255, 255, 255);
    viewer->addPointCloud<pcl::PointXYZ>(cloud, cloud_color, "original cloud");

    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> hull_color(hull, 255, 255, 0);
    viewer->addPointCloud<pcl::PointXYZ>(hull, hull_color, "concave hull");
    pcl::PointCloud<pcl::PointXYZ>::Ptr polygon_points(new pcl::PointCloud<pcl::PointXYZ>);
    // 添加多边形
    for (const auto& polygon : polygons) {

        for (const auto& idx : polygon.vertices) {
            polygon_points->points.push_back(hull->points[idx]);
        }

    }
    pcl::PlanarPolygon<pcl::PointXYZ> polygon;
    polygon.setContour(*polygon_points);

     viewer->addPolygon(polygon, 255.0, 0, 0, "polygon");
    // 设置点云属性
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "original cloud");
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "concave hull");

    // 主循环
    while (!viewer->wasStopped()) {
        viewer->spinOnce(0);
    }

    return 0;
}

标签:提取,剖分,hull,外接圆,shape,pcl,点云,平面,三角形
From: https://blog.csdn.net/twnkie/article/details/143492847

相关文章

  • 抖音新店批量提取工具新开店铺采集软件深度研究
    importrequestsimportjson假设的API端点(这不是抖音的API,只是一个示例)API_ENDPOINT="https://api.example.com/shops/new"假设的API密钥(在实际应用中,你应该从安全的地方获取这个密钥)API_KEY="your_api_key_here"请求头,包含API密钥headers={"Authorization":f"Bear......
  • 节省50%人工录入时间!免费开源AI工具让法律文件数据提取更高效
    法律行业痛点:处理大量的合同、诉讼材料和财务报告等文件是一项繁琐且耗时的工作。这些文件中的表格常包含关键信息,如费用清单、时效统计和条款列表等,手动录入和整理这些数据不仅效率低下,而且容易出错。思通数科的表格识别技术,结合深度学习和计算机视觉,能够自动提取和结构化这些表......
  • Dedecms批量提取第一张图片作为缩略图的代码
    <?php//获取文章内容functionbody($id){$sql="SELECTbodyFROMdede_archivesWHEREid='$id'";$result=mysql_query($sql);$row=mysql_fetch_assoc($result);return$row['body'];}//提取变量中第一个图片地址functio......
  • Sigrity Power SI 3D-EM Full Wave Extraction模式如何进行S参数提取和观测3D电磁场和
    SigrityPowerSI3D-EMFullWaveExtraction模式如何进行S参数提取和观测3D电磁场和远场操作指导(三)-去嵌SigrityPowerSI3D-EMFullWaveExtraction模式如何进行S参数提取和观测3D电磁场和远场操作指导(三)-去嵌  SigrityPowerSI如何使用3D-EMFullWaveExtracti......
  • 【shell脚本】利用Nmap扫描结果提取IP地址
    原创脚本家园在网络安全和运维管理中,我们常常需要扫描网络以获取设备信息,并对这些信息进行处理和分析。Nmap(NetworkMapper)是一款功能强大的网络扫描工具,它可以帮助我们获取网络中的设备信息,包括IP地址、MAC地址、开放的端口等。今天,我们将通过一篇实战文章,介绍如何利用Bash脚......
  • 从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
    文章目录一、引言二、智能文档处理“百宝箱”概述三、可视化文档解析前端TextInParseX3.1TextInParseX简介3.2技术特点3.3TextInParseX功能四、向量化acge-embedding模型4.1向量化模型acge-embedding技术亮点总结4.2Embedding嵌入/向量化4.3向量化模型效果......
  • 抖音新店采集器抖音商城小店新开店铺批量采集软件卖家联系方式提取工具
    抖音新店采集器抖音商城小店新开店铺批量采集软件卖家联系方式提取工具作者V♥553813195针对“抖店精选联盟商家电话采集软件”、“抖音买家店铺信息采集器”以及“新店提取工具”,以下是一些相关介绍:一、抖店精选联盟商家电话采集软件这类软件通常具有自动化采集抖音平台上精......
  • 什么是ETL(提取、转换、加载)过程在数据处理中的重要性
    ETL(提取、转换、加载)过程在数据处理中承担着至关重要的职责,它直接决定了数据分析的质量和效率。ETL过程包括三个主要步骤:提取(Extract)、转换(Transform)和加载(Load),是企业数据仓库(DW)建设和维护的核心。提取步骤负责从多个数据源收集信息、转换步骤将原始数据清洗并转换为统一格式以便......
  • NLP segment-03-基于 TF-IDF 实现关键词提取 java 开源实现
    拓展阅读分词系列专题jieba-fenci01结巴分词原理讲解segmentjieba-fenci02结巴分词原理讲解之数据归一化segmentjieba-fenci03结巴分词与繁简体转换segmentjieba-fenci04结巴分词之词性标注实现思路speechTaggingsegment关键词系列专题NLPsegment-01-聊一聊......
  • 精选联盟商家电话采集系统 抖音商家联系方式提取软件
    使用精选联盟商家电话采集系统及抖音商家联系方式提取软件进行电话信息收集:详细教程及代码文章分享作者:1143561141(v同q)导言:在现代商业运营中,获取商家的联系方式是非常重要的。本教程将向你展示如何使用精选联盟商家电话采集系统和抖音商家联系方式提取软件来有效地收集商家的......