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