PCL1.12+VTK9.1+QT6编译部署

2023-10-27

 本文讲解使用的环境是vs2019+pcl1.12.0+vtk9.1+qt6.0,最后再展示一个示例程序

1 编译VTK

    vtk下载地址如下:

https://vtk.org/download/

然后用cmake构建,修改一下几个地方

    然后打开生成的vs项目,生成ALL_BUILD,

    最后再点击INSTALL生成

    最后生成如下库和文件

2 编译PCL

    先下载安装releases版本,把PCL其他的依赖库安装一下,免得自己去编译,下载地址如下

https://github.com/PointCloudLibrary/pcl/releases

    下载后,然后安装,安装完成后就会生成下面的依赖库,然后将里面的vtk全部替换成自己刚才编译的vtk文件

    然后下载PCL源码,地址如下:

https://github.com/PointCloudLibrary/pcl

    下载完后,打开下面这个文件

    打开文件后根据自己的路径修改下面的代码

# Find and set Boost flags

# If we would like to compile against a dynamically linked Boost
if(PCL_BUILD_WITH_BOOST_DYNAMIC_LINKING_WIN32 AND WIN32)
  set(Boost_USE_STATIC_LIBS OFF)
  set(Boost_USE_STATIC OFF)
  set(Boost_USE_MULTITHREAD ON)
  string(APPEND CMAKE_CXX_FLAGS " -DBOOST_ALL_DYN_LINK -DBOOST_ALL_NO_LIB")
else()
  if(NOT PCL_SHARED_LIBS OR WIN32)
    set(Boost_USE_STATIC_LIBS ON)
    set(Boost_USE_STATIC ON)
  endif()
endif()

#增加下面两行代码
set(Boost_LIBRARY_DIR D:/2021_software/PCL/install/PCL1.12.0/3rdParty/Boost/lib)
set(Boost_INCLUDE_DIR D:/2021_software/PCL/install/PCL1.12.0/3rdParty/Boost/include/boost-1_76)

set(Boost_ADDITIONAL_VERSIONS
  "1.79.0" "1.79" "1.78.0" "1.78" "1.77.0" "1.77" "1.76.0" "1.76" "1.75.0" "1.75" 
  "1.74.0" "1.74" "1.73.0" "1.73" "1.72.0" "1.72" "1.71.0" "1.71" "1.70.0" "1.70"
  "1.69.0" "1.69" "1.68.0" "1.68" "1.67.0" "1.67" "1.66.0" "1.66" "1.65.1" "1.65.0" "1.65")

# Optional boost modules
find_package(Boost 1.65.0 QUIET COMPONENTS serialization mpi)
if(Boost_SERIALIZATION_FOUND)
  set(BOOST_SERIALIZATION_FOUND TRUE)
endif()

# Required boost modules65
set(BOOST_REQUIRED_MODULES filesystem date_time iostreams system)
find_package(Boost 1.65.0 REQUIRED COMPONENTS ${BOOST_REQUIRED_MODULES})

if(Boost_FOUND)
  set(BOOST_FOUND TRUE)
endif()

    添加FLANN和OPENNI2目录

    修改vtk目录和qt版本

    这个就可以生成vs项目了,生成项目后编制再安装就可以得到头文件和库文件

3 编译示例

    新建一个QVTKWindow.h文件

#ifndef QVTKWINDOW_H
#define QVTKWINDOW_H

// Point Cloud Library
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>

// Visualization Toolkit (VTK)
#include <vtkRenderWindow.h>
#include <QVTKRenderWidget.h>
#include <QVTKOpenGLNativeWidget.h>

typedef pcl::PointXYZRGBA       PointT;
typedef pcl::PointCloud<PointT> PointCloudT;

//点云数据
typedef struct vtkpointcloud{
    float x;
    float y;
    float z;
    unsigned int red;
    unsigned int green;
    unsigned int blue;
}VTK_POINT_CLOUD_S;

class QVTKWindow : public QVTKOpenGLNativeWidget
{
    Q_OBJECT
public:
    explicit QVTKWindow(int win_size,QWidget *parent = nullptr);
    ~QVTKWindow();
private:
    pcl::visualization::PCLVisualizer::Ptr viewer;
    PointCloudT::Ptr                       cloud;
};
#endif // QVTKWINDOW_H

    新建一个QVTKWindow.cpp文件

