PCL1.12.1+VTK9.1+Qt5.14.2VS创建Qt项目在widget上显示点云

2023-10-08 17:20

本文主要是介绍PCL1.12.1+VTK9.1+Qt5.14.2VS创建Qt项目在widget上显示点云,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在完成VTK9.1源码的编译和VS2019相关配置之后,就可以开始使用Qt5.12进行点云显示了。
很多博客上写的是ui设计师中拖入一个widget,然后提升为QVTKOpenGLNativeWidget。有的则是拖入OpenGLwidget。经过测试发现,两个都是可以的。因为QVTKOpenGLNativeWidget继承自QOpenGLWidget,QOpenGLWidget继承自QWidget。
在这里插入图片描述
在这里插入图片描述
旧一点的版本如PCL1.8可能是将QWidget提升为QVTKWidget,如这篇博客中所介绍的。但是PCL1.12和VTK9.1肯定是提升为QVTKOpenGLNativeWidget。这篇博客种说明了QVTKWidget、QVTKOpenGLWidget、QVTKOpenGLNativeWidget、QVTKWidget2 区别。
仅作为参考:
在这里插入图片描述

然后很多博客中仅用了这三行代码就实现了在Qt中显示点云的功能,但是本人也按照这种方式进行操作时,却无法显示,并报错。

ui.qvtkWidget->SetRenderWindow(viewer->getRenderWindow());
viewer->setupInteractor(ui.qvtkWidget->GetInteractor(), ui.qvtkWidget->GetRenderWindow());
ui.qvtkWidget->update();

按照这三行代码来写,就会报错:
QVTKOpenGLNativeWidget requires a vtkGenericOpenGLRenderWindow. vtkWin32OpenGLRenderWindow is not supported.
引发了异常: 读取访问权限冲突。
win 是 nullptr。
在这里插入图片描述
有的博客中解释到,QVTKWidget有默认的RenderWindow,而QVTKOpenGLWidget是没有的(是空指针)。对于更新的QVTKOpenGLNativeWidget 应该也是空指针。
于是就去查VTK9.1官方关于QVTKOpenGLNativeWidget 类的文档,点击查看官方文档介绍。
在这里插入图片描述
文档说到QOpenGLWidget subclass to house a vtkGenericOpenGLRenderWindow in a Qt application,即QVTKOpenGLNativeWidget 是QOpenGLWidget 的子类,需要在Qt中容纳一个vtkGenericOpenGLRenderWindow 渲染窗口。但是setRenderWindow有两个重载的方法,按道理可以容纳vtkRenderWindow。
在这里插入图片描述
按道理这样创建一个viewer,viewer->getRenderWindow()是返回一个vtkRenderWindow,应该是合理的,但是就是报错了。

boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
ui.openGLWidget->SetRenderWindow(Viewer->getRenderWindow());

在这里插入图片描述
这篇博客也碰到了这种问题。他认为pcl_visualizer创建的renderWindow是vtkwin32OpenGLRenderWindow的派生类。但本人感觉好像不是,vtkRenderWindow是继承自vtkWindow,而vtkWindow继承自vtkObject,vtkObject继承自vtkObjectBase。不断追溯,也没有发现vtkRenderWindow是vtkwin32OpenGLRenderWindow的派生类的情况(不确定)。
在这里插入图片描述
差点就要按照他说的那样重新编译PCL时,发现他给出了一个重要的网址,是一个讨论论坛。仔细观看这些外国人的讨论情况时发现:
在这里插入图片描述
按照这个人的方法成功的实现了在OpenGLWidget(准确来说是QVTKOpenGLNativeWidget )上显示点云的功能。其实就是选择性的调用了PCLVisualizer的一个构造函数。
在这里插入图片描述
至此,终于实现了用Qt显示点云的操作了。
后面又发现其实有人也这么去做了,只不过之前没有认真看。
在这里插入图片描述
其实核心就是这几句,供参考:

  auto renderer2 = vtkSmartPointer<vtkRenderer>::New();auto renderWindow2 = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();renderWindow2->AddRenderer(renderer2);viewer.reset(new pcl::visualization::PCLVisualizer(renderer2, renderWindow2, "viewer", false));this->setRenderWindow(viewer->getRenderWindow());viewer->setupInteractor(this->interactor(), this->renderWindow());

1.这篇博客值得记录——【VTK】关于QVTKOpenGLWidget的RenderWindow设置问题
2.参考帖子
这篇博客中提到了使用Qt结合VTK显示点云,涉及到的内存泄漏问题。
在析构函数中添加下面两行代码进行释放(没有特别测试过加这两行和不加这两行是不是真的有用)。

ui.qvtkWidget->GetInteractor()->SetRenderWindow(nullptr);
ui.qvtkWidget->GetInteractor()->SetInteractorStyle(nullptr);

方法二
除了上述提到的将QWidget或者QOpenGLWidget提升为QVTKOpenGLNativeWidget 之外,还可以通过获取Window的ID的方式来进行显示。此方法甚至不需要对widget进行提升,可以直接使用。

auto winId = QWindow::fromWinId((WId)viewer->getRenderWindow()->GetGenericWindowId());
ui.widget = QWidget::createWindowContainer(winId, nullptr);
ui.widget->setParent(this);
ui.widget->update();

QOpenGLWidget界面实时刷新问题

当我通过Qt实现显示点云后,想着在Qt中加入一些按钮、Label等控件操作点云。但是发现每次操纵点云,界面并不会实时更新,通常需要用鼠标点击一下显示的窗口,也就是显示点云的widget才能完成窗口刷新。用widget->update(),或者viewer->updateCamera()或者viewer->resetCamera()。发现都没有用。

最终解决方法,每次操作后加一句代码,让窗口重新渲染。

Viewer->getRenderWindow()->Render();

解决方法来自于这篇帖子
在这里插入图片描述

这篇关于PCL1.12.1+VTK9.1+Qt5.14.2VS创建Qt项目在widget上显示点云的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/166843

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接:PF-Net PF-Net (Point Fractal Network for 3D Point Cloud Completion)是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像