QT+PCL+VS制作点云显示界面(彩色显示xyz点云)

2023-11-05

前言:

最近正学习QVTKWidget插件显示点云,参考博文:https://blog.csdn.net/wokaowokaowokao12345/article/details/51078495
时发现其提供的官方编译样只能例打开XYZRGB的点云数据,而我的点云为XYZ格式的,故对其进行了小小的改进,使其彩色显示xyz点云。效果如下:
在这里插入图片描述

PCL+Qt+VTK+VS配置:

制作本程序需要安装pcl库,Qt,Visual Stdio,并配置vtk。其中vtk的编译与安装过程可以参考我的上一篇博文,里面有详细教程。

制作过程:

1.在VS中创建一个Qt工程,名为QtPclViewer
在这里插入图片描述
2.添加目录和依赖项,详细参考我的上一篇博文第5部分:https://blog.csdn.net/qinqinxiansheng/article/details/104202021

3.双击.ui文件,打开Qt Designer进行设计,主要包括菜单(File和Help,以及File下的Open)、一个QVTKWidget,四个滑块、数码管、标签。
在这里插入图片描述

4.在Qt Designer里进行简单设计
通过设计信号与槽,使数码管显示滑块的值(也可以用代码实现),并设置滑块条的范围和初始值。

5.设计程序
QtPclViewer.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QtPclViewer.h"
 
#ifndef INITIAL_OPENGL
#define INITIAL_OPENGL
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL)
VTK_MODULE_INIT(vtkInteractionStyle)
#endif

#include <QFileDialog>
#include <vtkRenderWindow.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>

class QtPclViewer : public QMainWindow
{
    Q_OBJECT 

public:
    QtPclViewer(QWidget *parent = Q_NULLPTR);

private:
    Ui::QtPclViewerClass ui;
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
    void initialVtkWidget();
 
protected:
    unsigned red;
    unsigned green;
    unsigned blue;
    double size;
    
    private slots :

       void onOpen();
       void rgbSliderReleased( );
       void pSliderValueChangeed(int value); 
       void redSliderValueChangeed(int value);
       void greenSliderValueChangeed(int value);
       void blueSliderValueChangeed(int value);
};

QtPclViewer.cpp

#include "QtPclViewer.h"

QtPclViewer::QtPclViewer(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    initialVtkWidget();
    connect(ui.actionOpen, SIGNAL(triggered()), this, SLOT(onOpen()));
    connect(ui.horizontalSlider_Size, SIGNAL(valueChanged(int)), this, SLOT(pSliderValueChangeed(int)));//改变大小
    connect(ui.horizontalSlider_Red, SIGNAL(valueChanged(int)), this, SLOT(redSliderValueChangeed(int)));//颜色改变
    connect(ui.horizontalSlider_Green, SIGNAL(valueChanged(int)), this, SLOT(greenSliderValueChangeed(int)));
    connect(ui.horizontalSlider_Blue, SIGNAL(valueChanged(int)), this, SLOT(blueSliderValueChangeed(int)));
    connect(ui.horizontalSlider_Red, SIGNAL(sliderReleased( )), this, SLOT(rgbSliderReleased( )));//slider滑动
    connect(ui.horizontalSlider_Green, SIGNAL(sliderReleased( )), this, SLOT(rgbSliderReleased( )));
    connect(ui.horizontalSlider_Blue, SIGNAL(sliderReleased( )), this, SLOT(rgbSliderReleased( )));
}