#include "QVTKWindow.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>//loadPolygonFileOBJ所属头文件;
#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 "vtkGenericOpenGLRenderWindow.h"
QVTKWindow::QVTKWindow(QWidget *parent)
    : QVTKOpenGLNativeWidget(parent)
{
#if VTK_MAJOR_VERSION > 8
  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());
#else
  viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));
  this->SetRenderWindow(viewer->getRenderWindow());
  viewer->setupInteractor(this->GetInteractor(), this->GetRenderWindow());
#endif
    std::string fileName = "3.ply";
    pcl::PolygonMesh meshData;//读取原始数据
    pcl::io::loadPolygonFile(fileName,meshData);

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
    cloud.reset(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::fromPCLPointCloud2(meshData.cloud, *cloud);//将obj数据转换为点云数据

    // 显示结果图
    viewer->setBackgroundColor (0, 0, 0); //设置背景
    pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "z");
    viewer->addPointCloud<pcl::PointXYZ>(cloud, fildColor, "sample cloud");
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
    viewer->resetCamera ();
    update ();
}

QVTKWindow::~QVTKWindow()
{
}

   然后将上面的类添加到主界面的布局中

    QVTKWindow *win = new QVTKWindow(100,this);
    ui->verticalLayout->addWidget(win);

   生成结果如下

    测试代码和点云文件,我放到CSDN上面了,有需要的同学可以下载

https://download.csdn.net/download/qq_40732350/85602521

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PCL1.12+VTK9.1+QT6编译部署 的相关文章

  • QT“找不到 Qt 平台插件“xcb””

    我出于学术原因安装了QT everywhere 5 15开源版 但无法运行程序 首先 我编译了必要的源文件make并安装了QT Creator 然后我选择qmake来运行其中的程序 当我尝试运行示例程序时 遇到以下错误 qt qpa plu
  • 如何找到 QDockWidget 标题栏的高度?

    我正在尝试找到 a 的高度QDockWidget标题栏 以便对自定义布局进行一些智能调整大小 但标题栏不是单独的小部件 它内置于停靠小部件的私有布局中 并且没有成员可以访问它 还有其他方法可以找到它的高度吗 是的 您可以使用以下命令找到标题
  • QGroupBox边框

    经过一段时间的搜索后 我发现在组框上设置可见边框的方法是使用 StyleSheet 属性 我补充道 border 2px solid gray 但有几个问题 1 组框内的所有内容也继承此设置 2 边框在标题附近有一个小洞 碎片缺失 Here
  • Qt + win32 + mingw 上的原生 Windows API 链接问题

    我正在尝试使用 mingw 工具集将本机 Windows API 与 Qt 结合使用 部分功能存在链接问题 会发生什么 这是 mingw 名称修改的错误吗 ifdef Q WS WIN HWND hwnd QWidget winId HDC
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • 为什么下面的重叠比较总是评估为 true

    我不明白为什么以下代码有警告 指出重叠比较始终评估为真 接下来的语句永远不会被执行 QVariant MainModel data const QModelIndex index int role const if index isVali
  • 仅将非模态 QDialog 窗口放置在我的应用程序顶部,而不是所有应用程序顶部

    我有一个 QDialog 窗口 它应该始终位于我的应用程序顶部 它不是模态的 用户可以随时与对话框和主应用程序进行交互 使用窗口保持在顶部提示在某种程度上实现了这一点 但是 该对话框仍然位于所有其他正在运行的应用程序 例如记事本 chrom
  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • 如何用VTK存储矢量场? C++、VTKWriter

    比方说 我有一个向量场 u 其分量为 ux uy 和 uz 定义在空间 rx ry 和 rz 中的 非结构化 位置 我想要的只是用 VTK 格式存储这个向量场 即使用 libvtk 中的 vtkwriter 类来存储 Paraview 的可
  • (如何)我可以抑制未找到包配置文件的警告吗?

    我正在尝试创建一个CMakeLists txt尝试查找的文件Qt5 如果失败 则尝试回退到Qt4安装 该脚本到目前为止有效 但如果出现以下情况我总会收到警告Qt5未安装 注意FindQt5 cmake是由提供Qt5并且仅当以下情况时才可用Q
  • Qt 创建者 + MITK (Linux)

    我正在尝试使用MITK 与 Qt Creator 我已经通过 ccmake 成功编译并使用了 VTK 和 ITK 我已经编译了 MITK超级建造模式 它下载 CTK VTK ITK 等 然后我就配置好了 我已经用 make 编译了 大约两个
  • QTcpSocket 有时不发送数据

    我有两个 QT 应用程序 一个应用程序可以被认为保存了大数据 它每秒向第二个应用程序发送大约 10 KB 的数据块 之前我尝试使用QUdpSocket来传输数据 但由于MTU限制在2 5K左右 并且需要自己分割和重新组合数据 所以我改用QT
  • PyQt:如何设置组合框项目可检查?

    为了将 GUI 小部件数量保持在最低限度 我需要找到一种方法来为用户提供下拉菜单项的选择 这些菜单项可用于过滤掉 listWidget 项中显示的内容 假设 listWidget 列出了 5 个不同类别的项目 Cat A Cat B Cat
  • 如何在带有预编译头的项目中使用google protobuf

    我有一个包含多个项目的解决方案 我的项目 但不是全部 使用预编译头 我决定使用 protobuf 但遇到了一个问题 在 protoc exe 从 proto 生成 pb h 后 我尝试包含标头并收到错误 预编译标头未包含在 pb h 中 我
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • 从布局中按名称获取小部件

    如果我想从 python Qt 的布局中获取特定的小部件 我应该如何进行 到目前为止我所做的 for i in range self ui horizontalLayout 14 count here it does fail name s
  • 向 Qt 样式表添加特异性时丢失样式

    这是我的代码 const QString STYLE SHEET background color rgba x x x y border 1px solid gray border radius 0px border top 1px so
  • Qt 文件对话框默认后缀不起作用

    我将以下代码用于 QtQuick Dialogs 1 3 和 Qt 5 10 0 下 filedialog 的新属性 我使用 Qt Creator 5 10 默认套件构建它 import QtQuick 2 10 import QtQuic
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示

