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 的相关文章

  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问

随机推荐

  • 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