CloudCompare二次开发之如何配置PCL点云库?

news2024/12/30 2:06:59

文章目录

  • 0.引言
  • 1.修改两个CMakeLists.txt文件
  • 2.源码编译
  • 3.测试PCL

0.引言

  因笔者课题涉及点云处理,需要通过PCL进行点云数据分析处理,查阅现有网络资料,实现了VisualStudio2015(x86)配置PCL1.8.1点云库(见:VisualStudio如何配置PCL点云库?)。而笔者对CloudCompare二次开发较为熟悉,希望在CloudCompare中使用PCL进行点云处理,所以本文在VS配置PCL成功的基础上,实现CloudCompare-2.10.x对PCL的配置,并记录了实现配置的过程。

1.修改两个CMakeLists.txt文件

  (1)修改CloudCompare-2.10.x源文件目录下的CMakeLists.txt
  在这里插入图片描述

# PCL
option( OPTION_BUILD_PCL "Check to add PCL 3rdParty" ON )  
if ( OPTION_BUILD_PCL )  
    find_package(PCL REQUIRED)  
    include_directories( ${PCL_INCLUDE_DIRS} )  
    message(${PCL_INCLUDE_DIRS})  
    link_directories( ${PCL_LIBRARY_DIRS} )  
    message(${PCL_LIBRARY_DIRS})  
    add_definitions( ${PCL_DEFINITIONS} )  
endif()

  (2)修改CloudCompare-2.10.x源文件的CC目录下的CMakeLists.txt
  ①找到CMakeLists.txt,并打开
  在这里插入图片描述
  ②添加PCL配置
  在这里插入图片描述

option( COMPILE_CC_CORE_LIB_WITH_PCL "Check to compile CC_CORE_LIB with PCL" ON) # 添加PCL配置

  ③添加PCL环境
  在这里插入图片描述

# PCL环境
if(COMPILE_CC_CORE_LIB_WITH_PCL)  
    find_package(PCL REQUIRED)  
  include_directories( ${PCL_INCLUDE_DIRS} )  
  
    #define the PCL_VER_1_8_OR_OLDER preprocessor to compile qPCL with older versions of PCL  
    if ( PCL_VERSION VERSION_LESS  1.8 ) # VERSION_GREATER Works just like "greater or equal"  
        set_property( TARGET ${PROJECT_NAME} APPEND PROPERTY COMPILE_DEFINITIONS PCL_VER_1_8_OR_OLDER )  
  
    endif()  
    # Luca's PCL patch support  
    if( PCL_VERSION VERSION_GREATER  1.7 ) #from 1.7 the patch was merged  
        set_property( TARGET ${PROJECT_NAME} APPEND PROPERTY COMPILE_DEFINITIONS LP_PCL_PATCH_ENABLED )  
  
    endif()  
    link_directories( ${PCL_LIBRARY_DIRS} )  
    add_definitions( ${PCL_DEFINITIONS} )  
    target_link_libraries( ${PROJECT_NAME} ${PCL_LIBRARIES})                #指定目标在运行时要寻找的链接库  
endif()

2.源码编译

  在Cmake中进行配置,会生成PCL相关的文件,并勾选COMPILE_CC_CORE_LIB_WITH_PCL。
  在这里插入图片描述

  在这里插入图片描述

3.测试PCL

  (1)修改mainwindow.ui文件
  ①设计按钮
  在这里插入图片描述
  ②编译.ui
  在这里插入图片描述

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

//点云滤波
void doActionPCLUniformSample(); // 均匀采样

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

#include <pcl/keypoints/uniform_sampling.h>          // 均匀采样

  注:若出现找不到pcl文件的情况,需要设置属性表,具体可参考:VisualStudio如何配置PCL点云库?。

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

// 均匀采样
void MainWindow::doActionPCLUniformSample()  
{  
    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;  
    }  
    // -----------------------------对话框---------------------------------------  
    float radius = QInputDialog::getDouble(this, QStringLiteral("参数设置"), QStringLiteral("搜索半径: "), 0.005, 0, 100, 4);  
    // ----------------------------均匀采样--------------------------------------  
    pcl::PointCloud<pcl::PointXYZ>::Ptr filtered(new pcl::PointCloud<pcl::PointXYZ>);  
    pcl::UniformSampling<pcl::PointXYZ> us;  
    us.setInputCloud(cloud);  
    us.setRadiusSearch(radius);  
    us.filter(*filtered);  
    // ------------------------PCL->CloudCompare--------------------------------  
    if (!filtered->empty())  
    {  
        ccPointCloud* newPointCloud = new ccPointCloud(QString("UniformSample"));  
        for (int i = 0; i < filtered->size(); ++i)  
        {  
            double x = filtered->points[i].x;  
            double y = filtered->points[i].y;  
            double z = filtered->points[i].z;  
            newPointCloud->addPoint(CCVector3(x, y, z));  
        }  
        newPointCloud->setRGBColor(ccColor::Rgba(rand() % 255, rand() % 255, 0, 255));  
        newPointCloud->showColors(true);  
        if (ccCloud->getParent())  
        {  
            ccCloud->getParent()->addChild(newPointCloud);  
        }  
        ccCloud->setEnabled(false);  
        addToDB(newPointCloud);  
        refreshAll();  
        updateUI();  
    }  
    else  
    {  
        ccCloud->setEnabled(true);  
        // Display a warning message in the console  
        dispToConsole("Warning: example shouldn't be used as is", ccMainAppInterface::WRN_CONSOLE_MESSAGE);  
    }  
}

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

