Point Cloud Library (PCL)是一个功能强大的开源C++库,假设可使用好PCL将会对咱们在LiDAR数据处理领域的研究产生巨大帮助。LiDAR技术通过几十年的发展。眼下国内外关于LiDAR点云数据处理的文献已很是丰富。但是依旧存在硬件上的发展速度大于软件的发展速度。php
PCL中的算法基于众多的科研人员和程序爱好者的无私贡献才有今天强大的PCL。ios
博文中,我将针对怎样结合PCL和Qt库作一个可视化点云的程序。这部份内容在PCL官网已有几个样例而且均可以很是好的使用,而且UI也是全然由代码设计,这对学习Qt也有必定帮助,但是对于没有不论什么Qt基础又想入门的同窗来讲就不免有必定难度。算法
如下我将对怎样使用QT库。运用Qt设计师设计UI。基于PCL读取并显示点云作一个比較完整介绍。markdown
本人博客中都有涉及,假设还未安装配置的能够查阅。post
提示如下新建的project要配置PCL。学习
如下直接给出头文件和源文件
1. pclvisualizer.hui
#ifndef PCLVISUALIZER_H
#define PCLVISUALIZER_H
#include <QtGui/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, Qt::WFlags flags = 0);
~PCLVisualizer();
private:
Ui::PCLVisualizerClass 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 "pclvisualizer.h"
PCLVisualizer::PCLVisualizer(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
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::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();
}
}
官方给的样例是在cmake下构建vs项目。而后用vs编译。现在我将官方给的第一个PCLVisualizer in Qt with cmake,直接用VS进行构建,并将完整project上传至百度云盘,假设有需要的能够进行下载。
this
这款软件是基于Qt、PCL、VTK、GDAL、LASLib、Liblas、Tiff、GeoTiff、opencv等库开发,是对笔者研究生阶段有关LiDAR学习研究的一个总结。从此若挣得导师容许。会逐渐将一些算法以博文的形式和你们分享。spa