win11下的VS2022+QT6+VTK9.2+PCL1.13.1联合开发环境配置及踩坑记录

news/2024/5/9 21:56:11/文章来源:https://blog.csdn.net/mjmald/article/details/133828390

准备工作:

安装VS2022:这个比较简单,网上随便找个教程就行

安装QT并为VS2022添加QT Creater插件:VS2022配置Qt6_vs2022 qt6-CSDN博客

安装PCL:vs2022配置pcl1.13.1_pcl配置-CSDN博客 安装PCL过程中本身也会安装VTK,但是这个VTK是个丐版,所以就需要下载VTK的源码编译后对PCL中的VTK进行补充

下载CMAKE-gui:(版本最好是最新)不然后面生成boost相关会报错 CMake

下载VTK:在 VTK官网 中下载VTK9.2.0待编译源码,解压后在路径Documentation/dev/bulid.md中可以看到官方提供的Prerequisites以及简易教程

编译VTK9.2:

1、VTK下载完成后解压,然后用Cmake-gui打开;新建个文件夹VTK_QT装生成后的文件,在VTK_QT中新建一个build文件夹作为安装目录

 2、点击【Add Entry】按钮添加缓存变量 CMAKE_DEBUG_POSTFIX,类型为 STRING,值设置为 -gd。这样一次性就可以把release和debug分开生成。

3、单击【Configure】进行配置,根据安装的 VS2022 对应版本的生成器,选择 x64 平台。然后开始配置。配置过程中,cmake 会检测当前环境,编译器等,并生成缓存变量。第一次配置完成后,需要对一些缓存变量进行修改。

4、第一次结束后会弹出来一些红色的待确定选项:这里有几个地方要注意:

检查构建lib是否打勾:

 安装目录修改成自己想要的(尽量不要默认,默认可能有权限错误):

选中Grouped和Advanced,在搜索窗口中搜索QT,将所有与QT相关的选项设置为WANT,QT版本设置为6,然后点击Configure:

Configure后会出现新的红色区域,这里是让我们选择 Qt6 中各模块的位置:

5、Configuring done 后,如果只有白色界面,代表没有错误。如果你的界面依旧有红色,返回检查以上哪步没有勾选,一直Configure到只有白色界面,最后点击 Generate,完成后打开项目,先把Debug x64打开:

        右键解决方案中的ALL_BUILD,生成,完成后再右键INSTALL,生成,生成完毕ALL_BUILD应该是成功200多个,失败0,INSTALL是成功100多个,更新100多个,失败0。完成后换成release再重复一遍。

6、完成后在CMake设置的安装目录中找到四个文件夹,复制后替换PCL/3rdparty/VTK中的这4个文件夹,不要覆盖之前的vtk,重名的选择跳过

 7、最后,如果不使用CMAKE,就把PCL\3rdParty\VTK\lib目录下新增的与QT相关的lib加到VS的属性里面。如果使用CMAKE,就在PCL安装目录的cmake目录中,打开PCLConfig.cmake,在500行左右找到这个:

用#把原来的注释了,换成(增加Qt的东西):

set(PCL_VTK_COMPONENTS "ChartsCore;CommonColor;CommonComputationalGeometry;CommonCore;CommonDataModel;CommonExecutionModel;CommonMath;CommonMisc;CommonTransforms;FiltersCore;FiltersExtraction;FiltersGeneral;FiltersGeometry;FiltersModeling;FiltersSources;ImagingCore;ImagingSources;InteractionImage;InteractionStyle;InteractionWidgets;IOCore;IOGeometry;IOImage;IOLegacy;IOPLY;RenderingAnnotation;RenderingCore;RenderingContext2D;RenderingLOD;RenderingFreeType;ViewsCore;ViewsContext2D;RenderingOpenGL2;RenderingVolumeOpenGL2;GUISupportQt;GUISupportQtQuick;GUISupportQtSQL;RenderingQt;ViewsQt")

使用QVTKOpenGLNativeWidget

配置完成后,打开.ui文件,拖一个Widget,右键选择提升,提升成QVTKOpenGLNativeWidget。 

 

完成后在创建的界面程序的.cpp文件中使用如下函数即可实现在QT界面上显示点云文件:

