Create a PCL visualizer in Qt with QtDesigner

2023-10-27

这是PCL文档中的例程实现,原文地址:http://pointclouds.org/documentation/tutorials/qt_visualizer.php#more-on-qt-and-pcl

介绍一下环境:Ubuntu16.04 + Qt5.8 + PCL1.8.1 + VTK7.1.1

配置环境见另一篇文章。

UI部分:

只允许在QtDesigner中修改

图片左上角第一个图标:Edit Wdigets模式

组件名:

HorizontalSlider

LCD Number

Push Button

QVTKWidget

点击slider,右下角属性修改最大最小值。

左上角第二个图标:Edit Signals/Slots模式

点击slider 拖动到LCD Number弹出函数选择窗口,选择sliderMoved(int)->display(int)

 

代码部分

头文件pclviewer.h

#ifndef PCLVIEWER_H
#define PCLVIEWER_H

#include <QMainWindow>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
//qvtk
#include<vtkRenderWindow.h>

namespace Ui {
class PCLViewer;
}

class PCLViewer : public QMainWindow
{
    Q_OBJECT

public:
    explicit PCLViewer(QWidget *parent = 0);
    ~PCLViewer();

/**
  *信号/槽 函数声明
  */
public Q_SLOTS:
    //随机颜色按钮点击响应方法
    void randomButtonPressed ();
    //RGB颜色条值变更响应
    void RGBsliderReleased ();
    //点云大小滑动条值变更响应
    void pSliderValueChanged (int value);
    //Red值滑动响应
    void redSliderValueChanged (int value);
    //Green值滑动响应
    void greenSliderValueChanged (int value);
    //Blue值滑动响应
    void blueSliderValueChanged (int value);

protected:
    //声明视窗
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
    //声明点云指针
    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud;
    //RGB三色值变量
    unsigned int red;
    unsigned int green;
    unsigned int blue;

private:
    Ui::PCLViewer *ui;
};

#endif // PCLVIEWER_H

pclviewer.cpp

#include "pclviewer.h"
#include "ui_pclviewer.h"

PCLViewer::PCLViewer(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::PCLViewer)
{
    ui->setupUi(this);
    this->setWindowTitle("PCL Viewer");

    //初始化点云
    cloud.reset(new pcl::PointCloud<pcl::PointXYZRGBA>);

    //设置点云大小
    cloud->points.resize(200);

    //默认颜色
    red = 128;
    green = 128;
    blue = 128;

    //填充点云
    for (size_t i = 0; i < cloud->points.size (); ++i)
    {
        cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
        cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
        cloud->points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);

        cloud->points[i].r = red;
        cloud->points[i].g = green;
        cloud->points[i].b = blue;
    }

    //设置QVTK窗口
    viewer.reset(new pcl::visualization::PCLVisualizer("view", false));
    ui->qvtkWidget->SetRenderWindow(viewer->getRenderWindow());
    viewer->setupInteractor (ui->qvtkWidget->GetInteractor (), ui->qvtkWidget->GetRenderWindow ());
    //关联点云到viewer
    viewer->addPointCloud(cloud, "cloud");
    ui->qvtkWidget->update ();

    // Connect "random" button and the function
    connect (ui->pushButton_random,  SIGNAL (clicked ()), this, SLOT (randomButtonPressed ()));

    // Connect R,G,B sliders and their functions
    connect (ui->horizontalSlider_R, SIGNAL (valueChanged (int)), this, SLOT (redSliderValueChanged (int)));
    connect (ui->horizontalSlider_G, SIGNAL (valueChanged (int)), this, SLOT (greenSliderValueChanged (int)));
    connect (ui->horizontalSlider_B, SIGNAL (valueChanged (int)), this, SLOT (blueSliderValueChanged(int)));
    connect (ui->horizontalSlider_R, SIGNAL (sliderReleased ()), this, SLOT (RGBsliderReleased ()));
    connect (ui->horizontalSlider_G, SIGNAL (sliderReleased ()), this, SLOT (RGBsliderReleased ()));
    connect (ui->horizontalSlider_B, SIGNAL (sliderReleased ()), this, SLOT (RGBsliderReleased ()));

    // Connect point size slider
    connect (ui->horizontalSlider_P, SIGNAL (valueChanged (int)), this, SLOT (pSliderValueChanged (int)));

    pSliderValueChanged (2);
    viewer->resetCamera ();
    ui->qvtkWidget->update ();

}

