PCL+Qt+VS可视化点云

Posted 吕小猪不坏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PCL+Qt+VS可视化点云相关的知识,希望对你有一定的参考价值。

前言

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。

新建工程和编写相关代码

  1. 在VS中新建QtApplication工程
    这里写图片描述
  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进行构建,并将完整工程上传至百度云盘,如果有需要的可以进行下载。
这里写图片描述

更加复杂的例子

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

这里写图片描述

以上是关于PCL+Qt+VS可视化点云的主要内容,如果未能解决你的问题,请参考以下文章

qt+pcl点云库

qt可视化教程点云不出现

PCL点云数据处理基础❤️❤️❤️目录

如何以Qt子窗口的形式显示点云视窗

Windows7系统下OpenCV2.4.4+PCL1.6.0+SSBA3.0+VS2010 IDE32环境下编译和安装以实现Sfm和PCL点云数据可视化

PCL:CloudViewer 简单点云可视化