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安装配置
本人博客中都有涉及,假设还未安装配置的可以查阅。
提示以下新建的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学习研究的一个总结。今后若挣得导师允许。会逐渐将一些算法以博文的形式和大家分享。
PCL+Qt+VS可视化点云的更多相关文章
- [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 ...
- 在PCL中如何实现点云压缩(1)
点云由庞大的数据集组成,这些数据集通过距离.颜色.法线等附加信息来描述空间三维点.此外,点云能以非常高的速率被创建出来,因此需要占用相当大的存储资源,一旦点云需要存储或者通过速率受限制的通信信道进行传 ...
- PCL—低层次视觉—点云分割(邻近信息)
分割给人最直观的影响大概就是邻居和我不一样.比如某条界线这边是中华文明,界线那边是西方文,最简单的分割方式就是在边界上找些居民问:"小伙子,你到底能不能上油管啊?”.然后把能上油管的居民坐标 ...
- PCL—低层次视觉—点云分割(RanSaC)
点云分割 点云分割可谓点云处理的精髓,也是三维图像相对二维图像最大优势的体现.不过多插一句,自Niloy J Mitra教授的Global contrast based salient region ...
- 数据可视化——阿里云解决方案DataV
数据可视化——阿里云解决方案DataV https://help.aliyun.com/document_detail/53844.html?spm=a2c4g.11186623.6.579.37fd ...
- PCL中的OpenNI点云获取框架(OpenNI Grabber Framework in PCL)
从PCL 1.0开始,PCL(三维点云处理库Point Cloud Library)提供了一个通用采集接口,这样可以方便地连接到不同的设备及其驱动.文件格式和其他数据源.PCL集成的第一个数据获取驱动 ...
- PCL 不同类型的点云之间进行类型转换
PCL 不同类型的点云之间进行类型转换 可以使用PCL里面现成的函数pcl::copyPointCloud(): #include <pcl/common/impl/io.h> pcl:: ...
- 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解
PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...
- 用QT制作3D点云显示器——QtDataVisualization
因为QT的三维显示模块QtDataVisualization已经对个人开发免费开放了,所以在制作点云,地图,表格之类的东西的时候,其实我们都不需要使用QtCharts或者QOpenGL模块了.直接使用 ...
随机推荐
- 通过windows自带的系统监视器来查看IIS并发连接数(perfmon.msc)
如果要查看IIS连接数,最简单方便的方法是通过“网站统计”来查看,“网站统计”的当前在线人数可以认为是当前IIS连接数.然而,“网站统计”的当前在线人数统计时间较长,一般为10分钟或15分钟,再加上统 ...
- silverlight RadGridView总结三(转载)
在RadGridView中进行分组以及导出 分组 主要是在前台进行分组的定义: 前台代码: <telerik:RadGridView x:Name="RadGridView1" ...
- RAD Studio XE5破解补丁及方法
通过测试可用,RAD Studio XE5破解补丁及方法 第一步,将下载下来的“delphicbuilder_xe5_win.iso”解压到任意盘,任意目录. 第二步,将“免序列号安装授权文件”文件夹 ...
- html块级元素与内联元素的区别
1. 块级元素(block element): 概念理解:如果不用css控制,块级元素在文档流中以一行显示,及它所占的宽度为其父级元素所占的宽度,若超过宽度会重新另起一行显示,高度会随着内容高度的增 ...
- mock中测试private方法,不是mock
Method method = PowerMockito.method(CategoryController.class, "getCategory",List.class);// ...
- mock实例方法
1.Mockito.when(categoryService.queryTopCategory("1")).thenReturn(categories);//返回的是list列表, ...
- C语言结构体指针的引用问题
在写栈的一个应用时遇见这样的一个问题 SqStack s; s->base = (int*)malloc(sizeof(int)*10); 通过这样一个代码引用的时候,会导致程序出现异常 经过一 ...
- 设计模式中类的关系之依赖关系(Dependence)
依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系.可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的. ...
- webpack 3.x loader
css-loader webpack配置 module:{ rules:[ { test:/\.css$/, use:['style-loader',css-loader] //顺序不能变 } ] } ...
- Customize Netbeans Platform Splash Screen and About Dialog
原帖一直打不开,通过谷歌翻译找到的 http://blogs.kiyut.com/tonny/2007/10/18/customize-netbeans-platform-splash-screen- ...