Qt+PCL手把手教材(第2讲)——PCL库 介绍及版本选择(1.12、1.13)以及Qt ...

打印 上一主题 下一主题

主题 1895|帖子 1895|积分 5685

1、PCL(Point Cloud Library)简介

PCL(Point Cloud Library)是一个开源的、功能强盛的 C++ 库,专门用于点云数据的处理惩罚、分析和可视化。点云数据通常是由三维扫描仪或立体视觉系统生成的,代表了物体外貌的形状。PCL 提供了大量的工具和算法,用于点云的处理惩罚、特征提取、配准、滤波、分割、重建和可视化。
1.1、PCL 的主要功能模块:


  • 点云滤波: 提供了多种滤波方法,如体素网格滤波器、统计滤波器、半径和邻域滤波器,用于去噪和减少点云数据的密度。
  • 点云配准: 包括 ICP(迭代迩来点)算法、NDT(正态分布变更)等,用于将差别视角或时间的点云对齐。
  • 点云特征提取: 提供了多种特征提取算法,如法线估计、外貌法线、曲率、点云的局部描述子(例如 PFH、SHOT)。
  • 点云分割: 允许将点云分割成差别的部门,常用于提取特定物体或区域。
  • 点云重建: 利用点云数据生成网格模型或外貌模型(例如基于 Poisson 重建)。
  • 点云可视化: 提供了强盛的可视化功能,支持与 VTK、OpenGL 等库联合,支持点云的3D可视化。
1.2、PCL 的应用范畴:



  • 机器人视觉:自动导航、路径规划、物体识别、停滞物检测等。
  • 三维扫描:物体外貌重建、建筑物测量、考古学、文化遗产保护等。
  • 自动驾驶:用于感知周围环境,举行停滞物检测和道路建模。
  • 工业自动化:如物体检测、自动扮装配等。
    关于更多PCL点云库的内容,可以参见《PCL点云库入门系列》

2、PCL 版本选择(1.12 与 1.13)

PCL 的版本迭代通常带来新的功能、性能改进和 bug 修复。选择得当的版本通常取决于项目的需求、兼容性和所需功能。以下是 PCL 1.121.13 版本的对比和建议。
2.1、PCL 1.12(2020年12月发布)

PCL 1.12 是 PCL 1.x 系列中的一个恒久稳定版本,包罗了大量的功能和优化。它是许多现有项目和应用的底子,特别是在 稳定性和兼容性方面。
主要特点:


  • 稳定性和兼容性: PCL 1.12 提供了稳定的 API 和广泛的文档支持,得当需要恒久维护和较少版本更新的项目。
  • 性能改进: 在一些点云处理惩罚算法(例如 ICP 配准、滤波器)上有较大的优化,处理惩罚大规模点云数据时体现更好。
  • 较少的新特性: 相比于 1.13,1.12 版本的更新相对保守,更多集中于修复已知的 bug 和改进现有功能。
适用场景:


  • 对于已经在利用 PCL 1.12 的项目,如果不需要依赖新特性,可以继续利用此版本。
  • 对于需要较高稳定性、兼容性和恒久维护的项目,PCL 1.12 是一个理想选择。
2.2、PCL 1.13(2022年发布)

PCL 1.13 是一个较新的版本,带来了许多 新特性、算法改进bug 修复。这个版本更加前沿,得当对新功能和性能要求较高的项目。
主要特点:


  • 新功能: PCL 1.13 引入了一些新算法和功能,改善了点云配准、特征提取和其他数据处理惩罚模块。例如,增长了更多的滤波方法、点云分割算法的改进等。
  • 性能优化: 在大规模点云数据处理惩罚方面,PCL 1.13 举行了更多的性能优化。对于要求高效处理惩罚大规模数据的应用,1.13 大概会有更好的性能体现。
  • 更新的依赖库支持: 1.13 支持更新的库版本(如新的 Eigen 库版本、Boost 库等),在兼容性方面有所提升。
  • 更好的跨平台支持: 提供了对更多操作系统和平台(如新的 Linux 发行版)的支持。
