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

1 编译VTK

    vtk下载地址如下:

https://vtk.org/download/

PCL1.12+VTK9.1+QT6编译部署_点云

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

PCL1.12+VTK9.1+QT6编译部署_#include_02

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

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

    最后再点击INSTALL生成

PCL1.12+VTK9.1+QT6编译部署_点云_04

    最后生成如下库和文件

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

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

2 编译PCL

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

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

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

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

PCL1.12+VTK9.1+QT6编译部署_点云_08

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

https://github.com/PointCloudLibrary/pcl

PCL1.12+VTK9.1+QT6编译部署_#include_09

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

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

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

# 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目录

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

    修改vtk目录和qt版本

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

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

PCL1.12+VTK9.1+QT6编译部署_点云_13

PCL1.12+VTK9.1+QT6编译部署_#include_14

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);

   生成结果如下

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

    测试代码和点云文件

PCL1.12+VTK9.1+QT6编译部署_#include_16