当前位置: 首页 > news >正文

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

目录

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_OBJECTpublic:PCL_test(QWidget *parent = nullptr);~PCL_test();private:Ui::PCL_testClass ui;// PCL membersPointCloudPtr 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 pcdthis->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 fieldpcl::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开发大约一周时间,所以以上内容难免有所错漏,希望评论区的大佬不吝赐教~

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C++ Primer Plus习题】6.9
  • Elasticsearch(面试篇)
  • 第三十九篇-TeslaP40+CosyVoice-安装
  • 云计算实训38——docker网络、跨主机容器之间的通讯
  • STM32(F103ZET6)第十九课:FreeRtos的移植和使用
  • SQLserver使用sql语句创建主键,外键,唯一约束,自增
  • CSS中的元素布局与定位详细说明
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • Android插件化技术之加载未安装APK
  • 数据链路层(Mac帧,报头字段,局域网通信原理),MTU,MSS,ip报文的分包与组装(ip报头字段介绍,组装过程,判断是否被分片/收到全部分片)
  • 【LeetCode面试150】——54螺旋矩阵
  • Codeforces 1304C - Air Conditioner(1500)
  • MYSQL 优化
  • 高级前端工程师React面试题
  • pikachu靶场通关攻略(XSS)(1~10关)
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Android交互
  • js面向对象
  • MySQL QA
  • python docx文档转html页面
  • Redux 中间件分析
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 力扣(LeetCode)21
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用SAX解析XML
  • 算法---两个栈实现一个队列
  • Spring第一个helloWorld
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • # 职场生活之道:善于团结
  • #window11设置系统变量#
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (07)Hive——窗口函数详解
  • (1)bark-ml
  • (2)STM32单片机上位机
  • (function(){})()的分步解析
  • (二)windows配置JDK环境
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)ObjectiveC 深浅拷贝学习
  • ***检测工具之RKHunter AIDE
  • ./和../以及/和~之间的区别
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net 无限分类
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