前言

Point Cloud Library (PCL)是一个功能强大的开源C++库,假设可以使用好PCL将会对我们在LiDAR数据处理领域的研究产生巨大帮助。LiDAR技术经过几十年的发展。眼下国内外关于LiDAR点云数据处理的文献已非常丰富。可是依旧存在硬件上的发展速度大于软件的发展速度。

PCL中的算法基于众多的科研人员和程序爱好者的无私贡献才有今天强大的PCL。

博文中,我将针对怎样结合PCL和Qt库做一个可视化点云的程序。这部分内容在PCL官网已有几个样例并且都可以非常好的使用,并且UI也是全然由代码设计,这对学习Qt也有一定帮助,可是对于没有不论什么Qt基础又想入门的同学来说就难免有一定难度。

以下我将对怎样使用QT库。运用Qt设计师设计UI。基于PCL读取并显示点云做一个比較完整介绍。

PCL+QT+VS安装配置

本人博客中都有涉及,假设还未安装配置的可以查阅。


提示以下新建的project要配置PCL。

新建project和编写相关代码

  1. 在VS中新建QtApplicationproject
    这里写图片描写叙述
  2. 在主窗体中加入QVtkwidget部件
    这里写图片描写叙述
  3. 在UI中加入File菜单和Open动作并编译
    这里写图片描写叙述

加入读取PCD文件的代码

以下直接给出头文件和源文件
1. pclvisualizer.h

#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
  1. pclvisualizer.cpp
#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();
    }   
}
  1. 又一次编译后选择pcd文件打开
    这里写图片描写叙述
    显示效果
    这里写图片描写叙述

官方样例编译

官方给的样例是在cmake下构建vs项目。然后用vs编译。如今我将官方给的第一个PCLVisualizer in Qt with cmake,直接用VS进行构建,并将完整project上传至百度云盘,假设有须要的可以进行下载。
这里写图片描写叙述

更加复杂的样例

这款软件是基于Qt、PCL、VTK、GDAL、LASLib、Liblas、Tiff、GeoTiff、opencv等库开发,是对笔者研究生阶段有关LiDAR学习研究的一个总结。今后若挣得导师允许。会逐渐将一些算法以博文的形式和大家分享。

这里写图片描写叙述