适用场景:


  • 如果需要利用 新功能 大概 改进的算法,特别是对点云数据处理惩罚有较高性能要求的项目,建议选择 1.13。
  • 对于需要紧跟技术前沿、要求不停优化和创新的项目,PCL 1.13 是更符合的选择。
  • 如果利用的是较新的依赖库(如 Eigen 3.4、Boost 1.76),PCL 1.13 更加兼容。

2.3、如何选择版本?

选择 PCL 版本时,主要取决于以下几点:

  • 项目需求: 如果你的项目已经稳定运行在 PCL 1.12 上,并且不需要利用新版本的功能,可以继续利用 1.12。对于依赖于新算法或更高性能的应用,1.13 会更符合。
  • 稳定性与更新频率: PCL 1.12 在稳定性和向后兼容性上做得很好,得当恒久维护的项目;PCL 1.13 则更新频仍,带来了新特性和更好的性能,得当对性能和新功能有较高要求的项目。
  • 依赖库兼容性: 如果你正在利用较新的库版本,PCL 1.13 大概会有更好的兼容性。如果你利用的是较旧的库,PCL 1.12 大概会更加稳定。
2.4、总结



  • PCL 1.12 得当恒久稳定性和兼容性要求较高的项目,已经非常成熟,适用于许多已有项目。
  • PCL 1.13 引入了更多的新特性、性能优化和依赖库更新,得当需要前沿技术和更高性能的项目。
对于新项目,建议选择 PCL 1.13,而对于需要较高稳定性且没有急迫需求的新特性的项目,可以选择 PCL 1.12,本教材选择利用PCL 1.12

3、Qt + PCL 联合的根本架构

联合 QtPCL(Point Cloud Library) 的架构通常用于开发具有图形界面(GUI)的点云数据可视化、处理惩罚和分析应用步调,如第1讲中的相关应用场景等。Qt 提供强盛的 GUI 支持,适用于构建交互式桌面应用,而 PCL 如前面所言提供了丰富的点云处理惩罚功能,如滤波、特征提取、配准等。因此,Qt + PCL 联合的根本架构涉及将点云数据处理惩罚和可视化组件集成到 Qt GUI 界面中。
3.1、根本架构概述


  • Qt 界面层:负责界面的设计与用户交互。

    • 主要利用 QWidget、QMainWindow、QGraphicsView、QOpenGLWidget/QVTKOpenGLNativeWidget 等组件。
    • 提供对点云数据的输入、显示、交互和结果输出功能。

  • PCL 处理惩罚层:负责点云数据的加载、处理惩罚和算法应用。

    • 利用 PCL 提供的数据结构(如 pcl:ointCloud)和算法(如滤波、配准、分割、特征提取等)。

  • 数据通信层:Qt 和 PCL 之间的数据交互和变乱通知。

    • 数据通报和可视化渲染可以通过信号和槽(Signal-Slot)机制举行。
    • 利用 PCL 数据类型与 Qt 图形视图(例如 QVTKOpenGLNativeWidget 或 QOpenGLWidget)联合,更新点云的显示。

3.2、架构图

以下是一个简化的 Qt + PCL 架构表示图:

3.3、具体实现步调

1. Qt GUI 层设计



  • 利用 Qt Designer 或手动编码设计图形界面。
  • 主要组件:

    • QMainWindow 或 QWidget 用于承载其他控件。
    • QVTKOpenGLNativeWidget:用于渲染点云数据的3D视图(推荐用于点云可视化,因为 PCL 提供了基于VTK+ OpenGL 的点云渲染功能)。
    • 控件例如按钮、滑动条、菜单等,用于控制点云的加载、处理惩罚和显示。

示例代码:
  1. class MainWindow: public QMainWindow {
  2.     Q_OBJECT
  3. public:
  4.     MainWindow(QWidget *parent = nullptr);
  5.     ~MainWindow();
  6. private:
  7. //说明例子
  8.     QVTKOpenGLNativeWidget *openGLWidget; // 渲染点云的 OpenGL 小部件
  9.     QPushButton *loadButton;     // 加载点云按钮
  10.     QSlider *filterSlider;       // 滤波器滑动条
  11.     void initUI();  // 初始化 UI 元素
  12.     void setupConnections();  // 连接信号与槽
  13. };
