CloudCompare二次开发之如何通过PCL进行点云曲面重建?

news2024/11/17 23:59:49

文章目录

  • 0.引言
  • 1.CloudCompare界面设计重建(reconstruct)按钮
  • 2.使用贪婪三角化进行曲面重建(Surface_Rec)

0.引言

  因笔者课题涉及点云处理,需要通过PCL进行点云数据一系列处理分析,查阅现有网络资料,对常用PCL点云曲面重建进行代码实现,本文记录曲面重建实现过程。

1.CloudCompare界面设计重建(reconstruct)按钮

  (1)设计.ui文件
  ①设计按钮
  在这里插入图片描述

  ②编译.ui
  在这里插入图片描述

  (2)修改mainwindow.h文件
  在这里插入图片描述

//点云重建
void doActionPCLSurface_Rec(); // 使用贪婪三角化进行曲面重建

  (3)修改mainwindow.cpp文件
  ①添加头文件
  在这里插入图片描述

#include <pcl/filters/radius_outlier_removal.h>
#include <pcl/filters/voxel_grid.h>  
#include <pcl/filters/statistical_outlier_removal.h>  
#include <pcl/surface/mls.h>  
#include <pcl/features/normal_3d.h>  
#include <pcl/surface/gp3.h>

  ②添加实现代码
  在这里插入图片描述

//使用贪婪三角化进行曲面重建
void MainWindow::doActionPCLSurface_Rec()  
{  
}

  ③添加信号槽函数
  在这里插入图片描述

onnect(m_UI->actionSurface_Rec, &amp;QAction::triggered, this, &amp;MainWindow::doActionPCLSurface_Rec);//使用贪婪三角化进行曲面重建

  (4)生成
  在这里插入图片描述

2.使用贪婪三角化进行曲面重建(Surface_Rec)

  (1)实现代码