void
PCLViewer::randomButtonPressed ()
{
    printf ("Random button was pressed\n");

    // Set the new color
    for (size_t i = 0; i < cloud->size(); i++)
    {
        cloud->points[i].r = 255 *(1024 * rand () / (RAND_MAX + 1.0f));
        cloud->points[i].g = 255 *(1024 * rand () / (RAND_MAX + 1.0f));
        cloud->points[i].b = 255 *(1024 * rand () / (RAND_MAX + 1.0f));
    }
    //点云颜色改变,在viewer中更新
    viewer->updatePointCloud (cloud, "cloud");
    //更新qvtk
    ui->qvtkWidget->update ();
}

void
PCLViewer::RGBsliderReleased ()
{
    // Set the new color
    for (size_t i = 0; i < cloud->size (); i++)
    {
        cloud->points[i].r = red;
        cloud->points[i].g = green;
        cloud->points[i].b = blue;
    }
    viewer->updatePointCloud (cloud, "cloud");
    ui->qvtkWidget->update ();
}

void
PCLViewer::redSliderValueChanged (int value)
{
    red = value;
    printf ("redSliderValueChanged: [%d|%d|%d]\n", red, green, blue);
}

void
PCLViewer::greenSliderValueChanged (int value)
{
    green = value;
    printf ("greenSliderValueChanged: [%d|%d|%d]\n", red, green, blue);
}

void
PCLViewer::blueSliderValueChanged (int value)
{
    blue = value;
    printf("blueSliderValueChanged: [%d|%d|%d]\n", red, green, blue);
}

void
PCLViewer::pSliderValueChanged (int value)
{
    //改变点云大小
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, value, "cloud");

    viewer->updatePointCloud (cloud, "cloud");
    ui->qvtkWidget->update ();
    printf("pSliderValueChanged: [%d]\n", value);
}

PCLViewer::~PCLViewer()
{
    delete ui;
}

效果图:随机颜色

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

