前言

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学习研究的一个总结。今后若挣得导师允许。会逐渐将一些算法以博文的形式和大家分享。

PCL+Qt+VS可视化点云的更多相关文章

  1. [Part 4] 在Windows 10上源码编译PCL 1.8.1支持VTK和QT,可视化三维点云

    本文首发于个人博客https://kezunlin.me/post/2d809f92/,欢迎阅读! Part-4: Compile pcl with vtk qt5 support from sour ...

  2. 在PCL中如何实现点云压缩(1)

    点云由庞大的数据集组成,这些数据集通过距离.颜色.法线等附加信息来描述空间三维点.此外,点云能以非常高的速率被创建出来,因此需要占用相当大的存储资源,一旦点云需要存储或者通过速率受限制的通信信道进行传 ...

  3. PCL—低层次视觉—点云分割(邻近信息)

    分割给人最直观的影响大概就是邻居和我不一样.比如某条界线这边是中华文明,界线那边是西方文,最简单的分割方式就是在边界上找些居民问:"小伙子,你到底能不能上油管啊?”.然后把能上油管的居民坐标 ...

  4. PCL—低层次视觉—点云分割(RanSaC)

    点云分割 点云分割可谓点云处理的精髓,也是三维图像相对二维图像最大优势的体现.不过多插一句,自Niloy J Mitra教授的Global contrast based salient region ...

  5. 数据可视化——阿里云解决方案DataV

    数据可视化——阿里云解决方案DataV https://help.aliyun.com/document_detail/53844.html?spm=a2c4g.11186623.6.579.37fd ...

  6. PCL中的OpenNI点云获取框架(OpenNI Grabber Framework in PCL)

    从PCL 1.0开始,PCL(三维点云处理库Point Cloud Library)提供了一个通用采集接口,这样可以方便地连接到不同的设备及其驱动.文件格式和其他数据源.PCL集成的第一个数据获取驱动 ...

  7. PCL 不同类型的点云之间进行类型转换

    PCL 不同类型的点云之间进行类型转换 可以使用PCL里面现成的函数pcl::copyPointCloud(): #include <pcl/common/impl/io.h> pcl:: ...

  8. 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解

    PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...

  9. 用QT制作3D点云显示器——QtDataVisualization

    因为QT的三维显示模块QtDataVisualization已经对个人开发免费开放了,所以在制作点云,地图,表格之类的东西的时候,其实我们都不需要使用QtCharts或者QOpenGL模块了.直接使用 ...

随机推荐

  1. ADO.NET基础知识学习(SQLCOnnection&SQLCommand&SQLDataReader&SQLDataAdapter&DataSet)

    通过ADO.NET技术,我们可以高效的完成客户端同数据库之间的数据访问操作,便于我们在客户端程序简便高效的访问以及获取数据库中的有用数据,同时也可以对数据库中的数据进行更新,即可以完成客户端与数据库之 ...

  2. 转:EMQ(emqttd) 2.x 安装和使用(物联网传输控制协议的Broker)

    支持下国产开源. MQTT物联网传输控制协议:<MQTT-3.1.1-CN.pdf> 下载:emqttd-centos64-v2.0-rc.2-20161019.zip 安装: $ unz ...

  3. angular4 radio checkbox 有用

    <span *ngFor="let op of [{'id':'a','text':'11'},{'id':'b','text':'2222'},{'id':'cc','text':' ...

  4. UML类图详解_关联关系_多对多

    在关联关系中,很多情况下我们的多重性并不是多对一或者一对多的,而是多对多的. 不过因为我们要考虑里面的导航性,如果直接搞的话就是需要去维护两群对象之间多对多的互指链接,这就十分繁杂且易错.那么我们怎么 ...

  5. python学习之sys.getsizeof()

    sys.getsizeof() >>> help(sys.getsizeof)Help on built-in function getsizeof in module sys: g ...

  6. PCB焊接工艺

    1. 有铅焊接工艺    240~260℃. 2. BGA焊盘直径为球径80%.

  7. phpexcel图形图表(一)入门

    PHPExcel - Excel的PHP处理引擎 PHPExcel 提供了一系列的 PHP语言 类,让你可以轻松地读写操作以下格式的文件:.xls/.xlsx/.csv/.ods/Gnumeric/P ...

  8. consul eureka区别(来自Consul官网)

    consul 与 eureka Eureka是一个服务发现工具.该体系结构主要是客户端/服务器,每个数据中心有一组Eureka服务器,通常每个可用区域一个.通常Eureka的客户使用嵌入式SDK来注册 ...

  9. linux各种路径小结

    man路径 /etc/manpath.config $MANPATH include路径 $C_INCLUDE_PATH $CPLUS_INCLUDE_PATH 动态链接库的路径 $LD_LIBRAR ...

  10. 打印99乘法表-python

    题目:如何打印出阶梯状的99乘法表? 题解: #coding:utf-8def multiplication_tables(num):#for i in range(1,10): for j in r ...