typedef pcl::PointXYZ PointT;
//使用贪婪三角化进行曲面重建  
void MainWindow::doActionPCLSurface_Rec() {  
    if (getSelectedEntities().size() != 1)  
    {  
        ccLog::Print(QStringLiteral("只能选择一个点云实体"));  
    return;  
    }  
    ccHObject* entity = getSelectedEntities()[0];  
    ccPointCloud* ccCloud = ccHObjectCaster::ToPointCloud(entity);  
    // ---------------------------读取数据到PCL----------------------------------  
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);  
    cloud->resize(ccCloud->size());  
    for (int i = 0; i < cloud->size(); ++i)  
    {  
        const CCVector3* point = ccCloud->getPoint(i);  
        cloud->points[i].x = point->x;  
        cloud->points[i].y = point->y;  
        cloud->points[i].z = point->z;  
    }  
    pcl::PointCloud<PointT>::Ptr cloud_downSampled(new pcl::PointCloud<PointT>);  
    pcl::PointCloud<PointT>::Ptr cloud_filtered(new pcl::PointCloud<PointT>);  
    pcl::PointCloud<PointT>::Ptr cloud_smoothed(new pcl::PointCloud<PointT>);  
    // 下采样,同时保持点云形状特征  
    pcl::VoxelGrid<PointT> downSampled;  //创建滤波对象  
    downSampled.setInputCloud(cloud);            //设置需要过滤的点云给滤波对象  
    downSampled.setLeafSize(0.01f, 0.01f, 0.01f);  //设置滤波时创建的体素体积为1cm的立方体  
    downSampled.filter(*cloud_downSampled);           //执行滤波处理,存储输出  
    // 统计滤波  
    pcl::StatisticalOutlierRemoval<PointT> statisOutlierRemoval;       //创建滤波器对象  
    statisOutlierRemoval.setInputCloud(cloud_downSampled);            //设置待滤波的点云  
    statisOutlierRemoval.setMeanK(50);                                //设置在进行统计时考虑查询点临近点数  
    statisOutlierRemoval.setStddevMulThresh(3.0);                     //设置判断是否为离群点的阀值:均值+1.0*标准差  
    statisOutlierRemoval.filter(*cloud_filtered);                     //滤波结果存储到cloud_filtered  
     // 对点云重采样  
    pcl::search::KdTree<PointT>::Ptr treeSampling(new pcl::search::KdTree<PointT>);  
    pcl::PointCloud<PointT> mls_point;  
    pcl::MovingLeastSquares<PointT, PointT> mls;  
    mls.setComputeNormals(false);  
    mls.setInputCloud(cloud_filtered);  
    mls.setPolynomialOrder(2);  
    mls.setPolynomialFit(false);  
    mls.setSearchMethod(treeSampling);  
    mls.setSearchRadius(0.05);  
    mls.process(mls_point);  
    // 输出重采样结果  
    cloud_smoothed = mls_point.makeShared();  
    // 法线估计  
    pcl::NormalEstimation<PointT, pcl::Normal> normalEstimation;  
    normalEstimation.setInputCloud(cloud_smoothed);  
    pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT>);  
    normalEstimation.setSearchMethod(tree);  
    pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);  
    normalEstimation.setKSearch(10);  
    normalEstimation.compute(*normals);  
    //Triangle Projection  
    pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);  
    pcl::concatenateFields(*cloud_smoothed, *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(0.1);  
    gp3.setMu(2.5);  
    gp3.setMaximumNearestNeighbors(52);  
    gp3.setMaximumAngle(2 * M_PI / 3);  
    gp3.setMinimumAngle(M_PI / 18);  
    gp3.setMaximumSurfaceAngle(M_PI / 4);  
    gp3.setNormalConsistency(false);  
    gp3.setInputCloud(cloud_with_normals);  
    gp3.setSearchMethod(tree2);  
    gp3.reconstruct(triangles);  
    ccPointCloud* newPointCloud = new ccPointCloud(QString("reconstruct_points"));  
    for (int i = 0; i < cloud_with_normals->size(); ++i)  
    {  
        double x = cloud_with_normals->points[i].x;  
        double y = cloud_with_normals->points[i].y;  
        double z = cloud_with_normals->points[i].z;  
        newPointCloud->addPoint(CCVector3(x, y, z));  
    }  
    //创建一个Mesh网格  
    ccMesh* mesh = new ccMesh(newPointCloud);  
    mesh->setName(ccCloud->getName() + "-mesh");  
    unsigned int v1, v2, v3;                //用于接收顶点  
    for (int i = 0; i < triangles.polygons.size(); i++) {  
        v1 = triangles.polygons[i].vertices[0];  
        v2 = triangles.polygons[i].vertices[1];  
        v3 = triangles.polygons[i].vertices[2];  
        mesh->addTriangle(v1, v2, v3);                //通过这种方式来添加三角面片  
    }  
    mesh->setTempColor(ccColor::Rgba(rand() % 255, rand() % 255, rand() % 255, 60));  
    mesh->showColors(true);  
    // ------------------------PCL->CloudCompare--------------------------------  
    if (ccCloud->getParent())  
    {  
        ccCloud->getParent()->addChild(mesh);  
    }  
    ccCloud->setEnabled(false);  
    addToDB(mesh);  
    refreshAll();  
    updateUI();  
}

  (2)重建结果
  ①重建前
  在这里插入图片描述

  ②重建后
  在这里插入图片描述

参考资料:
[1] 来吧!我在未来等你!. CloudCompare二次开发之如何配置PCL点云库?; 2023-05-15 [accessed 2023-05-17].
[2] Tech沉思录. PCL点云使用贪婪三角化进行曲面重构; 2019-09-06 [accessed 2023-05-17].
[3] 大鱼BIGFISH. CloudCompare&PCL AlphaShape算法曲面重建; 2022-10-26 [accessed 2023-05-17].
[4] 点云侠. PCL 泊松曲面重建法(多线程加速版); 2023-02-01 [accessed 2023-05-17].
[5] 悠缘之空. PCL函数库摘要——点云曲面重建; 2021-11-07 [accessed 2023-05-17].

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

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