#include "MainWindow.h"
#include <qpainter.h>
#include <qdebug.h>
#include <pcl/common/io.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/PolygonMesh.h>
#include <pcl/point_cloud.h>
#include <pcl/io/vtk_lib_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/common/common_headers.h>
#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/parse.h>
#include <pcl/io/ply_io.h>
#include <vtkRenderWindow.h>
#include <QVTKRenderWidget.h>
#include <QVTKOpenGLNativeWidget.h>
#include <vtkGenericOpenGLRenderWindow.h>//这个必须加MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);pcl::visualization::PCLVisualizer::Ptr viewer;pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>);auto renderer2 = vtkSmartPointer<vtkRenderer>::New();auto renderWindow2 = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();renderWindow2->AddRenderer(renderer2);viewer.reset(new pcl::visualization::PCLVisualizer(renderer2, renderWindow2, "viewer", false));ui->screen->setRenderWindow(viewer->getRenderWindow());viewer->setupInteractor(ui->screen->interactor(), ui->screen->renderWindow());pcl::io::loadPCDFile(".../xxx.pcd", *cloud);viewer->addPointCloud<pcl::PointXYZRGBA>(cloud, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
}MainWindow::~MainWindow()
{delete ui;
}

报错解决:

1、无法打开包括文件: “QOpenGLWidget”: No such file or directory

        检查在Qt的include目录中QOpenGLWidget是否是在include目录下面,我的是在QOpenGLWidgets文件夹下,引入的路径修改为:#include <QOpenGLWidgets/QOpenGLWidget>   即可。 

2、无法解析的外部符号QOpenGLWidget::resizeGL(int,int)" (?resizeGL@QOpenGLWidget...

        打开项目属性表,选择Qt Project Settings,给Qt Modules添加opengl,给Additional Project Settings添加QT += openglwidgets,解决。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

六、DHCP实验

拓扑图&#xff1a; DHCP协议&#xff0c;给定一个ip范围使其自动给终端分配IP&#xff0c;提高了IP分配的效率 首先对PC设备选择DHCP分配ip 首先先对路由器的下端配置网关的ip 创建地址池&#xff0c;通过globle的方式实现DHCP ip pool 地址池名称 之后设置地址池的网关地址…

VS Code:CMake配置

概述 在VSCode和编译器MinGW安装完毕后&#xff0c;要更高效率的进行C/C开发&#xff0c;采用CMake。CMake是一个开源、跨平台的编译、测试和打包工具&#xff0c;它使用比较简单的语言描述编译&#xff0c;安装的过程&#xff0c;输出Makefile或者project文件&#xff0c;再去…

两种方式获取Stream流的方式

java.util.stream.Stream<T> 是Java 8 新加入的最常用的流接口。&#xff08;这并不是一个函数式接口&#xff09;获取一个流有以下两种方式 所有的 Collection集合 都可以通过stream默认方法获取流 Stream接口 的静态方法of可以获取数组对应的流 package com.csdn.s…

AI对网络安全的影响与挑战

近年来&#xff0c;随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;网络安全领域也开始逐渐引入生成式AI应用。根据最新的数据研究&#xff0c;生成式AI对网络安全和合规的影响最大&#xff0c;同时也包括了IT和云的运维、硬件和软件支持领域。通过AI和自动…

Folium 笔记:使用PopUp突出subzone的空间分布

0 效果图 点开某一个区域后&#xff0c;内容是这个区域的用地类型分布 1 读取数据 import folium import matplotlib.pyplot as plt import re import geopandas as gpd subzonegpd.read_file(MasterPlan2019PlanningAreaBoundaryNoSea.geojson) subzone 2 提取subzone 信息 …

SystemVerilog Assertions应用指南 第一章(1.27章节 “within”运算符)

“ within”构造允许在一个序列中定义另一个序列。 seq1 within seq2 这表示seq1在seq2的开始到结束的范围内发生,且序列seq2的开始匹配点必须在seq1的开始匹配点之前发生,序列seq1的结束匹配点必须在seq2的结束匹配点之前结束。属性p32检查序列s32a在信号“ start”的上升沿和…

C++笔记之获取线程ID以及线程ID的用处

C笔记之获取线程ID以及线程ID的用处 code review! 文章目录 C笔记之获取线程ID以及线程ID的用处一.获取ID二.线程ID的用处2.1.线程池管理2.2.动态资源分配2.3.使用线程同步机制实现互斥访问共享资源2.4.使用线程 ID 辅助线程同步2.5.任务分发&#xff1a;线程ID可以用于将任务…

阿里云服务器不能访问网络之安装mysql 提示连接超时

wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 过了一段时间后提示 fail .......time out 链接超时 有可能你的服务器不能访问网络 因为宽带套餐 我购买的时候没有购 重新购买就行了

分布式链路追踪如何跨线程