connect(m_UI->actionsample, &amp;QAction::triggered, this, &amp;MainWindow::doActionPCLUniformSample);

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

  (5)结果展示
  ①原始点云
  在这里插入图片描述

  ②采样后的点云(相比原始点云,变稀了)
  在这里插入图片描述

参考资料:
[1] 来吧!我在未来等你!. CloudCompare如何进行二次开发的第一步:编译?; 2023-04-28 [accessed 2023-05-14].
[2] 来吧!我在未来等你!. CloudCompare如何进行二次开发?; 2023-04-19 [accessed 2023-05-14].
[3] 来吧!我在未来等你!. VisualStudio如何配置PCL点云库?; 2023-05-14 [accessed 2023-05-15].
[4] 点云侠. CloudCompare 二次开发(5)——非插件中的PCL环境配置(均匀采样为例); 2023-02-17 [accessed 2023-05-14].

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

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

相关文章

基于卷积的图像分类识别(七):SENet

系列文章目录 本专栏介绍基于深度学习进行图像识别的经典和前沿模型&#xff0c;将持续更新&#xff0c;包括不仅限于&#xff1a;AlexNet&#xff0c; ZFNet&#xff0c;VGG&#xff0c;GoogLeNet&#xff0c;ResNet&#xff0c;DenseNet&#xff0c;SENet&#xff0c;MobileN…

网络编程 lesson3 UDP基础编程

目录 UDP介绍 UDP编程 函数接口 recvfrom sendto 小练习&#xff1a;实现服务器和客户端相连&#xff08;使用UDP实现&#xff09; client server UDP介绍 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种在计算机网络中常用的传输…

C++常量成员函数(类成员函数后加const、类成员函数参数列表后加const)常量对象(类名前加const)和非常量对象

文章目录 常量对象和非常量对象&#xff08;常量对象不能调用非常量成员函数&#xff09;常量成员函数&#xff08;常量成员函数不能修改类的数据成员&#xff1b;常量成员函数只能调用常量成员函数&#xff0c;不能调用非常量成员函数&#xff09; 常量对象和非常量对象&#…

网络编程 lesson1 网络概念

目录 网络发展史&#xff08;了解&#xff09; 局域网和广域网 局域网 广域网 IP地址 IP地址划分&#xff08;IPV4&#xff09; IP地址取址范围&#xff1a; 特殊地址 子网掩码 子网号&#xff08;注意和前面进行区分&#xff09; 练习 练习1&#xff1a; 练习2&…

MySQL 数据库之 MMM 高可用架构构建

一、MMM 概述 1. 什么是 MMM   MMM&#xff08;Master-Master replication manager for MySQL&#xff0c;MySQL 主主复制管理器&#xff09;是一套支持双主故障切换和双主日常管理的脚本程序。MMM 使用 Perl 语言开发&#xff0c;主要从来监控和管理 MySQL Master-Master&a…

工厂模式中简单工厂模式、工厂方法模式、抽象工厂模式的分析与总结

工厂模式 工厂模式有许多变体,其中最常见的有三种 简单工厂模式工厂方法模式抽象工厂模式 简单工厂代码分析 UML图中我们可以清晰的看到代码结构 ,首先我们创建一个Car的汽车接口,定制汽车的基本规范,汽车可以的方法是可以跑,所以我们定义了一个抽象的run方法. 定义汽车接口…

【sed编辑器】

目录 一、sed编辑器二、sed的命令格式操作命令1.1、命令演示 二、替换三、插入 一、sed编辑器 1、sed是一种流编辑器&#xff0c;流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 2、sed编辑器可以根据命令来处理数据流中的数据&#xff0c;这些命令要么…

OSC Liblo Window10配置

OpenSoundControl一种网络通讯协议&#xff0c;想了解详情的自行打开网站。 liblo 是最知名的OSC库&#xff0c; 功能完整&#xff0c;用 C 和 LGPL 许可编写。 下载请前往GitHub库。 解压后安装过程如下&#xff0c;需要用到CMake&#xff1a; 1.选择源代码文件和构建工程的文…