相关文章

SD webui 手记

源代码地址&#xff1a; https://github.com/AUTOMATIC1111/stable-diffusion-webui git拉取代码后&#xff0c;windows下支持根目录直接运行 webui-user.bat&#xff0c;前提本地需要先安装python环境&#xff0c;略过&#xff0c;我们直接跑源码玩 安装依赖 pip install …

Linux 指令(二)+完整思维导图+实图例子+深入细节+通俗易懂建议收藏

绪论 对于指令的学习&#xff0c;是一个漫长的过程&#xff0c;因为一般在后台服务器上为了减少刷新图形化界面消耗资源都是呈现出命令行的形式&#xff0c;对此我们必选要掌握好Linux的指令。今天我们接着上一章的指令来继续学习更多的指令。 话不多说安全带系好&#xff0c;发…

字节给我狠狠上了一课:危机来的时候你连准备时间都没有!

各大互联网公司的接连裁员&#xff0c;政策限制的行业接连消失&#xff0c;让今年的求职雪上加霜&#xff0c;想躺平却没有资本&#xff0c;还有人说软件测试岗位饱和了&#xff0c;对此很多求职者深信不疑&#xff0c;因为投出去的简历回复的越来越少了。甚至还有不少大厂直接…

【Linux】基本指令,拥抱Linux的第一步

[Linux]常见指令 Linux基本指令指令的本质ls指令pwd指令cd指令touch指令mkdir指令(重要)rmdir&&rm指令(重要)man指令&#xff08;重要&#xff09;cp指令&#xff08;重要&#xff09;mv指令&#xff08;重要&#xff09;重定向cat指令more指令less指令&#xff08;重要…

【C++模板】——template

C模板 模板的引入函数模板函数模板的实例化模板参数匹配原则 类模板类模板的定义格式类模板的实例化 &#x1f340;小结&#x1f340; &#x1f389;博客主页&#xff1a;小智_x0___0x_ &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1…

Unity之OpenXR+XR Interaction Toolkit如何自定义VR按键

一.前言 上一篇文章我们介绍了Unity的新版本InputSyste如何使用,这一篇文章,我们主要说一下,在新版基于OpenXR的VR项目中,如何自定义VR按钮的功能。 二.Samples介绍 我们使用XR Interaction Toolkit插件时,它的几个Samples是非常有用的。如下所示: 它们分别是: 1.Sta…

MySQL 教程---菜鸟教程

文章目录 MySQL 教程登录 MySQL数据库操作数据类型创建数据表删除数据表插入数据查询数据 MySQL 教程 关系型数据库管理系统&#xff08;RDBMS&#xff09; RDBMS 术语&#xff1a; 数据库&#xff1a;数据库是一些关联表的集合。数据表&#xff1a;表是数据的矩阵。在一个数…

python 中常见变量类型

数值 a 10 b 123 … 字符串 在python中 用单引号’‘和双引号""括起来的都是字符串,不使用引号括起来的不是字符串&#xff0c;字符串是使用最多的数据类型&#xff0c;用来表示一段文本信息。 比如&#xff1a; a ‘123’ b “123” 字符串之间可以用加法运算…

dubbo处理自定义异常

dubbo处理自定义异常 背景 在实际项目中&#xff0c;我们不可避免地需要使用自定义的异常&#xff0c;一般这个异常会继承RuntimeException&#xff0c;然后我们通过RestControllerAdvice注解&#xff0c;拦截业务异常类&#xff0c;做一些处理&#xff0c;但是在使用dubbo构…

六级备考28天|CET-6|听力第三讲|篇章的做题方法与练习法|2022年6月考题9-11题|16:15-17:15

目录 1. 笔记 2. 听力原文复现 (9)问题9 (10)问题10 (11)问题11 08:00开始播放 两/三个选项大面积同时出现了听力中一句话&#xff0c;一般排除这两/三个选项 1. 笔记 2. 听力原文复现 (9)问题9 -What have researchers done for the first time in history? The re…

