【Qt】基于VTK9.1+VS2019+Qt5.15.2的点云可视化程序开发

news2024/9/20 22:54:05

目录

0. 写在前面

1. 开发环境

2. VS 2019 + PCL 1.12.1 配置

3. Qt 5.15.2安装 & Qt-VS插件安装 & VTK 9.1.0编译安装

4. 点云显示demo

4.1 UI

4.2 头文件

4.3 主程序

4.4 显示效果

5. 写在最后


0. 写在前面

由于工作需要和个人爱好,我最近在学习VS+Qt的界面开发和PCL点云库的使用。于是一时兴起准备做一个类似ROS里面自带的Rviz插件的Windows版本。折腾了两天,查阅了很多大佬的博客,但发现信息较为分散还有一些小坑,所以接下来就按照最新的、较为合理的方式来写一个点云可视化的demo。

1. 开发环境

  • Windows 11
  • VS 2019
  • Qt 5.15.2
  • PCL 1.12.1
  • VTK 9.1.0

2. VS 2019 + PCL 1.12.1 配置

参考@wuchuhang的博客:VS2019+pcl1.12.1配置详解 即可。

注意这里VC++目录和链接器的配置方法,后面有一个VTK的坑需要修改配置。

3. Qt 5.15.2安装 & Qt-VS插件安装 & VTK 9.1.0编译安装

参考@Robot_Yue的博客: Qt PCL学习(一):环境搭建 即可。

这里提供另一种VTK编译安装方法:VTK9.1.0在Windows10+VS2019+Qt 5.15.2环境下编译安装

如果使用PCL-AllInOne方式安装的3rd Party库,VTK中会缺少对Qt的支持库,产生如下报错:

error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl QVTKOpenGLNativeWidget::QVTKOpenGLNativeWidget

查看PCL官方库的Issues中也有类似的问题:LNK2019 unresolved external symbol

按照上面的方法重新编译VTK后,将对应的Debug和Release的头文件和库添加到VC++目录和链接器的配置中。

