QT进行pcl可视化显示

版权声明:坚持原创,禁止转载。 https://blog.csdn.net/SLAM_masterFei/article/details/84864070

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

}

猜你喜欢

转载自blog.csdn.net/SLAM_masterFei/article/details/84864070
今日推荐