void QtPclViewer::initialVtkWidget()
{
    //初始化颜色及大小信息
    red = 255;
    green = 255;
    blue = 255;
    size = 1.0;
    //点云加载 
    cloud.reset(new pcl::PointCloud<pcl::PointXYZ>);
    viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false)); 
    //viewer->addPointCloud(cloud, "cloud");
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, red, green, blue);//自定义点云颜色
    viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "cloud");
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, size, "cloud");//设置点云单个点的大小
    ui.qvtkWidget->SetRenderWindow(viewer->getRenderWindow());
    viewer->setupInteractor(ui.qvtkWidget->GetInteractor(), ui.qvtkWidget->GetRenderWindow());
    ui.qvtkWidget->update();
}
void QtPclViewer::onOpen()
{
    QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".", "Open PCD files(*.pcd)");
    if (!fileName.isEmpty()) {
        std::string file_name = fileName.toStdString();
       //sensor_msgs::PointCloud2 cloud2; 
        pcl::PCLPointCloud2 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");
        pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, red, green, blue);//自定义点云颜色
        viewer->updatePointCloud<pcl::PointXYZ>(cloud, single_color, "cloud");
        viewer->resetCamera();
        ui.qvtkWidget->update();
    }
}
void QtPclViewer::rgbSliderReleased()
{
    //更新点云颜色
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, red, green, blue);
    viewer->updatePointCloud<pcl::PointXYZ>(cloud, single_color, "cloud");
    ui.qvtkWidget->update();
}
void QtPclViewer::redSliderValueChangeed(int value)
{
    red= value;
}
void QtPclViewer::greenSliderValueChangeed(int value)
{
    green= value;
}
void QtPclViewer::blueSliderValueChangeed(int value)
{
    blue= value;
}

void
QtPclViewer::pSliderValueChangeed(int value)
{
    size=double(10+value)/10;
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,
size, "cloud");//设置点云单个点的大小
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>single_color(cloud, red, green, blue);
    viewer->updatePointCloud<pcl::PointXYZ>(cloud,single_color, "cloud");
    ui.qvtkWidget->update();
}

6.将解决方案配置为Release X64版本,运行结果如下所示。点击File–>Open打开xyz点云的.pcd文件,加载点云数据,之后滑动滑块可调节点云颜色和大小。
在这里插入图片描述
最后附上程序连接:https://download.csdn.net/download/qinqinxiansheng/12152456

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT+PCL+VS制作点云显示界面(彩色显示xyz点云) 的相关文章

