『表面』无序点云的快速三角化

news2024/11/22 11:24:32

 1、PCL中的贪婪投影三角化(GreedyProjectionTriangulation)算法

该算法用于将无序点云数据转换为表面三角网络模型的表面重建算法。可以根据点云数据中的几何信息,自动构建出具有连续性和平滑性的三角网络模型。

具体步骤:

  1. 预处理:首先,我们对输入的点云数据进行预处理,通过各种滤波和计算法向量的方法,来提取更准确的法向量信息。这个步骤可以帮助我们获得更好的表面重建结果。

  2. 投影:接下来,我们将点云数据投影到一个二维网格中。这个网格是通过将点云数据的边界用一个平面包围起来生成的。对于每个点,我们根据其在边界平面上的位置进行投影,并计算其表面的朝向。

  3. 三角化:使用贪婪投影三角化算法,我们将点云数据转换为一个三角网格模型。算法会从每个投影网格单元中选择与其邻域最接近的点,并利用这些点之间的连接关系构建三角形。

  4. 可选的后处理:最后,我们可以对生成的三角网格进行一些额外处理,例如平滤波和平滑法向量等,以使其更平滑和连续。

贪婪投影三角化算法具有较高的效率和鲁棒性。它可以处理大量的点云数据,并生成高质量的表面模型。但是需要注意的是,算法对于点云数据的边界比较敏感,并且在处理具有复杂几何结构或噪声较多的点云数据时可能会产生有限的结果。因此,在实际应用中,我们可能需要根据具体情况选择其他表面重建算法来获得更好的结果。

2. class pcl: :GreedyProjectionTriangulation< PointlnT>

类 GreedyProjectionTriangulation 实现了将三维点投影到某一局部二维坐标平面的贪婪三角化算法,该算法需要点云平滑,并且密度变化连续。

关键成员函数:

  • SetMaximumNearestNeighbors(unsigned)和SetMu(double):这两个函数的作用是控制搜索邻域大小。前者定义了可搜索的邻域个数,后者规定了被样本点搜索其邻近点的最远距离,(是为了适应点云密度的变化),特征值一般是50-100和2.5-3(或者1.5每栅格);
  • SetSearchRadius(double): 该函数设置了三角化后得到的每个三角形的最大可能边长;
  • SetMinimumAngle(double)和SetMaximumAngle(double) :这两个函数是三角化后每个三角形的最大角和最小角。两者至少要符合一个。典型值分别是10和120度(弧度);
  • SetMaximumSurfaceAgle(double)和SetNormalConsistency(bool):这两个函数是为了处理边缘或者角很尖锐以及一个表面的两边非常靠近的情况。为了处理这些特殊情况,函数SetMaximumSurfaceAgle(double)规定如果某点法线方向的偏离超过指定角度(注:大多数表面法线估计方法可以估计出连续变化的表面法线方向,即使在尖锐的边缘条件下),该点就不连接到样本点上。该角度是通过计算法向线段(忽略法线方向)之间的角度;
  • SetNormalConsistency(bool):保证法线朝向,如果法线方向一致性标识没有设定,就不能保证估计出的法线都可以始终朝向一致。第一个函数特征值为45度(弧度)、第二个函数缺省值为false。

代码:

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/features/normal_3d.h>
#include <pcl/surface/gp3.h> // 贪婪投影三角化算法
#include <pcl/visualization/pcl_visualizer.h>

int main(){
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PCLPointCloud2 cloud_blob; // pcl::PCLPointCloud2是一种通用的点云数据表示格式,可以存储不同类型和不同结构的点云数据
    pcl::io::loadPCDFile("/home/jason/file/pcl-learning/11surface表面/3无序点云的快速三角化/bun0.pcd", cloud_blob);
    pcl::fromPCLPointCloud2(cloud_blob, *cloud); // 转换为特定类型的点云数据

    // Normal estimation
    pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n; // 法线估计
    pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
    tree->setInputCloud(cloud);
    n.setInputCloud(cloud);
    n.setSearchMethod(tree);
    n.setKSearch(20);
    n.compute(*normals);

    // Concatenate the XYZ and normal fields
    pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);
    pcl::concatenateFields(*cloud, *normals, *cloud_with_normals);

    // 定义搜索树对象
    pcl::search::KdTree<pcl::PointNormal>::Ptr tree2(new pcl::search::KdTree<pcl::PointNormal>);
    tree2->setInputCloud(cloud_with_normals); // 点云构建搜索树

    pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3; // 定义三角化对象
    pcl::PolygonMesh triangles; // 用于存储最终三角化的模型

    // 三角化操作
    gp3.setSearchRadius(2.5);

    gp3.setMu(2.5); // 表示距离参数,用于控制点云投影到三角化表面时的最近邻数量,值越大表示距离越近
    gp3.setMaximumNearestNeighbors(100); // 设置点云的最大最近邻数量
    gp3.setMaximumSurfaceAngle(M_PI / 4); // 设置最大表面角度,用于控制三角化结果的平滑程
    gp3.setMinimumAngle(M_PI / 18); // 设置最小角度,用于控制三角化结果的细节程度
    gp3.setMaximumAngle(2*M_PI/3); // 设置最大角度,用于控制三角化结果的细节程度
    // 以上都是默认参数,可以不设置

    gp3.setNormalConsistency(false); //  设置法向一致性,表示是否保持法向一致;如果设置为true,则生成三角化结果时会对法向进行一致性检查和调整

    gp3.setInputCloud(cloud_with_normals);  // 设置带有法向信息的输入点云数据
    gp3.setSearchMethod(tree2); // 设置搜索方法,用于三角化操作时的点云搜索
    gp3.reconstruct(triangles); // 进行三角化操作,生成三角化结果

    std::vector<int> parts = gp3.getPartIDs(); // 获取三角化结果的部分ID信息
    std::vector<int> states = gp3.getPointStates(); // 获取三角化结果的状态信息



    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("cloud viewer"));
    viewer->addPolygonMesh(triangles, "my");
    viewer->addCoordinateSystem(1.0);
    viewer->initCameraParameters();

    while (!viewer->wasStopped()) {
    viewer->spinOnce();
}


    return 0;
}
点云原始数据

 