4. 点云显示demo

 所以按照我上面的流程走一遍会发现还有个问题,就是怎么在Qt中添加VTK的Widget。这里就要用到QVTKOpenGLNativeWidget(也不知道谁起的这么魔鬼的名字,至于为什么叫这个名字,大家可以参考@Beyond欣的博客:QVTKWidget、QVTKOpenGLWidget、QVTKOpenGLNativeWidget、QVTKWidget2 区别

而具体的操作方法可以参考@houjinghao的博客:Qt中添加VTK窗口并显示点云

下面是鄙人随便写的一个小Demo。 

4.1 UI

写一个非常简单的UI:CSDN NB!

4.2 头文件

#pragma once

#include <QMainWindow>
#include <QDebug>
#include "ui_pcl_test.h"

// 3rd Party Headers
#include <vtkGenericOpenGLRenderWindow.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>

typedef pcl::PointXYZI PointT;
typedef pcl::PointCloud<PointT> PointCloudT;
typedef pcl::visualization::PCLVisualizer PCLViewer;
typedef std::shared_ptr<PointCloudT> PointCloudPtr;

class PCL_test : public QMainWindow
{
	Q_OBJECT

public:
	PCL_test(QWidget *parent = nullptr);
	~PCL_test();

private:
	Ui::PCL_testClass ui;

	// PCL members
	PointCloudPtr cloudptr;
	PCLViewer::Ptr cloud_viewer;

	void loadPCD();
};

4.3 主程序

因为在我这是一个子窗口,自己把代码塞到main函数里就行了。(我懒得改

#include "pcl_test.h"

PCL_test::PCL_test(QWidget* parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);

	auto renderer = vtkSmartPointer<vtkRenderer>::New();
	auto renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
	renderWindow->AddRenderer(renderer);
	cloud_viewer.reset(new pcl::visualization::PCLVisualizer(renderer, renderWindow, "3D viewer", false));
	ui.qvtkwidget_cloudviewer->setRenderWindow(cloud_viewer->getRenderWindow());   
	cloud_viewer->setupInteractor(ui.qvtkwidget_cloudviewer->interactor(), ui.qvtkwidget_cloudviewer->renderWindow());
	loadPCD();
}

void PCL_test::loadPCD()
{
	// Load point cloud from pcd
	this->cloudptr.reset(new PointCloudT);
	if (pcl::io::loadPCDFile("E:/Dataset/weilai/pcd_selected/3644.500049090.pcd", *this->cloudptr) == -1)
		std::cout << "Open pcd failed!" << std::endl;

	// Color PointCloud according to the field
	pcl::visualization::PointCloudColorHandlerGenericField<PointT> color_handler(this->cloudptr, "intensity");
	cloud_viewer->addPointCloud(this->cloudptr, color_handler);

	cloud_viewer->spin();
}

PCL_test::~PCL_test()
{}

4.4 显示效果

目前还在图一乐阶段:

5. 写在最后

因为我也才接触Qt开发大约一周时间,所以以上内容难免有所错漏,希望评论区的大佬不吝赐教~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079384.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

lenovo M7328W 复印二页不同的内容到同一张白纸上,要求要全都是正向,就是一个方向显示。当然也可以不一样,那就随便放不要求正反,只要求位置一致。

1、先上个图&#xff0c;打开软件&#xff1a; 按一下电源键&#xff0c;将休眠中的打印机&#xff0c;变成待机状态&#xff0c;这样才可以复印。 2、打开复印的盖板&#xff0c;将要复印的一面帖在最右侧&#xff0c;右侧要留一些空白距离&#xff0c;然后点击复印按钮&#…

数据存储单位——真题详解

在计算机中&#xff0c;以下哪个选项描述的数据存储容量最小?( ) A. 字节(byte) B. 比特(bit) C. 字(word) D. 千字节(kilobyte) 【答案】 B 【解析】 本题考查计算机数据存储容量单位的比较&#xff0c;这个题目看起来很简单&#xff0c;但有的老师甚至都会做错&am…

华为海思招聘-芯片与器件设计工程师-数字芯片方向- 机试题——(共九套)(每套四十题)

华为海思招聘-芯片与器件设计工程师-数字芯片方向- 机试题-题目分享——共九套&#xff08;每套四十题&#xff09; 岗位——芯片与器件设计工程师 岗位意向——数字芯片 真题题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&am…

天下通商城:数字时代的智能消费助手

随着数字经济的飞速发展&#xff0c;消费方式也在不断革新。天下通网络科技&#xff08;海南&#xff09;有限公司顺应这一趋势&#xff0c;推出了天下通商城&#xff0c;这一平台不仅简化了购物流程&#xff0c;还为用户提供了丰富的智能消费工具&#xff0c;成为现代消费者的…

解决国产手机wda不能联网问题

前言 国产手机在通过tidevice无线调试启动wda&#xff08;webdriveragent&#xff09;后&#xff0c;会有报错&#xff1a; request error:(‘Connectionaborted.’, SocketError(‘socket timeout’))AirtestIDE或者appnium inspector 无法连接手机显示模拟器界面&#xff0c…

音频导出后为什么效果变差了 FL Studio音频导出设置推荐

FL Studio是一款功能强大的编曲软件&#xff0c;除了可以编曲之外&#xff0c;FL Studio还支持各种音频格式导出。有的小伙伴在使用FL Studio导出音频后&#xff0c;会发现的导出的音频效果不理想&#xff0c;这很大的原因可能是导出设置不对造成的。下面给大家详细讲解&#x…

20240827让飞凌的OK3588-C核心板在Linux R4下通过rockit工具的VI功能获取SONY索尼8530机芯的YUV图

20240827让飞凌的OK3588-C核心板在Linux R4下通过rockit工具的VI功能获取SONY索尼8530机芯的YUV图 2024/8/27 19:40 缘起&#xff0c;我司使用飞凌的OK3588-C的核心板&#xff0c;系统是Linux R4版本。 机芯选用SONY索尼的HDMI OUT接口的8530&#xff0c;输出格式有BGR3/NV16。…

CMake之PUBLIC、PRIVATE、INTERFACE

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~ 个人主页&#xff1a; rainInSunny | 个人专栏&#xff1a; C那些事儿、 Qt那些事儿 文章目录 写在前面抽象版解释头文件和链接库传递测试代码结构PUBLIC传递PRIVATE传递INTERFACE传递 写在前面 使用CMake必然离不开target_include_dir…

LVGL从SD卡读取图片并显示到MCU LCD屏详细笔记教程

1、前言 在上一篇LVGL专题文章中已经讲解了如何将LVGL与FatFs链接起来&#xff0c;实现LVGL对SD卡中的数据进行读写操作。本文在上一文的基础上&#xff0c;将实现LVGL读取文件系统中的图片文件&#xff08;BMP、PNG、JPG&#xff09;&#xff0c;并显示到MCU设备中的LCD屏中。…

转行软件测试必需要知道的知识

1前言 随着现在互联网行业的迅猛发展&#xff0c;越来越多的人想涌入进来&#xff0c;因为大家都觉得IT行业工资高&#xff0c;做测试门槛又低&#xff0c;是的&#xff0c;入门门槛确实比较低&#xff0c;但是要做好的话&#xff0c;还是有点难的&#xff0c;毕竟术业有专攻嘛…

网约车资格证考试攻略(必备宝典)

考试分数详情及攻略如下&#xff1a; 一、理论部分&#xff1a;&#xff08;电脑操作&#xff0c;鼠标勾选&#xff09; 1、全国试题&#xff0c;满分50分&#xff0c;40分过关&#xff0c;每位学员要练习到45分才行&#xff1b; 2、地方试题&#xff0c;满分25分&#xff0c…

Vue3源码调试-第三篇

前言 上两篇已经调试完packages/runtime-dom/src/index.ts下的createApp函数的第一行了&#xff0c;接下来我们看下一行 injectNativeTagCheck 首先说下这个__DEV__估计也是定义在dev.js下&#xff0c;又或者是哪里的&#xff0c;这里控制台输出是true&#xff0c;那我估计是…

Nginx: 代理场景下Nginx接收用户请求包体的处理

Nginx 反向代理图 当用户发过来一个request body的时候&#xff0c;Nginx 是如何处理这样一个body这个body 它对应的就是我们客户请求的一些具体内容 1 &#xff09;proxy_request_bufering 指令 接收包体的两种方式 接收完全部包体再发送一边接收包体一边发送 接收包体的两种…

前端项目部署到服务器上(nginx)

我这个之前已经部署过项目&#xff0c;所以要进行这个操作 docker imagedocker rm -f nginx //用于强制删除名为“nginx”的容器docker ps //用于列出当前正在运行的Docker容器docker volume -fdocker volume prune //用于删除所有未使用的Docker数据卷&#xff0c;‌释放存…

day11JS-面向对象和js中的设计模式

1. 面向对象 1.1 什么是面向对象 面向对象是一种编程思想&#xff0c;JS就是基于这个思想构建出来的一门编程语言&#xff0c;所以JS中存在对象、类、实例的概念。 对象&#xff1a;万物皆对象。 构造函数&#xff08;类&#xff09;&#xff1a;把具有某一特征的内容可以划分…

穿梭虚实之间:3DGS与NeRF如何辅助机器人遥控操作?

导读&#xff1a; 本研究介绍了一种用于机器人遥控操作的新型辐射场可视化技术&#xff0c;研究者提出了一种在线训练辐射场的方法&#xff0c;能够实时从多个摄像头获取数据&#xff0c;支持多种辐射方法&#xff0c;包括NeRF和3DGS。该系统与现有的ROS遥控操作系统集成&#…

惠海H6501 DCDC降压恒压ic 60V72V80V100V转24V36V48V实地架构低功耗 仪表仪器供电 兼容XX9487

H6501是一款高压降压型开关稳压器&#xff0c;可输出高达1A的持续电流至负载。它集成了一个 高压高端MOSFET&#xff0c;提供2.5A的典型峰值电流限。其4.5V至48V的宽输入电压范围可适用于各种降压应用&#xff0c;是汽车、工业和照明应用的理想之选。采用滞环电压控制模式&…

行为识别实战第二天——Yolov5+SlowFast+deepsort: Action Detection(PytorchVideo)

Yolov5SlowFastdeepsort 一、简介 YoloV5SlowFastDeepSort 是一个结合了目标检测、动作识别和目标跟踪技术的视频处理框架。这一集成系统利用了各自领域中的先进技术&#xff0c;为视频监控、体育分析、人机交互等应用提供了一种强大的解决方案。 1. 组件说明&#xff1a; Y…

golang笔记——Go堆内存管理

前言 本文主要记录个人学习Golang堆内存管理&#xff0c;涉及到的相关内容&#xff0c;算是对个人所学知识点的梳理与总结。从非常宏观的角度看&#xff0c;Go的堆内存管理就是下图这个样子 学习内存管理&#xff0c;肯定首先需要了解内存管理的基本知识&#xff0c;我会按照 内…

C++笔记10•容器适配器:stackqueue priority_queue•

从C中看stack&queue&priority_queue 1.stack的介绍 官方stack实现&#xff1a; 本质是一个数组 1. stack 是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack 是作为容器适…