Create a PCL visualizer in Qt with QtDesigner 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • google翻译的一个错误

    如图 音标标着yi朗读却是ai
  • 需要多表连接查询时该怎么弄(一对多的情况)

    第一步 一对多时应该在 一的类中 添加 多的类 的集合变量 例 通过部门号来查询特定的部门 以及该部门中所有的职工 这时需要在dept类中新增一个集合变量 第二步 开始写具体代码 方法一 通过连接查询 左外连接 一次到位 方法二 分步查询
  • ReactNative ListView + 上拉加载更多 + 下拉刷新

    ListView 上拉加载更多 下拉刷新 一 内容简介 ListView列表在添加了上拉加载更多功能之后再添加下拉刷新 二 代码实现 1 引入原生组件 RefreshControl import ListView View Text Act
  • mysql表的约束

    目录 一 表的约束分类 1 not null 非空 输入的数据内容不能为空 2 unique key 唯一键 输入的数据可以为null或者跳过赋予他的值 但是如果输入数据不能相同 3 primary key 主键 每个表中必须有唯一的主键
  • matlab编写dbscan聚类

    在Matlab中编写DBSCAN聚类的方法有很多种 一种常用的方法是手动编写代码 下面是一个简单的DBSCAN示例 function labels nClusters dbscan data eps MinPts data 数据点 eps
  • Qt 使用QInputDialog弹出输入框获取用户输入数据

    简要说明 在开发Qt程序的过程中 我们可能会需要在程序中弹出输入框 并且获取用户输入的数据 一种比较麻烦的做法就是新建一个对话框类 然后在主界面中调用对话框类 获取返回值 使用QInputDialog对话框类可以通过访问不同的接口函数 弹出
  • php导出数据xlsx

    lists 二维数组 public function xlsx lists 生成文件名 date date Y m d H i s time fileName XXXX date xlsx 头部标题 xlsx header array 序号
  • Java Springboot--swagger配置

    文章转载自 第一步 配置pom xml文件
  • 视线估计(Gaze Estimation)简介概述

    PaperWeekly 原创 作者 俞雨 单位 瑞士洛桑联邦理工学院博士 研究方向 视线估计 头部姿态估计 本文七个篇章总计涵盖 29 篇论文 总结了自深度学习以来 视线估计领域近五年的发展 概述 1 1 问题定义 广义的 Gaze Est
  • [Unity]Lua本地时间、倒计时和正计时。

    惯例 直接上代码 正计时开始时的时间戳 self begin time os time 倒计时时长 01 30 00 self countdown time 5400 是否开始计时 self is update local time tru
  • 一文搞定在Ubuntu安装tldr

    目录 第一步 执行安装命令 第二步 更新tldr数据库 第三步 测试tldr功能 补充 未成功返回的错误类型 在安装之前你得先在Ubuntu上登入你自己的账户 当然你肯定在刚安装好Ubuntu的时候就注册自己的账户并且登录了 第一步 执行安
  • 大页内存(HugePages)在通用程序优化中的应用

    今天给大家介绍一种比较新奇的程序性能优化方法 大页内存 HugePages 简单来说就是通过增大操作系统页的大小来减小页表 从而避免快表缺失 这方面的资料比较贫乏 而且网上绝大多数资料都是介绍它在Oracle数据库中的应用 这会让人产生一种
  • 2021-01-17

    静态路由实验 实验目的 1 全网所有网段全部基于192 168 1 0 24划分所得 2 R1 R4每台设备均有两个环回 3 全网可达 4 尽量减少路由条目 且防止环路 5 R5的环回5 5 5 5 24不能出现在其他的设备路由表中 6 按
  • 2021-04-12

    NLP 自然语言处理 和CV相比 nlp最大的特点是特征是离散的 不像cv中是一幅图 nlp是一个个的句子 简单说几点nlp的难点 1 相同意思的句子表达有多种 我爱踢足球 足球是我的爱好 我的爱好之一是足球 2 相同词在不同语境中意思不同
  • vue项目 v-for无法渲染问题

    使用map 函数 可能是解决了对象指向问题 目前还不知道原因 postlist fav2是在data 中定义的数组 在created 里对postlist fav2进行了数组对象的初始化操作 然后就无法渲染 使用map方法才能渲染到页面上
  • 写入单元格_Excel VBA单元格的基本操作(一)

    在Excel VBA中 对单元格的操作可以有多种形式来定义表示 1 打开Visual Basic 添加模块和过程 称之为 单元格操作 Sub 单元格操作 End Sub 2 单元格第一种表达方式 直接定位到某个单元格 B3 Sub 单元格操
  • ES6的Class的prototype、__proto__

    ES6继承与ES5的区别 ES6通过class实现继承 class的继承通过关键字extends实现 class Parent constructor name this name name getName console log this
  • Linux下基于Zynq用EthLite+GmiitoRgmii实现100M网络通信

    目录 前言 一 IP核配置 1 ETHLITE配置 2 GMIITORGMII配置 二 IP 连接关系 三 设备树描述 前言 本文将介绍如何在Linux下使用EthLite加GmiitoRgmii实现百兆网络通信 此方法只需要一个中断 若工
  • 百度AIStudio平台 持久化安装包

    目录 查看环境 创建目录 安装在该目录下 重启后仍可用 查看环境 平台使用的是conda创建的虚拟环境进行安装的包 不过我们可以使用pip安装工具快速安装 而且使用conda默认安装的包将在下次启动服务时还原 注 该教程不适用于tensor
  • Create a PCL visualizer in Qt with QtDesigner

    这是PCL文档中的例程实现 原文地址 http pointclouds org documentation tutorials qt visualizer php more on qt and pcl 介绍一下环境 Ubuntu16 04