本文讲解当前最新的PCL+QT开发项目配置流程,以及基于QVTKOpenGLNativeWidget的显示示例
QVTKWidget已经不是VTK推荐的显示方式。
- 安装环境
1.1. Windows环境
1.2. VisualStudio环境
1.3. CMake环境
- 安装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
- 安装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
- 使用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并运行