1. 程式人生 > >QT進行pcl視覺化顯示

QT進行pcl視覺化顯示

首先由於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();

}