前言
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和編寫相關代碼
- 在VS中新建QtApplicationproject

- 在主窗體中加入QVtkwidget部件

- 在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
- 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();
}
}
- 又一次編譯后選擇pcd文件打開
顯示效果

官方樣例編譯
官方給的樣例是在cmake下構建vs項目。然后用vs編譯。如今我將官方給的第一個PCLVisualizer in Qt with cmake,直接用VS進行構建,並將完整project上傳至百度雲盤,假設有須要的可以進行下載。

更加復雜的樣例
這款軟件是基於Qt、PCL、VTK、GDAL、LASLib、Liblas、Tiff、GeoTiff、opencv等庫開發,是對筆者研究生階段有關LiDAR學習研究的一個總結。今后若掙得導師允許。會逐漸將一些算法以博文的形式和大家分享。