三角化后

 

 参考:

【PCL学习:无序点云的快速三角化】_点云三角化_xhgen的博客-CSDN博客

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

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

相关文章

马斯克在与创业公司OpenAI竞争的新竞标中公布了xAI

北京时间7月13日凌晨&#xff0c;马斯克在Twiiter上毫无预警地宣布&#xff1a;“xAI正式成立&#xff0c;去了解现实。”&#xff08;Announcing formation of xAI to understand reality.&#xff09;这是马斯克首次官宣xAI的进展。 xAI的Twitter账号中目前还没有多少内容&a…

嵌入式Linux开发实操(四):pinctrl和dt_binding

Linux/pinctrl subsystem,统一了各SOC/MCU厂商的PIN引脚管理了吗? pin命名遵循IC spec上的命名。它是如何实现驱动到硬件的对接的呢?在CPU、Memory等完成初始化加载之后,显然就进入到了嵌入式linux的核心部分,管理对接硬件,这正是pinctrl要完成的工作。 Linuxpinctrl架构…

el-date-picker 日期时间进行限制,精确到时分秒

需求&#xff1a;用户只能选择当时时间或当前时间之前的时间&#xff0c;且精确到时分秒 实现效果&#xff1a;用户只能选择当前时间的时间&#xff0c;如果选择是当天之前的时间&#xff0c;时分秒不做限制&#xff0c;如果选择的是当天时间&#xff0c;就要判断时分秒&#…

Stable Diffusion 丝滑无闪烁AI动画 Temporalkit+Ebsynth+Controlnet

早期的EbSynth制作的AI视频闪烁能闪瞎人的双眼,可以通过【temporalkit+ebsynth+controlnet】让视频变得丝滑不闪烁。 文章目录 插件准备丝滑视频制作插件准备 下载安装 EbSynth官网,这里需要输入email地址。 下载压缩包解压缩到任意位置,这里我放到了ebsynth_utility下。 …

Flowable边界事件-消息边界事件

消息边界事件 消息边界事件一、定义1. 图形标记2. 设置消息 选择消息3. XML标记 二、测试用例2.1 定时边界事件xml文件2.2 消息边界事件测试用例 总结 消息边界事件 一、定义 接收到消息触发事件 1. 图形标记 2. 设置消息 选择消息 3. XML标记 定时边界事件的XML <messag…

【sgWaterfall】Vue实现图文瀑布流布局模式,图片预加载显示占位区域阴影,加载完成后向上浮动动画出现

Vue实现图文瀑布流布局模式&#xff0c;图片预加载显示占位区域阴影&#xff0c;加载完成后向上浮动动画出现 sgWaterfall.vue源码 <template><ul :class"$options.name" :style"waterfallStyle"><li v-for"(a, i) in items "…

业务变革与架构双驱动的多项目管理︱海康威视流程变革咨询顾问张燕飞

海康威视数字技术股份有限公司流程与变革管理部流程变革咨询顾问张燕飞女士受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;业务变革与架构双驱动的多项目管理。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要…

如何在MySQL中安装示例数据库sakila

就像 SQLServer 示例数据库一样,MySQL 也有示例数据库,比如sakila;Sakila 数据库最初由 MySQL AB 文档团队的前成员 Mike Hillyer 开发,旨在提供一个标准模式,可用于书籍、教程、文章、示例等中的示例,它包含示例视图、存储过程和触发器。 以下是在服务器上安装sakila数…

33个字段,我乏了!

