PCL1.14.0+VTK9.3.0+Qt5.15.2实现加载点云

这是一个简单的demo级别的代码,旨在测试你环境配置是否成功。

代码功能就是菜单栏点击打开pcd文件,页面加载点云。

项目地址:https://github.com/Knighthood2001/VTKDemo

代码不重要,配置的环境非常重要。

我现在配好环境后,主要使用vs写代码,然后qt creator进行查看ui。

安装

PCL1.14.0

这个我之前的博客里面写过了,由于我之前就是按照我的博客安装的,所以我这里没有安装。

VTK9.3.0

这个的话,我自己也试着别人博客,把vtk源码clone下来进行编译以及INSTALL,但是一是时间就,我编译的时候,是晚上的,睡一觉后,编译好,反正是挺长时间的,然后INSTALL的时候,好像还有3个是失败的。

因为我看到有些博客说需要修改源码,并且这个cmake配置过程有点繁琐,所以我最后采用了,使用别人编译好后的VTK9.3.0+Qt5.15.2版本的文件,然后替换到PCL1.14.0的3rdParty的VTK中。

这里需要注意的是,别人编译好的,你需要看Qt版本,有些人分享的是Qt6的,即使你下载下来,放到PCL1.14.0的3rdParty的VTK,也是不管用的,总是,需要看你使用的qt版本,然后找对应的

我这里就出现问题,即我用的qt5.15版本,但是我最开始下载的是qt6版本的,导致最后一直在报错,说找不到qt6。

最开始我想把编译出来的4个文件夹方GitHub上的,见
https://github.com/Knighthood2001/VTK9.3.0

但是有个dll大于50mb,导致最后只能放网盘里面

https://pan.quark.cn/s/7dea9939f5f6

我这里的,无论是Debug还是Release都是可以用的。

Qt5.15.2

这里的话,按照网上教程,使用在线安装安装即可。

我也写了一篇简略教程。

https://blog.csdn.net/knighthood2001/article/details/157845368

项目开始

首先,最开始,初学者,肯定会关注项目如何创建,我这里是在vs中创建的,而不是在qt creator中创建的。

安装配置qt vs tools

在vs中创建,需要先安装Qt Visual Studio Tools插件,我这里安装了一段时间。

然后安装好后重启VS,配置一下Qt version

这里看我的location虽然到的是文件夹,但是你需要选择到bin下面的qmake.exe才行。

或者你也可以试试这个Autodetect

配置好后重启一下吧。

vs创建项目



然后就创建好项目了。

然后把我的代码复制进去就行。

qt creator配置ui

注意我这边右上角创建的对象的名称的大小写。

点击这里的提升为

QVTKOpenGLNativeWidget

这里的头文件是自动填充的,虽然本地的是带有大写字母的头文件,但是其实这里全是小写也没事。然后点击添加,点击提升。

特别注意:在qt creator中修改好后ui文件,需要在vs中编译一下这个ui文件。


项目代码

VTK930.ui

cpp 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>VTK930</class>
 <widget class="QMainWindow" name="VTK930">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>VTK930</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QVTKOpenGLNativeWidget" name="openGLWidget">
    <property name="geometry">
     <rect>
      <x>29</x>
      <y>39</y>
      <width>731</width>
      <height>501</height>
     </rect>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>25</height>
    </rect>
   </property>
   <widget class="QMenu" name="menufile">
    <property name="title">
     <string>file</string>
    </property>
    <addaction name="actionopen"/>
   </widget>
   <addaction name="menufile"/>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
  <action name="actionopen">
   <property name="text">
    <string>open</string>
   </property>
  </action>
 </widget>
 <customwidgets>
  <customwidget>
   <class>QVTKOpenGLNativeWidget</class>
   <extends>QOpenGLWidget</extends>
   <header>qvtkopenglnativewidget.h</header>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

VTK930.h

cpp 复制代码
#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_VTK930.h"
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkRenderWindow.h>
#include <QVTKRenderWidget.h>
#include <QVTKOpenGLNativeWidget.h>
class VTK930 : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::VTK930 ui;
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
    boost::shared_ptr<pcl::visualization::PCLVisualizer> view;

    void initialVtkWidget();

private slots:
    void onOpen();

};

VTK930.cpp

cpp 复制代码
#include "VTK930.h"
#include <QFileDialog>
#include <QDebug>

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

    initialVtkWidget();

    connect(ui.actionopen, SIGNAL(triggered()), this, SLOT(onOpen()));
}

VTK930::~VTK930() {}

void VTK930::onOpen() {

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(
        new pcl::PointCloud<pcl::PointXYZ>());
    QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".",
        "Open PCD files(*.pcd)");
    if (fileName == "") return;
    pcl::io::loadPCDFile(fileName.toStdString(), *cloud);
    view->addPointCloud(cloud, "cloud");
    view->resetCamera();
    view->spin();
    ui.openGLWidget->update();
}

void VTK930::initialVtkWidget() {
    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow =
        vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    view.reset(new pcl::visualization::PCLVisualizer(renderer, renderWindow,
        "viewer", false));
    // 参数为 R, G, B (取值范围 0.0 ~ 1.0),浅灰色
    view->setBackgroundColor(0.2, 0.2, 0.2);
    // 如果需要设置渐变背景(上半部分+下半部分),可以用:
    // view->setBackgroundColor(0.1, 0.1, 0.1, 0.2, 0.2, 0.2);
    view->setupInteractor(ui.openGLWidget->interactor(),
        ui.openGLWidget->renderWindow());
    ui.openGLWidget->setRenderWindow(view->getRenderWindow());
}

main.cpp

cpp 复制代码
#include "VTK930.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    VTK930 window;
    window.show();
    return app.exec();
}

最后

但是一般来说,你这样配置后还是会出现一些报错,导致运行不起来,我下一篇就是讲遇到的报错。

相关推荐
我命由我123451 小时前
Kotlin 面向对象 - 匿名内部类、匿名内部类简化
android·java·开发语言·java-ee·kotlin·android studio·android jetpack
lpfasd1231 小时前
Zig 简介:C 的现代化继任者
c语言·开发语言
学到头秃的suhian1 小时前
Redis分布式锁
java·数据库·redis·分布式·缓存
冰暮流星1 小时前
javascript创建数组的方式
开发语言·javascript·ecmascript
星火开发设计1 小时前
模板特化:为特定类型定制模板实现
java·开发语言·前端·c++·知识
大鹏说大话1 小时前
线上服务重启后无法加载 Nacos 配置?常见原因与排查指南
开发语言
凤年徐1 小时前
优选算法——双指针专题 3.快乐数 4.盛水最多的容器
开发语言·数据结构·c++·算法
阿里嘎多学长1 小时前
2026-02-14 GitHub 热点项目精选
开发语言·程序员·github·代码托管
番茄去哪了1 小时前
Redis零基础入门
数据库·redis·缓存