前言
在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()));//读取文件