《Qt+PCL》1.1、点云读取显示

前言

在Qt中实现PCL点云数据读取,Qt小白,仅做学习记录,欢迎学习交流指导。


一、主要流程

1.Qt设置:添加PCL依赖库
2.ui界面布局
3.添加Qt基本 头文件
4.添加pcl相关头文件+定义ui界面的元素
5.初始化控件
6.主函数增加菜单栏
7.菜单栏信号与槽设置.
8.添加函数功能
9.建立信号与槽连接,在初始化函数中添加槽函数链接

二、使用步骤

1.Qt设置-添加pcl依赖库

在项目的.pro文件添加下属语句,根绝依赖库的保存位置,更改文件路径

include(C:/PCL1.12.1/pcl1.12.1.pri)

2.ui界面布局

ui界面内做如下操作:
(1)添加OpenGL Widget部件,右键提升为QVTKOpenGLNativeWidget;
(2)添加两个GroupBox部件,添加两个TextBrowser部件;
(3)GroupBox部件与TextBrowser部件分别设置栅格布局;
(4)两个GroupBox部件设置垂直布局;
(5)GroupBox部件和OpenGL Widget部件设置水平布局,并设置窗口尺寸比例2,8;
(6)设置centralwidget栅格布局。
在这里插入图片描述

3.添加Qt基本头文件

在.h文件天健下述头文件:

#include <QDebug>       //提供调试输出功能。
#include <QColorDialog> //提供颜色选择对话框。
#include <QMessageBox>  //提供消息对话框,用于显示消息或询问用户确认信息。
#include <QFileDialog>  //提供消息对话框,用于显示消息或询问用户确认信息。
#include <QTime>        //提供时间相关的功能,用于表示和处理时间
#include <QDir>         //用于操作文件系统中的目录(文件夹)
#include <QFile>        //提供文件操作的功能,包括读写文件、检查文件是否存在、删除文件等操作。
#include <QtMath>       //提供数学函数的集合,比如三角函数、对数、指数等,常用于需要数学计算的场景。
#include <QDirIterator> //提供迭代器,用于遍历目录中的文件和子目录。

4.添加pcl相关头文件+定义ui界面的元素

新建一个头文件(pcl_function.h)存放pcl的头文件

#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/visualization/pcl_visualizer.h>

在private下添加下述代码:

 pcl::PointCloud<pcl::PointXYZRGB> cloud;
 boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
 std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> cloud_vec;

5.初始化控件

.h文件添加头文件

#include "QVTKOpenGLNativeWidget.h"         //包含 QVTKOpenGLNativeWidget 类的定义,用于在 Qt 应用程序中嵌入 VTK 渲染窗口
#include <vtkSphereSource.h>                //包含 vtkSphereSource 类的定义,用于生成球体几何数据。
#include <vtkPolyDataMapper.h>              //包含 vtkPolyDataMapper 类的定义,用于将几何数据映射到图形数据。
#include <vtkActor.h>                       //包含 vtkActor 类的定义,用于在渲染器中表示一个实体。
#include <vtkRenderer.h>                    //包含 vtkRenderer 类的定义,用于管理渲染过程。
#include <vtkRenderWindow.h>                //包含 vtkRenderWindow 类的定义,用于创建一个渲染窗口。
#include <vtkGenericOpenGLRenderWindow.h>   //包含 vtkGenericOpenGLRenderWindow 类的定义,用于创建一个通用的 OpenGL 渲染窗口。
#include <vtkNamedColors.h>                 //包含 vtkNamedColors 类的定义,用于使用命名颜色。
#include <vtkProperty.h>                    //包含 vtkProperty 类的定义,用于设置图形属性(如颜色、透明度等)。
#include <vtkSmartPointer.h>                //包含 vtkProperty 类的定义,用于设置图形属性(如颜色、透明度等)。
#include "vtkAutoInit.h"                    //包含 VTK 自动初始化宏的定义,用于确保 VTK 模块正确初始化。
//***** 宏定义---初始化VTK模块 ******//
VTK_MODULE_INIT(vtkRenderingOpenGL2);       //初始化 VTK 的 OpenGL2 渲染模块,提供现代 OpenGL 渲染功能。
VTK_MODULE_INIT(vtkInteractionStyle);       //初始化 VTK 的交互样式模块,支持不同的交互方式(如旋转、缩放、平移等)。
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2); //初始化 VTK 的体渲染模块,使用 OpenGL2 进行体数据的渲染。
VTK_MODULE_INIT(vtkRenderingFreeType);      //初始化 VTK 的 FreeType 渲染模块,支持使用 FreeType 库进行文本渲染。

