PCL1.10.1+QT5.14.2+VTK8.2.0配置说明和基于QVTKOpenGLNativeWidget的显示示例

本文讲解当前最新的PCL+QT开发项目配置流程,以及基于QVTKOpenGLNativeWidget的显示示例
QVTKWidget已经不是VTK推荐的显示方式。

  1. 安装环境
    1.1. Windows环境
    在这里插入图片描述
    1.2. VisualStudio环境
    在这里插入图片描述
    1.3. CMake环境
    在这里插入图片描述
  2. 安装PCL
    2.1. 运行PCL-1.10.1-AllInOne-msvc2019-win64.exe
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    解压pcl-1.10.1-pdb-msvc2019-win64.zip,复制文件到C:\Program Files\PCL 1.9.1\bin
    在这里插入图片描述
    2.2. 配置环境变量

变量名:PCL_ROOT
变量值:C:\PCL
变量名:OPENNI2_INCLUDE64
变量值:C:\Program Files\OpenNI2\Include
变量名:OPENNI2_LIB64
变量值:C:\Program Files\OpenNI2\Lib
变量名:OPENNI2_REDIST64
变量值:C:\Program Files\OpenNI2\Redist\

变量名:path
变量值:C:\PCL\bin;
C:\PCL\3rdParty\VTK\bin;
C:\PCL\3rdParty\FLANN\bin;
%OPENNI2_REDIST64%;
C:\PCL\3rdParty\Qhull\bin;
C:\Program Files\OpenNI2\Tools;

2.3. Path变量过长解决方法
如果因为变量过长导致Path无法保存
在这里插入图片描述
新建变量名Path1,将path中变量值全部复制进去
在这里插入图片描述
删除Path中所有变量值,仅保留下图前三项,并添加变量值%path1%
在这里插入图片描述
3. 安装QT
3.1. 运行qt-opensource-windows-x86-5.14.2.exe
在这里插入图片描述
在这里插入图片描述
3.2. 配置环境变量

变量名:Qt5_DIR
变量值:C:\Qt\Qt5.14.2\5.14.2\msvc2017_64\lib\cmake\Qt5

变量名:Path
变量值:C:\Qt\Qt5.14.2\5.14.2\msvc2017_64\bin

  1. 安装VTK
    4.1. 解压vtk-v8.2.0.zip到C:/
    在这里插入图片描述
    4.2. 编译VTK for QT
    以管理员权限运行CMake (cmake-gui)
    在这里插入图片描述
    设置项目目录
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    多点几次Configure,直到没有红色
    在这里插入图片描述
    在debug和release模式下,生成ALL_BUILD,再仅生成INSTALL,复制生成的C:\VTK文件夹替换C:\PCL\3rdPart下的VTK文件夹,注意和后续开发debug和release版本的对应
    在这里插入图片描述
    4.3. 安装Qt Visual Studio Tools
    在这里插入图片描述
  2. 使用cmake创建项目
    5.1. 创建cmakelists
    重启电脑
    新建文件夹TEST,创建5个空文本文档,名称修改为CMakeLists.txt, main.cpp,QtTest.cpp,QtTest.h,QtTest.ui,QtTest.qrc
    在这里插入图片描述

CMakeLists.txt中填如下述文本

cmake_minimum_required(VERSION 2.8.11)
Set(ProjectName QtTest)
project(${ProjectName})

set(CMAKE_AUTOMOC ON) # For meta object compiler
set(CMAKE_AUTORCC ON) # Resource files
set(CMAKE_AUTOUIC ON) # UI files

find_package(Qt5 REQUIRED Widgets)
find_package(PCL REQUIRED)
find_package(VTK REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
add_definitions(${PCL_DEFINITIONS})
Set(Project_Sources main.cpp ${ProjectName}.cpp)
Set(Project_Headers ${ProjectName}.h)
Set(Project_UIs ${ProjectName}.ui)
add_executable(${PROJECT_NAME} ${Project_Sources} ${Project_Headers} ${Project_UIs})
target_link_libraries(${PROJECT_NAME} ${PCL_LIBRARIES} ${VTK_LIBRARIES} Qt5::Widgets)

Main.cpp填如下文本

#include "QtTest.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	QtTest w;
	w.show();
	return a.exec();
}

QtTest.h 填如下文本

#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_QtTest.h"
#include <pcl/visualization/common/common.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <vtkGenericOpenGLRenderWindow.h>
class QtTest : public QMainWindow
{
	Q_OBJECT
public:
	QtTest(QWidget *parent = Q_NULLPTR);
protected:
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
private:
	Ui::QtTestClass ui;
	void initialVtkWidget();
};

QtTest.cpp填如下文本

#include "QtTest.h"
QtTest::QtTest(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
    initialVtkWidget();
    // The number of points in the cloud
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
    cloud.reset(new pcl::PointCloud<pcl::PointXYZ>);
    cloud->points.resize(200);
    // Fill the cloud with some points
    for (std::size_t i = 0; i < cloud->points.size(); ++i)
    {
        cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
        cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
        cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
    }
    viewer->addPointCloud(cloud, "cloud0");
    viewer->resetCamera();
    ui.openGLWidget->update();
}
void QtTest::initialVtkWidget()
{
    viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));
    vtkNew<vtkGenericOpenGLRenderWindow> window;
    window->AddRenderer(viewer->getRendererCollection()->GetFirstRenderer());
    ui.openGLWidget->SetRenderWindow(window.Get());
    viewer->setupInteractor(ui.openGLWidget->GetInteractor(), ui.openGLWidget->GetRenderWindow());
    ui.openGLWidget->update();
}

QtTest.qrc填如下文本

<RCC>
    <qresource prefix="QtTest">
    </qresource>
</RCC>

QtTest.ui填如下文本

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>QtTestClass</class>
 <widget class="QMainWindow" name="QtTestClass">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>600</width>
    <height>400</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Examples</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QVTKOpenGLNativeWidget" name="openGLWidget">
    <property name="geometry">
     <rect>
      <x>0</x>
      <y>0</y>
      <width>601</width>
      <height>371</height>
     </rect>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>600</width>
     <height>23</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <customwidgets>
  <customwidget>
   <class>QVTKOpenGLNativeWidget</class>
   <extends>QOpenGLWidget</extends>
   <header>qvtkopenglnativewidget.h</header>
  </customwidget>
 </customwidgets>
 <resources>
  <include location="QtTest.qrc"/>
 </resources>
 <connections/>
</ui>

5.2. 创建项目
以管理员权限运行CMake (cmake-gui)
在这里插入图片描述
设置项目目录
在这里插入图片描述
在这里插入图片描述
6. 测试项目
移除ALL_BUILD和ZERO_CHECK并运行
在这里插入图片描述
在这里插入图片描述

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值