背景 我们希望实现全链路信息&#xff0c;但是代码中一般都会异步的线程处理。 解决思路 我们可以对以前的 Runable 和 Callable 进行增强。 可以使用 ali 已经存在的实现方式。 TransmittableThreadLocal (TTL) 解决异步执行时上下文传递的问题 核心的实现思路如下&#…

一文2000字从0到1手把手教你jmeter分布式压测

一、jmeter为什么要做分布式压测 jmeter本身的局限性 一台压力机的 Jmeter 支持的线程数受限于 Jmeter 其本身的机制和硬件配置&#xff08;内存、CPU等&#xff09;是有限的由于 Jmeter 是 Java 应用&#xff0c;对 CPU 和内存的消耗较大&#xff0c;在需要模拟大量并发用户…

如何恢复红米手机删除的照片/文件?(亲测有效的6 种方式)

如何恢复红米手机删除的照片/文件&#xff1f;&#xff08;亲测有效的6 种方式&#xff09; 凭借出色的相机和实惠的价格&#xff0c;小米红米系列已成为全球知名品牌。但是&#xff0c;最近有人抱怨说他们的红米手机丢失了很多珍贵的照片或视频&#xff0c;希望知道如何从小米…

虚幻阴影整理

虚拟阴影贴图&#xff08;VSM&#xff09;是一种全新的阴影贴图方法&#xff0c;可以提供稳定的高分辨率阴影。通过与虚幻引擎5的Nanite虚拟几何体、Lumen全局光照和反射以及世界分区功能结合使用&#xff0c;它能够实现电影级的品质效果&#xff0c;为大型开放场景提供光照。 …

【漏洞复现】安全云平台存在任意文件下载getshell

漏洞描述 深圳市强鸿电子有限公司鸿运主动安全云平台存在任意文件下载漏洞,攻击者可通过此漏洞下载敏感文件信息。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权…

深度学习基础知识 BatchNorm、LayerNorm、GroupNorm的用法解析

深度学习基础知识 BatchNorm、LayerNorm、GroupNorm的用法解析 1、BatchNorm2、LayerNorm3、GroupNorm用法&#xff1a; BatchNorm、LayerNorm 和 GroupNorm 都是深度学习中常用的归一化方式。 它们通过将输入归一化到均值为 0 和方差为 1 的分布中&#xff0c;来防止梯度消失和…

想要精通算法和SQL的成长之路 - 连续的子数组和

想要精通算法和SQL的成长之路 - 连续的子数组和 前言一. 连续的子数组和1.1 最原始的前缀和1.2 前缀和 哈希表 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 连续的子数组和 原题链接 1.1 最原始的前缀和 如果这道题目&#xff0c;用前缀和来算&#xff0c;我们的思路…

一篇文章带你用动态规划解决股票购买时机问题

动态规划的解题步骤可以分为以下五步&#xff0c;大家先好好记住 1.创建dp数组以及明确dp数组下标的含义 2.制定递推公式 3.初始化 4.遍历顺序 5.验证结果 股票购买时机问题的解题核心思路 当天的收益是根据前一天持有股票还是不持有股票的状态决定的 那么很自然的我们就想…

【肌电信号】OpenSignals使用方法 --- 肌电信号采集及导入matlab

一、 多通道采集教学 1. 数据线连接 将PLUX设备通过USB或蓝牙与电脑连接&#xff0c;注意确认在几号通道接线。 2.实时数据采集可视化 进行设置。需要在软件中选择你的PLUX设备&#xff0c;并配置相关的参数&#xff0c;如采样率、分辨率、信号类型等 3 支持数据回放和…

DL Homework 4

目录 1 整理一下理论收获 1.1 基础理论 1.2 应用到机器学习 1.3 参数学习 1.4 反向传播算法 2.激活函数 3.神经网络流程推导(包含正向传播和反向传播) 4.数值计算 - 手动计算 5.代码实现 - numpy手推 6.代码实现 - pytorch自动 7.激活函数Sigmoid用PyTorch自带函数torc…

树莓派玩转openwrt软路由:11.OpenWrt安装NodeRed

1、更新软件源 opkg update2、安装nodered docker run -it -p 1880:1880 --name mynodered nodered/node-red3、安装完整性测试 实现一个打印hello world的demo&#xff0c;每隔1秒打印一次

WebAPI+EF连接SQL Server数据库

右击解决方案-添加-新建项目-选择“类库&#xff08;.NET Framework&#xff09;”,新建的项目取名叫WebApi1.EF 添加EF&#xff1a; 新建一个ADO实体数据模型 选择DBFirst 数据源选择MySql 填写数据库地址及账号密码 选择实体框架版本 选择在数据库中的表User 到此配置完成&am…