.cpp文件中初始化控件:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //*************  初始化控件 *****************//
    //初始化pcl显示控件
    viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));
    vtkNew<vtkGenericOpenGLRenderWindow> window;
    window->AddRenderer(viewer->getRendererCollection()->GetFirstRenderer());
    ui->openGLWidget->SetRenderWindow(window.Get());
    viewer->setupInteractor(ui->openGLWidget->GetInteractor(), ui->openGLWidget->GetRenderWindow());
    ui->openGLWidget->update();
}

6.主函数增加菜单栏

添加头文件:

//创建菜单栏,工具栏,状态栏应当包含的头文件
#include <QMenuBar>     //用于创建和管理应用程序的菜单栏。
#include <QMenu>        //用于创建和管理菜单项。
#include <QToolBar>     //用于创建和管理工具栏。
#include <QStatusBar>   //用于创建和管理状态栏。

创建菜单栏,在.cpp文件内添加下述代码:

//***************** 初始化菜单栏 ***************//
    //************* 创建菜单 ****************//
    QMenuBar *menu_bar = new QMenuBar(this);    //创建一个菜单栏
    this->setMenuBar(menu_bar);                 //设置为MainWindow的菜单栏
    menu_bar->setStyleSheet("font-size : 18px");//设置菜单栏的样式,使其字体大小变为 18 像素
    QMenu *file_menu = new QMenu("文件", menu_bar);
    //************* 菜单中创建动作 **************//
    //文件下拉框-创建文件菜单
    QAction *open_action = new QAction("读取");
    QAction *save_action = new QAction("保存");
    QAction *quit_action = new QAction("退出");
    //添加动作到文件菜单,QAction自动变为子菜单
    file_menu->addAction(open_action);
    file_menu->addAction(save_action);
    file_menu->addSeparator();          //添加菜单分隔符
    file_menu->addAction(quit_action);
    //*************** 菜单添加至菜单栏 *****************//
    menu_bar->addMenu(file_menu)

7.菜单栏信号与槽设置.

.h文件添加:

//*************** slot function **********//
private slots:
    void Open_clicked();

8.添加函数功能

.h文件添加头文件:

    std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> cloud_vec;
    std::vector<std::string> cloud_name{"0","1","12"};
    int point_size = 1;

.cpp文件添加:

void CreateCloudFromTxt(const std::string& file_path, pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud){
    std::ifstream file(file_path.c_str());
    std::string line;
    pcl::PointXYZRGB point;

    while(getline(file, line)){
        std::stringstream ss(line);
        ss >> point.x;
        ss >> point.y;
        ss >> point.z;
        cloud->push_back(point);
    }
    file.close();
}

void MainWindow::Open_clicked(){
    QString filename = QFileDialog::getOpenFileName(this, tr("open file"), "", tr("pcb file(*.pcd *.ply *.txt);;All file (*.*)"));

    if(filename.isEmpty()){
        return;
    }

    if(filename.endsWith("ply")){
        qDebug()<<filename;
        if(pcl::io::loadPLYFile<pcl::PointXYZRGB>(filename.toStdString(), cloud) == -1){
            qDebug()<<"Cloudn't read file \n";
            return;
        }
    }
    else if(filename.endsWith("pcd")){
        qDebug()<<filename;
        if(pcl::io::loadPCDFile<pcl::PointXYZRGB>(filename.toStdString(), cloud) == -1){
            qDebug()<<"Cloudn't read file \n";
            return;
        }
    }
    else if(filename.endsWith("txt")){
        qDebug()<<filename;
        pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudTemp(new pcl::PointCloud<pcl::PointXYZRGB>);
        CreateCloudFromTxt(filename.toStdString(), cloudTemp);
        cloud = *cloudTemp;
    }
    else{
        QMessageBox::warning(this, "Waring", "点云读取格式错误!");
    }
    //移除窗口内点云数据
    viewer->removeAllPointClouds();
    viewer->removeAllShapes();
    //viewer->addPointCloud(cloud.makeShared() ,cloud_name[0]);
    viewer->addPointCloud<pcl::PointXYZRGB>(cloud.makeShared(),std::to_string(cloud_vec.size()-1));
    viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, point_size, cloud_name[0]);
    viewer->resetCamera();
    ui->openGLWidget->update();
}

9.建立信号与槽连接,在初始化函数中添加槽函数链接

初始化函数添加:

//**************** connect设置 ****************//
    //文件
    connect(open_action, SIGNAL(tringgered()), this, SLOT(Open_clicked()));//读取文件

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钟某某人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值