复制代码
2. PCL 处理惩罚层集成



  • 利用 pcl:ointCloud 类型来存储点云数据。
  • 利用 PCL 提供的算法对点云数据举行处理惩罚,例如滤波、特征提取、配准等。
  • 点云数据处理惩罚之后,将结果通报给 Qt 举行显示。
示例代码:
  1. #include <pcl/point_cloud.h>
  2. #include <pcl/io/pcd_io.h>
  3. #include <pcl/filters/voxel_grid.h>
  4. void MainWindow::loadPointCloud(const QString &fileName) {
  5.     pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
  6.     if (pcl::io::loadPCDFile(fileName.toStdString(), *cloud) == -1) {
  7.         qWarning() << "Couldn't read the file!";
  8.         return;
  9.     }
  10.     // 点云加载成功,进行滤波或其他处理
  11.     pcl::VoxelGrid<pcl::PointXYZ> sor;
  12.     sor.setInputCloud(cloud);
  13.     sor.setLeafSize(0.1f, 0.1f, 0.1f);
  14.     sor.filter(*cloud);
  15.     updatePointCloudView(cloud);  // 更新 Qt 视图
  16. }
复制代码
3. 数据通信层



  • 利用 Qt 的 信号与槽机制,将用户操作(如按钮点击、滑动条调解)与 PCL 数据处理惩罚关联起来。
  • PCL 数据通过 Qt 的 QVTKOpenGLNativeWidget 或其他图形视图类举行渲染更新。
信号与槽示例:
  1. // PointCloudViewer.h
  2. signals:
  3.     void pointCloudLoaded(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud);
  4. private slots:
  5.     void onLoadButtonClicked();  // 加载点云文件槽
  6.     void onFilterSliderChanged(int value);  // 滤波器参数变化槽
复制代码
在 Qt 中界说 槽函数 来处理惩罚用户交互变乱,处理惩罚完点云数据后,调用一个更新界面的方法。
更新视图的函数示例:
  1. void MainWindow::updatePointCloudView(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
  2.     // 将 PCL 点云转换为 Qt 可显示的格式,并更新 OpenGL 渲染视图
  3.     openGLWidget->update();
  4. }
复制代码
4. 点云渲染



  • QOpenGLWidget 是 Qt 提供的 OpenGL 渲染小部件,可以在此中利用 PCL 的渲染函数来绘制点云。
  • PCL 提供的 pcl::visualization:CLVisualizer 也可以与 Qt 一起利用,但通常建议直接在 QOpenGLWidget 中渲染点云,以提高灵活性。
在 QOpenGLWidget 中渲染点云的示例:
  1. void MainWindow::renderPointCloud(QOpenGLWidget *widget, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
  2.     // 使用 QVTKOpenGLNativeWidget渲染 PCL 点云
  3.     // 在这里,我们可能需要将 PCL 点云数据转化为 QVTKOpenGLNativeWidget 数据格式
  4. }
复制代码
3.4、总结

Qt + PCL 的根本架构可以通过以下几个条理实现:

  • Qt GUI 层:负责图形界面的设计与用户交互,提供控件来加载点云数据、调解参数、显示结果等。
  • PCL 处理惩罚层:负责点云数据的读取、处理惩罚与分析,提供强盛的点云处理惩罚算法。
  • 数据通信层:通过 Qt 的信号与槽机制,协调 GUI 和 PCL 之间的数据通报与更新。
  • 渲染层:利用 Qt 提供的 QVTKOpenGLNativeWidget 渲染点云数据,使得用户能够在 3D 环境中交互检察点云。
这种架构能够将强盛的 PCL 点云处理惩罚本领与 Qt 丰富的 GUI 支持联合,开发出具有交互性、可扩展性的点云可视化和处理惩罚工具。后序的开发工作都是在此框架下举行的。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宝塔山

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表