转:https://blog.csdn.net/baidu_34940616/article/details/62886259
前言
本人在http://blog.csdn.net/wokaowokaowokao12345/article/details/51078495和http://blog.csdn.net/wokaowokaowokao12345/article/details/51314439基础上进行了针对自己出现的BUG稍微修改代码,环境是pcl1.8.0+vs2013+qt5.5.1。
Point Cloud Library (PCL)是一个功能强大的开源C++库,如果能够使用好PCL将会对我们在LiDAR数据处理领域的研究产生巨大帮助。LiDAR技术经过几十年的发展,目前国内外关于LiDAR点云数据处理的文献已很丰富,但是依然存在硬件上的发展速度大于软件的发展速度。PCL中的算法基于众多的科研人员和程序爱好者的无私贡献才有今天强大的PCL。
博文中,我将针对如何结合PCL和Qt库做一个可视化点云的程序。这部分内容在PCL官网已有几个例子并且都能够很好的使用,而且UI也是完全由代码设计,这对学习Qt也有一定帮助,但是对于没有任何Qt基础又想入门的同学来说就难免有一定难度。
下面我将对如何使用QT库,运用Qt设计师设计UI,基于PCL读取并显示点云做一个比较完整介绍。
PCL+QT+VS安装配置
本人博客中都有涉及,如果还未安装配置的可以查阅。
提示下面新建的工程要配置PCL。
新建工程和编写相关代码
- 在VS中新建QtApplication工程
- 在主窗口中添加QVtkwidget部件
- 在UI中添加File菜单和Open动作并编译
添加读取PCD文件的代码
下面直接给出头文件和源文件
#ifndef PCLVISUALIZER_H
#define PCLVISUALIZER_H
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <QtWidgets/QMainWindow>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include "ui_pclvisualizer.h"
class PCLVisualizer : public QMainWindow
{
Q_OBJECT
public:
PCLVisualizer(QWidget *parent = 0);
~PCLVisualizer();
private:
Ui::PCLVisualizer ui;
//点云数据存储
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
//初始化vtk部件
void initialVtkWidget();
private slots:
//创建打开槽
void onOpen();
};
#endif // PCLVISUALIZER_H
#include <QFileDialog>
#include <iostream>
#include <vtkRenderWindow.h>
#include "pclvisualizer.h"
PCLVisualizer::PCLVisualizer(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
//初始化
initialVtkWidget();
//连接信号和槽
connect(ui.actionOpen, SIGNAL(triggered()), this, SLOT(onOpen()));
}
PCLVisualizer::~PCLVisualizer()
{
}
void PCLVisualizer::initialVtkWidget()
{
cloud.reset(new pcl::PointCloud<pcl::PointXYZ>);
viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));
viewer->addPointCloud(cloud, "cloud");
ui.qvtkWidget->SetRenderWindow(viewer->getRenderWindow());
viewer->setupInteractor(ui.qvtkWidget->GetInteractor(), ui.qvtkWidget->GetRenderWindow());
ui.qvtkWidget->update();
}
//读取文本型和二进制型点云数据
void PCLVisualizer::onOpen()
{
//只能打开PCD文件
QString fileName = QFileDialog::getOpenFileName(this,
tr("Open PointCloud"), ".",
tr("Open PCD files(*.pcd)"));
if (!fileName.isEmpty())
{
std::string file_name = fileName.toStdString();
//sensor_msgs::PointCloud2 cloud2;
pcl::PCLPointCloud2 cloud2;
//pcl::PointCloud<Eigen::MatrixXf> cloud2;
Eigen::Vector4f origin;
Eigen::Quaternionf orientation;
int pcd_version;
int data_type;
unsigned int data_idx;
int offset = 0;
pcl::PCDReader rd;
rd.readHeader(file_name, cloud2, origin, orientation, pcd_version, data_type, data_idx);
if (data_type == 0)
{
pcl::io::loadPCDFile(fileName.toStdString(), *cloud);
}
else if (data_type == 2)
{
pcl::PCDReader reader;
reader.read<pcl::PointXYZ>(fileName.toStdString(), *cloud);
}
viewer->updatePointCloud(cloud, "cloud");
viewer->resetCamera();
ui.qvtkWidget->update();
}
}
重新编译后选择pcd文件打开
显示效果
官方例子编译
官方给的例子是在cmake下构建vs项目,然后用vs编译。现在我将官方给的第一个PCLVisualizer in Qt with cmake,直接用VS进行构建。