PCL+Qt+VS可視化點雲

前言

Point Cloud Library (PCL)是一個功能強大的開源C++庫,假設可使用好PCL將會對咱們在LiDAR數據處理領域的研究產生巨大幫助。LiDAR技術通過幾十年的發展。眼下國內外關於LiDAR點雲數據處理的文獻已很是豐富。但是依舊存在硬件上的發展速度大於軟件的發展速度。php

PCL中的算法基於衆多的科研人員和程序愛好者的無私貢獻纔有今天強大的PCL。ios

博文中,我將針對怎樣結合PCL和Qt庫作一個可視化點雲的程序。這部份內容在PCL官網已有幾個樣例而且均可以很是好的使用,而且UI也是全然由代碼設計,這對學習Qt也有必定幫助,但是對於沒有不論什麼Qt基礎又想入門的同窗來講就不免有必定難度。算法

如下我將對怎樣使用QT庫。運用Qt設計師設計UI。基於PCL讀取並顯示點雲作一個比較完整介紹。markdown

PCL+QT+VS安裝配置

本人博客中都有涉及,假設還未安裝配置的能夠查閱。post


提示如下新建的project要配置PCL。學習

新建project和編寫相關代碼

  1. 在VS中新建QtApplicationproject
    這裏寫圖片描寫敘述
  2. 在主窗體中加入QVtkwidget部件
    這裏寫圖片描寫敘述
  3. 在UI中加入File菜單和Open動做並編譯
    這裏寫圖片描寫敘述

加入讀取PCD文件的代碼

如下直接給出頭文件和源文件
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
  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上傳至百度雲盤,假設有需要的能夠進行下載。
這裏寫圖片描寫敘述this

更加複雜的樣例

這款軟件是基於Qt、PCL、VTK、GDAL、LASLib、Liblas、Tiff、GeoTiff、opencv等庫開發,是對筆者研究生階段有關LiDAR學習研究的一個總結。從此若掙得導師容許。會逐漸將一些算法以博文的形式和你們分享。spa

這裏寫圖片描寫敘述

相關文章
相關標籤/搜索