一文读懂“生成式 AI”

一、前言 本文基于谷歌的&#xff1a;《Introduction to Generative AI》 并且借助 ChatGPT 整理而成&#xff0c;帮助大家理解生成式 AI 这个概念。 主要包括 4 个部分&#xff1a; 生成式 AI 的定义生成式 AI 的工作原理生成式 AI 模型的分类生成式 AI 的应用 二、生成式…

【数据结构】双向带头循环链表的实现

目录 全部代码 图例&#xff08;双向带头循环链表&#xff09; 各个功能的实现 创建该链表的节点 创建初始链表 链表的头插 链表的尾插 链表的随机插入 链表的头删 链表的尾删 链表的随机删除 链表的销毁 链表是否为空的判断 链表节点的创建 总结 全部代码 typ…

命令行更新Windows

命令行更新Windows powershell命令行更新安装 Windows Update module for Windows Powershell连接到 Windows Update 服务器并下载更新安装下载好的 Windows Update 更新 cmd执行Windows update更新检查更新下载 Windows Update 更新安装更新安装更新后重新启动设备 win10以下版…

Python中Pandas库的相关操作

目录 Pandas库 常用操作 创建DataFrame 查看数据 数据选择和过滤 数据排序和排名 缺失数据处理 数据聚合和分组 数据的合并和连接 Pandas库 Pandas是Python中常用的数据处理和分析库&#xff0c;它提供了高效、灵活且易于使用的数据结构和数据分析工具。 1.Series&a…

实例35---字符串反转,如将字符串 “www.runoob.com“ 反转为 “moc.boonur.www“。

文章目录 前言一、题目描述 二、题目分析 三、解题 1.解题方法一--- for循环来将字符的下标数值进行对每一个字符进行交换 ---程序运行代码 2.解题方法二------ 指针 ------ 程序运行代码(1)程序运行代码优化 总结 前言 本系列为C语言菜鸟100道基础经典例题详解刷题系列。点滴…

微服务:服务发现

1. 服务发现 eureka、nacos、Consul、etcd 和 zk 都是主流的服务发现工具&#xff0c;而 Dubbo 和 Polaris Mesh 则是基于服务发现的 RPC 框架。 它们的主要区别在于&#xff1a; eureka 是 Netflix 开源的一个服务发现组件&#xff0c;支持高可用和数据同步&#xff0c;具有…

如何使用Linkage Mapper揭示栖息地变化的故事

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Linkage Mapper解密数字世界链接 文章目录 引言1.1 定义和作用1.2 Linkage Mapper的历史和发展2.1 揭示栖息地变化的重要性2.2 Linkage Mapper的优势和不足

Windows下载安装RocketMq

Windows下载安装RocketMq 下载安装包启动NAMESERVER 和 BROKER启动NAMESERVER启动BROKER 安装可视化插件 下载安装包 RockitMQ官网下载地址&#xff1a;https://rocketmq.apache.org/release-notes/ 解压到指定的文件夹下 先配置JAVA_HOME 配置ROCKETMQ_HOME环境变量 …

使用Maple的Python API :OpenMaple(Windows下的解决方案)

在Maple 2023&#xff08;按照软件文档&#xff0c;Maple 2018及以上版本均适用&#xff1b;我目前测试的版本为2023&#xff09;的安装目录下&#xff0c;有软件附带的解释器&#xff0c;如D:\Program Files\Maple 2023\Python.X86_64_WINDOWS\Python.exe。这一Python解释器的…

Python中NumPy库的相关操作

目录 NumPy库 常用操作 创建数组 数组属性 索引和切片 数组运算 数组重塑 NumPy库 NumPy&#xff08;Numerical Python&#xff09;是Python中常用的数值计算库&#xff0c;它提供了高性能的多维数组对象和对数组进行操作的函数。 1.多维数组对象&#xff08;ndarray&…

Java 课程设计 —— 扫雷

一、团队课程设计博客链接&#xff1a; https://www.cnblogs.com/luomeili/p/10280310.html 二、个人负责模块或任务说明&#xff1a; 模块&#xff1a;文件操作 Minefield 类实现 三、自己的代码提交记录截图 四、自己负责模块或任务详细说明 1.Minefield 类实现 Minefie…

Java中的CountDownLatch和CyclicBarrier有什么作用?

在Java并发编程中&#xff0c;CountDownLatch和CyclicBarrier是两个非常有用的工具&#xff0c;它们可以帮助我们更加方便地进行线程通信和协作。在本文中&#xff0c;我将从面试的角度&#xff0c;详细讲解Java中的CountDownLatch和CyclicBarrier的概念、作用和实现方式&#…