家人们&#xff0c;谁懂啊&#xff1f;&#xff1f;最近两天&#xff0c;一直在测试数据报告&#xff0c;一个页面有30多个字段的那种&#xff0c;从基础表写sql语句&#xff0c;执行&#xff0c;与页面显示的字段值进行对比&#xff0c;一个挨着一个&#xff0c;讲真&#xff…

热更新时:app经常因为HBuilder X的更新提示HTML5+ Runtime版本不匹配的问题

直接暴力解决问题。 "app-plus" : {"compatible": {"ignoreVersion": false,//可选&#xff0c;Boolean类型&#xff0c;是否忽略版本兼容检查提示}, }APP模块等相关配置改变还是需要整包APK更新。 只有热更新改前端代码&#xff0c;推荐直接配置…

驱动 DAY10

platform驱动实现 match-devicetree.c #include <linux/init.h> #include <linux/module.h> #include <linux/platform_device.h> #include <linux/mod_devicetable.h> #include <linux/gpio.h> #include <linux/of.h> #include <linu…

electron+vue3全家桶+vite项目搭建【21】自定义无边框窗口拖拽移动

文章目录 引入实现思路实现步骤1.主进程监听窗口移动2.通信工具补充ipc调用3.渲染进程封装通用拖拽组件 测试 引入 如果你尝试过透明窗口&#xff0c;并控制透明部分事件击穿&#xff0c;就会发现使用 drag属性样式去控制窗口拖拽会导致点击事件失效&#xff0c;并且带drag属性…

有没有后端程序员想要兼职的?

有一个非常有意思的现象&#xff1a; 后端看不起前端&#xff0c;认为前端是好入门&#xff0c;含金量低&#xff0c;一下就能学会的页面侠&#xff1b; 前端看不起后端&#xff0c;认为后端是每天CRUD、调参、拿来主义的搬砖工&#xff1b; 而实际上&#xff0c;大家都是给老板…

vue生命周期四个阶段(created和mount)

1.四个阶段 1&#xff09;必经阶段 2&#xff09;非必经阶段 提示&#xff1a;主动调用 vm.$destroy() 函数销毁后&#xff0c;可用 vm.$mount("#app") 将断开的 new Vue() 和页面重新建立虚拟 DOM 树&#xff0c;重新绑定起来挂载界面。 2. 生命周期钩子函数&…

【大数据】大数据简介

大数据简介 大数据基础平台架构实际应用关键技术 Hadoop 分布式计算平台Hadoop生态系统Hadoop安装和使用 HDFS分布式文件系统NamenodeSecondary NamenodeDataNodeblock 大数据基础 平台架构 实际应用 关键技术 Hadoop 分布式计算平台 Hadoop生态系统 Hadoop安装和使用 参考htt…

单向链表基本操作

目录 初始化链表 插入 删除 遍历 销毁 清空 初始化链表 代码&#xff1a; struct LinkNode* Init_LinkList() {struct LinkNode* head (struct LinkNode*)malloc(sizeof(struct LinkNode));head->data -1;head->next NULL;// 尾部指针struct LinkNode* pRear …

概率论的学习和整理15: 超几何分布,二项分布,泊松分布是如何趋近收敛的?

目录 1 问题&#xff1a; 2 结论 3 实验1 4 实验2 5 实验3 6 实验4 5 各种规律总结 5.1 1 5.2 2 5.3 3 5.4 4 6 超几何分布&#xff0c;二项分布&#xff0c;泊松分布&#xff0c;三者用EXCEL模拟 6.1 简单的扩展到泊松分布 6.2 比较整体的动态过程&…

在qt界面上内嵌拥有独立句柄的窗口

背景 在qt程序中&#xff0c;如果数据刷新频率过高&#xff0c;容易造成窗口卡顿&#xff0c;因为qt程序是整个窗口刷新&#xff0c;在此种背景下可以在qt程序的主程序上内嵌一个拥有独立句柄的窗口&#xff0c;两个窗口刷新就互不干扰。 案例 以下例子&#xff0c;在主窗口…

【技术指南】3D转换工具HOOPS Exchange的功能特征和典型使用场景全解析(一)

一、什么是 HOOPS Exchange&#xff1f; HOOPS Exchange 是一组软件库&#xff0c;可以帮助开发人员在开发应用程序时读取和写入主流的 2D 和 3D 格式。HOOPS Exchange 支持 在主流的3D 文件格式中读取 CAD 数据&#xff0c;并支持将 3D 数据转换为 PRC 数据格式&#xff0c;…

2.2 顺序表与链表特性对比

1. 插入删除操作对比 1. 顺序表插入删除元素 插入策略: 在某个位置插入元素时, 把从该位置开始的所有元素都往后挪一个位置, 规定顺序表最后一个元素后面的位置也是一个可插入位置. 后面的元素先往后挪动位置. 删除策略: 在某位置删除元素, 把从该位置之后的所有元素都往前…