c++ boost库学习-01-lexical_cast

一、C/C数值转换函数 C/C语言提供了几个标准库函数&#xff0c;可以将字符串、整型浮点型等相互转换。 atof()&#xff1a;将字符串转换为双精度浮点型值。 atoi()&#xff1a;将字符串转换为整型值。 atol()&#xff1a;将字符串转换为长整型值。 itoa()&#xff1a;将字符串…

redis的几种集群方式

https://www.zhihu.com/people/pan-zhi-74-31 Redis集群介绍Redis集群一般有四种方式&#xff0c;分别为&#xff1a;主从复制、哨兵模式、Cluster以及各大厂的集群方案。在3.0版本之前只支持单实例模式&#xff0c;3.0之后支持了集群方式。在3.0之前各大厂为了解决单实例Redis…

为Eclipse安装lombok插件

因为原生的Eclipse没有lombok插件&#xff0c;所以即使项目引入了lombok依赖也无法使用Data等常用标签。下面介绍一下如何手动为Eclipse添加lombok插件&#xff0c;具体操作步骤如下&#xff1a; &#xff08;1&#xff09;打开Download地址&#xff0c;点击页面中间的超链接下…

k8s集群内带GPU工作节点配置显卡驱动

k8s集群内带GPU工作节点配置显卡驱动 系统为Centos7 一、下载、安装显卡驱动 查看显卡型号 [rootVM-3-9-centos user]# lspci | grep -i nvidia 00:08.0 3D controller: NVIDIA Corporation TU104GL [Tesla T4] (rev a1)1.1、官网下载驱动程序 https://www.nvidia.cn/Downlo…

数据分析13——Pandas数据导出/日期数据处理/样本采样

Pandas数据导出 1、导出Excel&#xff1a; 举例&#xff1a; 代码&#xff1a;df.to_excel(‘./data/text_01.xlsx’, sheet_name‘订单明细’, indexFalse)解释&#xff1a;将df数据导入到相对路径为’./data/text_01.xlsx’的文件中&#xff0c;其中数据表名称为’订单明细…

【算法】单源最短路径算法——Dijkstra算法

文章目录 一、简介与使用场景二、算法思想三、朴素版Dijkstra四、堆优化版Dijkstra五、总结 一、简介与使用场景 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的&#xff0c;因此又叫狄克斯特拉算法。这是从一个顶点到其余各顶点的最短路径算法&#…

STM32 使用SYN6288语音模块

文章目录 前言一、SYN6288介绍二、SYN6288原理讲解三.数据的异或校验四.代码编写1.串口的初始化2.SYN6288代码编写3.main函数逻辑 总结 前言 本篇文章带大家学习一下SYN6288语音模块&#xff0c;这个模块可以用于车载设备&#xff0c;语音电子书等众多产品当中&#xff0c;而且…

Android 创建线程源码分析 JavaThreadNativeThread

前言 本文分析在Android中创建线程时候的源码分析,即JavaThread和NativeThread。 java/lang/Thread.java art/runtime/native/java_lang_Thread.cc art/runtime/thread.cc 两种Java Thread 有两种可以运行Java代码的线程。有两种情况: 通过new Thread创建的java线程在Nati…

若依分离版——IDEA开发SpringBoot的webservice接口

一.webservice介绍 WebService是帮助多个应用程序与平台和编程语言之间以独立的方式互相通信的标准化技术。它是利用标准 XML messaging(主要 SOAP) 技术&#xff0c;可以访问网络上的其他计算机的记述多种操作的软件接口。此接口主要由 WSDL (WebService Description Language…

WPF 未能加载文件或程序集 System.Windows.Interactivity

先说一下原因&#xff0c;这是因为微软抛弃了Interactivity导致。 NuGet下载Behaviors.Wpf 在xaml界面替换掉有Interactivity那一行&#xff0c;替换为: xmlns:i“http://schemas.microsoft.com/xaml/behaviors”