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安装配置

本人博客中都有涉及,如果还未安装配置的可以查阅。

提示下面新建的工程要配置PCL。

新建工程和编写相关代码

  1. 在VS中新建QtApplication工程

  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进行构建,并将完整工程上传至百度云盘,如果有需要的可以进行下载。

更加复杂的例子

这款软件是基于Qt、PCL、VTK、GDAL、LASLib、Liblas、Tiff、GeoTiff、opencv等库开发,是对笔者研究生阶段有关LiDAR学习研究的一个总结。今后若挣得导师同意,会逐渐将一些算法以博文的形式和大家分享。

时间: 2024-10-19 10:07:47

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

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

点云分割 点云分割可谓点云处理的精髓,也是三维图像相对二维图像最大优势的体现.不过多插一句,自Niloy J Mitra教授的Global contrast based salient region detection出现,最优分割到底鹿死谁手还不好说.暂且不论他开挂的图像处理算法,先安心做一个PCL吹~ 点云分割的目的提取点云中的不同物体,从而实现分而治之,突出重点,单独处理的目的.而在现实点云数据中,往往对场景中的物体有一定先验知识.比如:桌面墙面多半是大平面,桌上的罐子应该是圆柱体,长方体

Qt高级——Qt数据可视化性能优化

Qt高级--Qt数据可视化性能优化 一.数据可视化简介 1.数据可视化简介 数据可视化即采用图形图表等对采集的数据进行展示,可以非常直观的查看传感器采集到的数据.本文将使用Qt的标准组件QTableWidget.标准模型.自定义模型分别实现对数据的表格展示. 2.系统环境 个人PC:ThinkPad T450操作系统:RHEL7.3 WorkStation内存容量:8G磁盘容量:SSD 100GCPU:Intel(R) Core(TM) i5-5200U CPU @ 2.20GHz 二.标准界面

PCL—低层次视觉—点云分割(超体聚类)

1.超体聚类——一种来自图像的分割方法 超体(supervoxel)是一种集合,集合的元素是“体”.与体素滤波器中的体类似,其本质是一个个的小方块.与之前提到的所有分割手段不同,超体聚类的目的并不是分割出某种特定物体,其对点云实施过分割(over segmentation),将场景点云化成很多小块,并研究每个小块之间的关系.这种将更小单元合并的分割思路已经出现了有些年份了,在图像分割中,像素聚类形成超像素,以超像素关系来理解图像已经广为研究.本质上这种方法是对局部的一种总结,纹理,材质,颜色类似

ROS机器人程序设计(原书第2版)补充资料 (陆) 第六章 点云 PCL

书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. RGBD深度摄像头传感器最常用的数据存储,处理和显示方式就是点云. 推荐查阅-PCL官网:http://www.pointclouds.org/ 1. http://wiki.ros.org/pcl_ros 2. http://wiki.ros.org/pcl 补充阅读: 1 http://blog.csdn.net/zhangrelay/article/details/50053733

PCL中点云数据格式之间的转化

(1) 关于pcl::PCLPointCloud2::Ptr和pcl::PointCloud<pcl::PointXYZ>两中数据结构的区别 pcl::PointXYZ::PointXYZ ( float_x, float_y, float_z ) 区别: struct PCLPointCloud2 { PCLPointCloud2 () : header (), height (0), width (0), fields (), is_bigendian (false), point_ste

PCL系列——如何逐渐地配准一对点云

PCL系列 PCL系列--读入PCD格式文件操作 PCL系列--将点云数据写入PCD格式文件 PCL系列--拼接两个点云 PCL系列--从深度图像(RangeImage)中提取NARF关键点 PCL系列--如何可视化深度图像 PCL系列--如何使用迭代最近点法(ICP)配准 PCL系列--如何逐渐地配准一对点云 PCL系列--三维重构之泊松重构 PCL系列--三维重构之贪婪三角投影算法 PCL系列--三维重构之移动立方体算法 说明 通过本教程,我们将会学会: 如何配准多个点云图. 配准的方法是:

PCL学习笔记(4):创建点云文件、加载点云文件

PCL(point cloud library)系列笔记:http://blog.csdn.net/chentravelling/article/category/2876349 //先上代码: bool saveThePointCloud() { pcl::PointCloud<pcl::PointXYZ> Cloud; //定义点云对象,类型PointXYZ // 创建点云 Cloud.width=30; Cloud.height=1; Cloud.is_dense=false; Clou

PCL入门—点云操作 定义变量 显示点云 存储

1 // 定义相关变量 2 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ptr (new pcl::PointCloud<pcl::PointXYZ>); 3 pcl::PointCloud<pcl::PointXYZ>& cloud = *cloud_ptr; //点云 4 //初始化点云数据PCD文件头 5 cloud.width = depthHeight * depthWidth; 6 cloud.height =

pcl总结

基本用法1.pcl功能介绍(解释各个模块和功能)2.开始/基本结构(介绍pcl基本数据结构和相关代码示例)3.在自己项目中使用PCL(如何使用cmake PCL链接自己的项目)4.如何编译PCL在POSIX / Unix系统.5.解释PCL的cmake选项(基本的PCL cmake选项,以及如何调整以适应您的项目)6.在windows上源代码构建pcl的依赖性7.在windows上源码编译PCL8.从MacPorts在Mac OS X上编译PCL及其依赖项和源9.如何安装点云库在Mac OS X