QT進行pcl視覺化顯示
阿新 • • 發佈:2019-01-05
首先由於pcl的vtk與qt的不相容需要下載vtk控制元件,詳細的介紹見之前的部落格。
然後開啟你的vs,新建qt專案,然後進入qtdesign,找到qvtk控制元件,在下圖所示,然後加一些常用的控制元件就好了。
然後就可以愉快的寫程式碼了,我這個實現了開啟檔案和濾波兩個功能,敬請參考
#include <QtWidgets/QMainWindow> #include "ui_pcl_test.h" //vtk控制元件 #include <vtkRenderWindow.h> #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); VTK_MODULE_INIT(vtkInteractionStyle); //pcl依賴項 #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/visualization/pcl_visualizer.h> //體素濾波 #include <pcl/filters/voxel_grid.h> #include <pcl/visualization/cloud_viewer.h> class pcl_test : public QMainWindow { Q_OBJECT public: pcl_test(QWidget *parent = Q_NULLPTR); ~pcl_test(); private: Ui::pcl_testClass ui; //定義點雲指標 typedef pcl::PointCloud<pcl::PointXYZRGB> pointcloud; pointcloud::Ptr pointptr; //定義顯示器 boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;; //初始化vtk void initialvtk(); //建立開啟槽 //private slots: //開啟檔案 void openfile(); //濾波和其點雲指標 void voxelgridfilter(); //typedef pcl::PointCloud<pcl::PointXYZRGB> voxelcloudpoint; };
#include "pcl_test.h" #include <QFileDialog> #include <iostream> pcl_test::pcl_test(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); initialvtk(); //開啟檔案 connect(ui.button1, &QAction::triggered, this, &pcl_test::openfile); //點雲濾波 connect(ui.button2, &QAction::triggered, this, &pcl_test::voxelgridfilter); } pcl_test::~pcl_test() { delete &ui; } //初始化vtk void pcl_test::initialvtk() { pointptr.reset(new pcl::PointCloud<pcl::PointXYZRGB>); viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false)); viewer->addPointCloud(pointptr, "cloud"); ui.qvtkWidget->SetRenderWindow(viewer->getRenderWindow()); viewer->setupInteractor(ui.qvtkWidget->GetInteractor(), ui.qvtkWidget->GetRenderWindow()); ui.qvtkWidget->update(); } //讀取文字型和二進位制型點雲資料 void pcl_test::openfile() { //只能開啟PCD檔案 QString fileName = QFileDialog::getOpenFileName(this, QString("Open PointCloud"), ".", QString("Open PCD files(*.pcd)")); if (!fileName.isEmpty()) { std::string file_name = fileName.toStdString(); pcl::io::loadPCDFile(file_name, *pointptr); //viewer->addPointCloud(pointptr, "cloud"); viewer->updatePointCloud(pointptr, "cloud"); ui.qvtkWidget->update(); } } //體素濾波 void pcl_test::voxelgridfilter() { pcl::PointCloud<pcl::PointXYZRGB>::Ptr voxelpointptr(new pcl::PointCloud<pcl::PointXYZRGB>); pcl::VoxelGrid<pcl::PointXYZRGB> filter; filter.setInputCloud(pointptr); filter.setLeafSize(0.1f, 0.1f, 0.1f); filter.filter(*voxelpointptr); pcl::io::savePCDFileASCII("voxel.pcd", *voxelpointptr); //viewer->addPointCloud(voxelpointptr, "cloud"); viewer->updatePointCloud(voxelpointptr, "cloud"); ui.qvtkWidget->update(); }