前言

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. css解决方案之css布局

    固定宽度布局解决方案 固定宽度的居中布局 首先我们这里探讨的是我们常用的固定宽度的居中布局,这应该是目前实战中应用的最多的了. 然后从考虑是否应用大背景上我们分为两种,一种是允许整体有一个大背景,一种 ...

  2. C# 获取当前路径方法(转)

    C# 获取当前路径方法 //获取包含清单的已加载文件的路径或 UNC 位置. public static string sApplicationPath = Assembly.GetExecuting ...

  3. IOS安装CocoaPods完整流程

    作为一个底层系统大菜鸟,又搞过几年ios来说,安装一个CocoaPods是一件蛋痛的事~  说懂又懂,说不懂又不懂.    由于安装过程比較复杂,步骤较多,而网上教程又比較零散,并且有一些是扯蛋的,所 ...

  4. java 图片缩放

    使用java自带的图片处理api,也可以使用(GraphicsMagick + im4j) import java.awt.Image; import java.awt.image.BufferedI ...

  5. NIO之DatagramChannel

    Java NIO中的DatagramChannel是一个能收发UDP包的通道.操作步骤: 1)打开 DatagramChannel 2)接收/发送数据 同样它也支持NIO的非阻塞模式操作,例如: pu ...

  6. virtualenv下使用matplotlib

    Unable to “import matplotlib.pyplot as plt” in virtualenv   (PyMVPA) SimilarFacedeMacBook-Pro:PyMVPA ...

  7. fstream之seekp/seekg/ios::ate/ios::app

    在程序开发中,IO处理无处不在,经常会在代码中遇到特殊的IO处理需求 1.描述 需求:如果文件不存在则创建,存在则打开,然后先读取文件的末行,然后在文件末尾写入. 代码: #include <i ...

  8. Mysql之sync-binlog参数

    Mysql开启bin-log日志使用bin-log时,默认情况下,并不是每次执行写入就与硬盘同步,这样在服务器崩溃是,就可能导致bin-log最后的语句丢失. 可以通过这个参数来调节,sync_bin ...

  9. SSRS 浮动表头设置

    报表的Header部分,在出现分页或者多页的时候仍然会在其他页显示,但是在报表的Body中如果使用Tablix(矩阵)时,行/列标题翻页时候并没有保持固定.解决办法: (1): 左键单击矩阵(Tabl ...

  10. SQL : IN 和 Exists 的区别

    Sql语句中IN和exists的区别及应用 表展示 首先,查询中涉及到的两个表,一个user和一个order表,具体表的内容如下: user表: order表: in 确定给定的值是否与子查询或列表中 ...