随机推荐

  • 为什么ChatGPT这么强?—— 一文读懂ChatGPT原理!

    前言 最近一周多的时间 只要不是生活在火星 喜欢技术的同学一定都被OpenAI的ChatGPT给刷屏了 ChatGPT与以往的公开提供服务的对话机器人相比 性能有了显著的提高 它可以相对可靠地提供一些日常对话 知识获取的功能 也可以它根据人
  • python-数据分析(9-Pandas)

    Pandas 9 Pandas 9 1 介绍与安装 Pandas介绍与安装 为什么会有Pandas Pandas支持大部分Numpy语言风格 尤其是数组函数与广播机制的各种数据处理 但是Numpy更适合处理同质型的数据 而Pandas的设计
  • SSRF web351-360(除357)

    SSRF web351 web360 写在前面 ssrf常见的一些函数 curl init 初始curl会话 curl setopt 会话设置 curl close 会话关闭 file get contents 将整个文件或一个url所指向
  • (JS设计模式)二.部分面试题

    1 打车时 可以打专车或者快车 任何车都有车牌号和名称 不同车价格不同 快车每公里1元 专车每公里2元 行程开始时 显示车辆信息 行程结束时 显示打车金额 假定行程就5公里 题目 画出UML类图 用ES6语法写出该示例 答 UML类图 2
  • Linux命令·touch

    linux的touch命令不常用 一般在使用make的时候可能会用到 用来修改文件时间戳 或者新建一个不存在的文件 1 命令格式 touch 选项 文件 2 命令参数 a 或 time atime或 time access或 time us
  • Office2021版64位+mathtype6.9

    终于安装成功了 如果你也遇到以下问题 试试看我的方法行不行 终于成功了很激动 在这里插入代码片 按照网上的教程 分别在以下两个文件夹 注意不一样的根目录 放了这三个文件 然后 打开office是这样的 接着 按照网上说的 不成功就把这三个文
  • uniApp 开发支付宝小程序引入订阅消息组件

    1 manifest json 配置 2 page json 配置 3 页面引入组件
  • EXTJS--分页PagingToolbar插件的重新刷新、重新加载方法

    var pagebar new Ext PagingToolbar store store pageSize Ext page pageSize displayInfo true displayMsg 共有 2 条记录 当前显示 0 1 条
  • 详解区块链分层构架

    区块链 是一个结合了数学 密码学 计算机学等大量学科和技术而形成的去中心化网络系统 如何实现这些技术的融合 则来自于区块链在构建时所形成的六大主要的分层结构 他们分别是网络层 数据层 共识层 激励层 合约层 以及应用层 此外 还有支持数据流
  • 快速入门 YOLOv5(ultralytics)

    YOLOv5 是一系列在 COCO 数据集上预训练的对象检测架构和模型 代表Ultralytics 对未来视觉 AI 方法的开源研究 结合了在数千小时的研究和开发中获得的经验教训和最佳实践 文档 有关训练 测试和部署的完整文档 请参阅YOL
  • windows应急响应工具

    Webshell查杀 d盾 http www d99net net WEBDIR WebShell 扫描服务 OpenRASP 团队 https scanner baidu com pages intro 河马 https www shel
  • Telegram 查看下载保存的文件

    文章目录 Android 缓存文件 本地文件 Windows 缓存文件 本地文件 清理缓存 Android Windows Android 缓存文件 单纯的点下载或者图片 GIF 等的预览只会缓存到 Internal Storage sdc
  • [问题已处理]-mac安装cobra失败

    导语 今天在mac环境中没法成功安装cobra 记录一下避免以后踩坑 执行go get报错 更换安装方式 安装cobra cli go get u github com spf13 cobra latest go install githu
  • 最全最实用的 安装ESXi6及Linux虚拟机的创建教程

    ESXi的作为虚拟化环境的虚拟机管理程序层 负责将服务器虚拟成资源池 提供接口供管理组件调用 将下面的ISO刻录成光盘或可启动 盘 安装在服务器裸机上 安装过程 开机做好阵列 选择从安装介质启动 按F11继续 输入密码 rootroot 密
  • [QT编程系列-8]:C++图形用户界面编程,QT框架快速入门培训 - 3- QT窗体设计 - 自定义对话框

    目录 3 QT窗体设计 3 6 自定义对话框 3 6 1 种类 3 6 2 输入对话框 编辑 3 6 3 字体对话框 3 6 4 文件对话框 编辑 3 6 5 颜色对话框 3 6 6 输出对话框 编辑 3 6 7 进度条对话框 编辑 3 6
  • linux下编译内核时出现 scripts/basic/fixdep.c:206 等错误解决办法

    现象如下 下面是网上抄的 我本人是英文的 不方便看 就当下面是翻译的吧 大致信息如下 scripts basic fixdep c 300 警告 未使用的变量 s scripts basic fixdep c 在函数 print deps
  • AlarmManager实现定时功能

    实现定时间隔功能 1 发送 AlarmManager alarmService AlarmManager context getSystemService ALARM SERVICE Intent alarmIntent new Inten
  • js中[]、{}、()区别

    一 大括号 表示定义一个对象 大部分情况下要有成对的属性和值 或是函数体 表示对象 表示对象的属性 方法 如果用在方法名后面 代表调用 如 var LangShen Name Langshen AGE 28 上面声明了一个名为 LangSh
  • 状态机总结(简洁)

    一 概念 状态机简写为 FSM Finite State Machine 也称为同步有限状态机 我们一般简称为状态机 之所以说 同步 是因为状态机中所有的状态跳转都是在时钟的作用下进行的 而 有限 则是说状态的个数是有限的 状态机的每一个状
  • PCL1.12+VTK9.1+QT6编译部署

    本文讲解使用的环境是vs2019 pcl1 12 0 vtk9 1 qt6 0 最后再展示一个示例程序 1 编译VTK vtk下载地址如下 https vtk org download 然后用cmake构建 修改一下几个地方 然后打开生成的