随机推荐

  • 传输层——TCP报文头介绍

    16位源端口号 16位目的端口号 32位序列号 32位确认序列号 4位头部长度 保留6位 U R G A C K P S H R S T S Y N F I N 16位窗口大小 16位检验和 16位紧急指针 可选项 数据 源端口 长度为16
  • flex布局(骰子布局)

    1 应该都知道使用VS来敲写页面的第一步就是新建文件夹 也可以建文件夹 这是指只有html没有css与js才可以的 然后 可以在VS中打开文件夹 也可以直接把文件夹拖进去 这有两种方法 任意一种就行了 建议你直接拖进去 因为方便 2 这次的
  • Apache配置文件httpd.conf的理解

    httpd conf 是Apache使用的主要配置文件 1 文件位置 一般在 C wamp64 bin apache apache2 4 51 conf 2 是注释符号 1 解释每一指令的作用 2 指令模板 有时去掉 就能使用 3 Unix
  • Surprise库使用总结

    文章目录 Surprise库 1 加载数据模块 2 模型训练前的数据划分模块 2 1 交叉验证数据划分 2 2 训练集测试集划分 3 构建算法模块 3 1 记号说明 3 2 基于统计的算法 3 3 基于近邻 协同过滤 的方法 3 3 1 相
  • stata回归?固定效应模型(组内变换OR LSDV最小二乘法)

    面板数据分析与Stata应用笔记整理自慕课上浙江大学方红生教授的面板数据分析与Stata应用课程 笔记中部分图片来自课程截图 笔记内容还参考了陈强教授的 高级计量经济学及Stata应用 第二版 一 面板数据的定义 面板数据 panel da
  • 笔记本左Ctrl键失灵

    这两天发现笔记本的左Ctrl键单按失灵 无法使用快捷键 很是麻烦 一开始以为按键坏了 打算去官方店维修 但使用在线网站测试 先按其余任意按键的同时 再按左Ctrl 它有反应 可以使用在线键盘测试 zFrontier 装备前线对键盘按键进行在
  • vben admin框架 useForm 时间选择器 开始时间,结束时间解析.懒人方法

    因为搜索部分需要一个创建时间范围 因为DatePicker返回的是一个数组 开始自己在useTable 中的beforeFetch中拦截请求 然后解析参数 重组参数 这样有好多表格组件的时候 就需要写多个beforeFetch 然后闲来无事
  • 《新程序员002》图书正式上市! 从“新数据库时代”到“软件定义汽车”

    20年前 伴随着互联网打开信息化大门 技术人成为新时代的开拓者 在时代的召唤下 CSDN于2001年推出国内首个面向IT人员的专业杂志 程序员 成为一代代开发者的技术启蒙 20年后的今天 人工智能 云计算 大数据等新兴技术被赋予撬动新一轮产
  • 最有效的方法来增加在Map中的值

    关于这个是在一个博客上看到的 就像试一下 测试结果出人意料 看到这个标题可能还是觉得有点抽象 那么首先来一段代码 int count map containsKey string map get string 0 map put strin
  • 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

    给定一个包含 n 个整数的数组 nums 判断 nums 中是否存在三个元素 a b c 使得 a b c 0 找出所有满足条件且不重复的三元组 注意 答案中不可以包含重复的三元组 例如 给定数组 nums 1 0 1 2 1 1 4 满足
  • Linux的chmod

    chmod 命令是 Linux 系统中的一个重要命令 用于更改文件或目录的访问权限 chmod 命令可以设置文件或目录的所有者 所属组和其他用户的读 写 执行权限 通过 chmod 命令 用户可以控制文件或目录的访问权限 以保护重要数据不被
  • KVM学习(一)vnc连接

    完整流程Windows连接CentOS7 这个KVM系列是我的本科毕业设计 边学边做 长期更新 1 安装vncserver 首先看下实验环境 windows上跑的vmware虚拟机 vncserver安装在虚拟机上 虚拟机已经安装好了gno
  • 游戏服务器维护是干啥的,网络游戏的服务器维护都是在做些什么?

    来 我作为前网易游戏从业人员来说说真正服务器维护时候在做什么 服务器维护分成两种 紧急维护和日常维护 1 紧急维护 紧急维护一般就是硬件故障或者严重Bug 这个时候是各个团队最紧张的时候 每个团队都忙个不停 运营团队会发布公告 安慰玩家 统
  • 黑马JAVA P174 线程池概述、线程池的7个参数详解

  • Java Spring注解二:参数请求@RequestParam和@RequestBody

    作为一名crud boy 关于web请求 接口处理基本是家常便饭 涉及到这些中间肯定少不了请求参数 毕竟要根据请求参数才能进行相应的操作 返回预想的结果 一般来说我们web请求参数是不能直接通过http请求来代码识别的 所以你必须要通过注解
  • 关于上采样方法总结(插值和深度学习)

    一 简介 上采样的技术是图像进行超分辨率的必要步骤 最近看到了CVPR2019有一些关于上采样的文章 所以想着把上采样的方法做一个简单的总结 看了一些文章后 发现上采样大致被总结成了三个类别 1 基于线性插值的上采样 2 基于深度学习的上采
  • 十大经典排序算法动画与解析

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 排序算法是 数据结构与算法 中最基本的算法之一 排序算法可以分为内部排序和外部排序 内部排序是数据记录在内存中进行排序 而外部排序是因排序的数据很大 一次不能容纳全部的排序
  • python画图

    python画图 导入模块numpy 命名为np方便后续使用 import numpy as np numpy可进行数组和矩阵运算 提供大量的数学函数库 import matplotlib pyplot as plt matplotlib是
  • 无向图邻接表的深度优先遍历(DFS)

    邻接表是图的一种链式存储结构 对图的每个顶点建立一个单链表 n个顶点建立n个单链表 头文件 Graph h ifndef GRAPH H define GRAPH H define MAXSIZE 50 typedef char Verte
  • QT+PCL+VS制作点云显示界面(彩色显示xyz点云)

    前言 最近正学习QVTKWidget插件显示点云 参考博文 https blog csdn net wokaowokaowokao12345 article details 51078495 时发现其提供的官方编译样只能例打开XYZRGB的