资讯动态

VS2015+Qt5.9.6+PCL1.8.1点云可视化环境搭建与避坑指南

发布时间:2026/9/8 19:58:59 来源:尧图企业网站定制
简介这是一份基于QT5.9.6与PCL1.8.1、在VS2015环境中打造的3D点云处理示例工程面向希望掌握Qt界面与PCL三维可视化集成方法的C开发者可有效解决两者依赖配置繁琐、接口对接无从下手的痛点。工程共含27个文件核心为cpp源代码、h头文件、ui界面文件及pro工程配置附有debug/release运行程序、图标资源等整个压缩包仅233KB结构紧凑适合快速搭建环境并对照学习。目前已有2356人学习。借助该Demo可重点理解QT与PCL的工程配置方法、PCLVisualizer可视化工具的使用以及通过信号槽机制实现点云导入、预处理与交互显示的全过程同时工程内还涉及多线程、错误处理等实际编码技巧可作为入门集成参考也便于在此架构上扩展滤波、分割等算法模块。 在Windows上做点云处理、三维可视化绕不开Qt和PCL这套组合。我自己第一次搭环境的时候整整折腾了两天不是编译器不匹配就是运行时缺DLL最崩溃的就是点击exe后弹出一句“no Qt platform plugin could be initialized”查了半天才发现是platforms目录没放对。这篇文章从版本选择到写一个能显示点云的Demo再到把坑填平完整走一遍流程。如果你正好在VS2015环境下用Qt 5.9.6和PCL 1.8.1那这份笔记能让你少走一大半弯路。1. 为什么要用QT5.9.6 PCL1.8.1 VS2015这套组合1.1 版本搭配背后的技术逻辑网上有很多人问“能不能用VS2017跑PCL1.8.1”“Qt5.15能不能跟VS2015搭配”理论上可以但代价是你得自己编译PCL、自己编译VTK光编译依赖库就够喝一壶的。PCL 1.8.1官方在GitHub的Release页面提供的是基于MSVC2015的预编译包分为32位和64位内部集成了VTK、Boost、Eigen、FLANN等一大堆第三方库。也就是说只要你的编译器是VS2015安装时选上ALL-IN-ONE安装包几乎能免去90%的编译工作。而Qt 5.9.6正好是官方提供msvc2015_64预编译包的版本和VS2015完全匹配。这三个版本不是随便选的是一个“官方预编译链条”上的标准组合。选择这套组合的最实际好处是你不用从源码编译任何东西。如果你是做算法验证、Demo演示、或者带学生做课设没必要把时间耗在编译PCL这种体力活上。这就像你买电脑直接买官方整机比自己攒机省心得多虽然攒机有乐趣但多数情况下你需要的是“开机就能用”。1.2 这套组合适合做什么点云数据的读取、滤波、配准、可视化结合PCL的点云处理算法做桌面级的三维展示软件用Qt做交互界面用PCL的pcl::visualization模块做渲染快速出原型验证算法效果提交给客户或导师看说白了这就是一个工业视觉、三维建模、机器人感知领域最常用的软件底座。Qt负责GUIPCL负责点云VS2015提供编译环境。这个demo虽然小但它是后续一切点云项目的地基。2. 环境搭建完整流水账按这个顺序装不会错2.1 安装顺序与版本选择安装顺序有讲究但不复杂。第一步装Visual Studio 2015建议装Community版或者专业版安装时记得勾选“Windows SDK”和“Visual C”组件。第二步装Qt 5.9.6在Qt官方下载页面找“qt-opensource-windows-x86-msvc2015_64-5.9.6.exe”这个文件名安装时组件选“MSVC 2015 64-bit”即可。第三步装PCL 1.8.1下载pcl-1.8.1-AllInOne-msvc2015-win64.exe安装过程中会提示是否安装OpenNI2和GLEW第三方库必须勾选否则后续深度相机示例或某些渲染功能会缺依赖。我见过有人先装PCL再装VS结果CMake找不到编译器。所以顺序必须VS - Qt - PCL。装完之后检查一下系统环境变量Path里有没有自动添加Qt的bin目录和PCL的bin目录。如果没有手动添加后面运行时会用到。注意如果机器上同时装了Python版的VTK或Open3D它们的动态库可能和PCL自带的VTK冲突运行时可能出现“找不到VTK版本对应的符号”之类的错这种情况下优先保证PCL bin目录在环境变量中靠前的位置。2.2 Qt Creator和Visual Studio的配合方式这里有两种开发方式一种是纯Qt Creator写代码用qmake管理项目另一种是直接用VS2015,装一个“Qt VS Tools”插件。我推荐后者因为PCL的库目录、依赖项在VS的工程属性面板里配置起来更直观而且调试时崩溃信息更容易定位。Qt VS Tools在VS的“扩展和更新”里搜索安装装完后在“Qt VS Tools - Qt Versions”里添加Qt的路径比如“C:\Qt\Qt5.9.6\5.9.6\msvc2015_64”。有一点必须讲清楚VS2015默认的代码生成是/vcg等PCL预编译包是MT和MD混合方式编译的官方包使用的是动态链接/MD所以你的项目运行库必须统一设置为“多线程调试DLL(/MDd)”或“多线程DLL(/MD)”。在项目属性 - C/C - 代码生成 - 运行库里Debug选“/MDd”Release选“/MD”。千万别选成“/MT”否则会出现一堆无法解析的外部符号。2.3 新建项目和配置头文件、库文件新建一个“Qt Windows Application”项目然后在项目属性里做三件事第一附加包含目录Debug和Release都一样增加C:\Qt\Qt5.9.6\5.9.6\msvc2015_64\include C:\Qt\Qt5.9.6\5.9.6\msvc2015_64\include\QtCore C:\Qt\Qt5.9.6\5.9.6\msvc2015_64\include\QtGui C:\Qt\Qt5.9.6\5.9.6\msvc2015_64\include\QtWidgets C:\Program Files\PCL 1.8.1\include\pcl-1.8 C:\Program Files\PCL 1.8.1\include\pcl-1.8\pcl C:\Program Files\PCL 1.8.1\include\pcl-1.8\vtk-8.0第二附加库目录添加C:\Qt\Qt5.9.6\5.9.6\msvc2015_64\lib C:\Program Files\PCL 1.8.1\lib第三附加依赖项这里最麻烦。Release模式下把PCL的lib目录下所有.lib文件名字复制进去。你可以在PCL\lib文件夹里全选文件按住Shift右键“复制文件地址”然后粘贴到附加依赖项里把引号去掉。Debug模式则要把每个库名换成带“d”后缀的版本比如pcl_common.lib对应pcl_commond.lib。手工替换比较累但一劳永逸建议做一个通用的配置属性表下次直接复用。还有一点坑Qt5.9.6的lib目录里有Qt5Core.lib、Qt5Gui.lib、Qt5Widgets.lib这些也得加进附加依赖项。否则链接的时候会报“无法解析的外部符号”错误代码LNK2019非常常见。3. 写一个最小可运行的点云显示Demo3.1 界面设计思路PCL 1.8.1自带的VTK版本是8.0里面有一个重要的集成组件叫QVTKWidget它让VTK渲染窗口能嵌入到Qt的Widget里。我们这里就做一个最简单的窗口顶上一个按钮“生成点云”中间放一个QVTKWidget点击按钮后在视图上显示一个随机点云或一个球体点云。UI上不需要太复杂拖一个QVBoxLayout在Qt Designer里放不了QVTKWidget这个自定义控件所以代码中手动new一个QVTKWidget再添加到布局里。我用一个QWidget作为中央控件里面放一个QPushButton和一个QVTKWidget用垂直布局排列。这个QVTKWidget的名字要包含头文件#include QVTKWidget.h注意如果包含失败说明你的附加包含目录没配好。QVTKWidget.h在“C:\Program Files\PCL 1.8.1\include\pcl-1.8\vtk-8.0”目录下。有些教程用“QVTKOpenGLWidget”那是VTK更新的版本PCL 1.8.1里还没完全支持老老实实用QVTKWidget。3.2 核心代码实现下面这个Demo实现“点击按钮在三维窗口中显示一个球体点云”。思路是生成一个按球面均匀分布的点的pcl::PointCloud pcl::PointXYZ 然后设置点云颜色默认白色再通过pcl::visualization::PCLVisualizer把渲染结果绑定到QVTKWidget上。关键代码如下#include MainWindow.h #include ui_MainWindow.h #include QVTKWidget.h #include vtkRenderWindow.h #include pcl/point_cloud.h #include pcl/point_types.h #include pcl/visualization/pcl_visualizer.h #include random MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), viewer(new pcl::visualization::PCLVisualizer(viewer, false)) { ui-setupUi(this); auto* qvtkWidget new QVTKWidget(this); this-ui-verticalLayout-addWidget(qvtkWidget); viewer-setBackgroundColor(0.1, 0.1, 0.1); qvtkWidget-SetRenderWindow(viewer-getRenderWindow()); viewer-setupInteractor(qvtkWidget-GetInteractor(), qvtkWidget-GetRenderWindow()); connect(ui-pushButton, QPushButton::clicked, this, MainWindow::generateCloud); } MainWindow::~MainWindow() { delete ui; } void MainWindow::generateCloud() { pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ); // 生成一个球体点云半径1.010000个点 std::random_device rd; std::mt19937 gen(rd()); std::uniform_real_distributiondouble thetaDist(0, 2 * M_PI); std::uniform_real_distributiondouble phiDist(0, M_PI); for (int i 0; i 10000; i) { double theta thetaDist(gen); double phi phiDist(gen); pcl::PointXYZ p; p.x static_castfloat(1.0 * sin(phi) * cos(theta)); p.y static_castfloat(1.0 * sin(phi) * sin(theta)); p.z static_castfloat(1.0 * cos(phi)); cloud-points.push_back(p); } cloud-width cloud-points.size(); cloud-height 1; viewer-removeAllPointClouds(); viewer-addPointCloud(cloud, sphere_cloud); viewer-setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, sphere_cloud); viewer-resetCamera(); ui-qvtkWidget-update(); }这段代码有几个细节需要注意。PCLVisualizer的构造函数第二个参数传了false意思是不要自己创建交互器而是等待外部设置。如果你设成true运行时可能跟QVTKWidget的交互器冲突导致鼠标操作失效。setupInteractor这一步不能省没有了它窗口能显示点云但无法旋转、缩放画面。编译工程后如果Debug模式下报“缺少opengl32.lib”之类的错在附加依赖项里加上opengl32.lib。Release模式一般不用。3.3 程序写完后怎么打包发布在自己机器上运行没问题但要发给同事或客户看exe不能跨电脑运行因为缺一大堆DLL。这时需要Qt提供的工具windeployqt.exe。先找到你的构建输出目录比如“x64\Release”打开命令行切换到exe所在目录执行C:\Qt\Qt5.9.6\5.9.6\msvc2015_64\bin\windeployqt.exe MyDemo.exe这条命令会把Qt相关的Core、Gui、Widgets以及platforms插件目录自动拷贝过来。但PCL和VTK的DLL它不会管需要手动把“C:\Program Files\PCL 1.8.1\bin”目录下的所有DLl拷到exe旁边。几百兆很常见。还有一个技巧把整个bin目录添加到环境变量Path然后不拷DLL程序也能运行。但为了给客户发布干净建议只拷贝需要的方法是用Dependecy Walker之类的工具分析依赖或者干脆懒人方案——全拷省心。执行windeployqt后打开exe所在目录确认有“platforms”文件夹里面至少有“qwindows.dll”文件。如果你忘记执行windeployqt直接发布大概率会在别的机器上弹“no Qt platform plugin could be initialized”这个下面会专门讲。4. 新手最容易踩的坑Qt平台插件初始化失败4.1 报错“could not be initialized”的真实原因“this application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.”——这大概是Qt界出现频率最高的一个错误。原因其实很简单你的程序找不到或加载不了平台插件。Qt在Windows上默认使用“windows”平台插件插件文件是qwindows.dll必须放在platforms目录下且该目录必须位于你的exe所在的同级目录下也就是exe目录\platforms\qwindows.dll。另外qwindows.dll依赖Qt5Core.dll、Qt5Gui.dll等如果这些DLL不在系统路径或exe目录下插件加载失败提示一样。还有一个常见原因混用了不同编译版本的Qt比如你用msvc2015编译的程序但系统PATH里先找到了msvc2017的Qt DLL。这通常发生在多个Qt版本共存的环境。解决办法是打开“编辑系统环境变量”把当前项目对应的Qt bin目录调整到最前面或者干脆在执行exe时清空影响范围。4.2 彻底解决办法按以下顺序排查在exe目录下创建platforms文件夹从Qt安装目录拷贝qwindows.dll过去。具体位置是C:\Qt\Qt5.9.6\5.9.6\msvc2015_64\plugins\platforms\qwindows.dll。把Qt的bin目录包含Qt5D.dllQt5Core.dll等加入Path环境变量或者把整个bin目录下的DLL拷到exe目录。确认项目编译时默认的运行环境和你用的Qt位数一致。使用64位Qt你的项目平台不能是Win32必须是x64。关闭杀毒软件再试一次。有些安全软件会拦截插件加载虽然不常见但我遇到过。最后再看一眼程序输出的路径确保是从exe目录启动而不是在命令行里随便找个工作目录。如果发布了还是报错我教你一个最直接的排查方法用sxstrace工具跟踪程序启动时的DLL解析或者用DependenciesGUI新一代的Dependency Walker打开exe看是哪个DLL前面有红色的“”图标缺哪个补哪个。这个方法比瞎猜快十倍。4.3 常见问题速查表现象直接原因解决方案运行exe提示缺少Qt5Cored.dllQt基础库未拷贝windeployqt或从Qt bin目录拷贝提示缺少pcl_common.dllPCL库未加入Path将PCL bin加入Path或拷贝到exe目录提示“找不到opengl32.dll”部分精简系统缺失系统库安装显卡驱动或拷贝系统DLL点云显示窗口黑屏但程序运行未调用setupInteractor或update检查QVTKWidget渲染窗口绑定Debug正常Release崩溃附加依赖项中Debug与Release库混用把带d的和不带d的库严格分开内存访问冲突0xC0000005PCL版本与Qt的指针管理冲突确保PCL和Qt都是64位且配置一致vs2015编译报“无法打开包括文件: QtCore/qglobal.h”附加包含目录未配置正确添加Qt include路径并检查环境变量4.4 关于VS2015许可证和安装的小提醒网上很多人搜“vs2015产品密匙”这里提醒一句Visual Studio社区版本来就可以免费使用只需要登录微软账号即可不需要输入产品密钥。如果你用的是企业版或专业版请通过正规渠道获取授权。安装过程中最容易被忽略的是“Windows 10 SDK”如果你不需要UWP开发默认可以不选但如果后面编译PCL的某些测试程序需要再补装也来得及。建议在安装时勾选“Visual C 工具集”和“Windows SDK”这两个核心组件其他选装即可。5. Demo跑通之后的几个扩展方向5.1 把点云数据换成实际文件球体点云只是做个演示实际项目通常要读pcd或ply文件。PCL提供了现成的函数pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ); if (pcl::io::loadPCDFilepcl::PointXYZ(your_cloud.pcd, *cloud) -1) { QMessageBox::warning(this, 错误, 无法打开点云文件); return; } viewer-addPointCloud(cloud, loaded_cloud);如果读的是las或laz需要先把数据转为pcd再加载或者用laslib直接读取。这一步能立刻让你的demo从“小玩具”变成“能用的小工具”。5.2 升级到CMake管理工程VS的工程属性表虽然方便但当你要发布一款产品时跨平台或者多人协作时还是用CMake更稳定。用CMake时可以通过find_package(Qt5)和find_package(PCL)来自动定位库路径避免手动配置错误。我一般在CMakeLists.txt里这样写cmake_minimum_required(VERSION 3.10) project(PointCloudDemo) set(CMAKE_PREFIX_PATH C:/Qt/Qt5.9.6/5.9.6/msvc2015_64 C:/Program Files/PCL 1.8.1 ) find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED) find_package(PCL 1.8 REQUIRED COMPONENTS common io visualization) add_executable(${PROJECT_NAME} main.cpp MainWindow.cpp MainWindow.h) target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets PRIVATE ${PCL_LIBRARIES} )注意CMake里PCL的PCL_LIBRARIES已经包含了所有依赖项包括VTK的库不用你手动一个一个加。但前提是PCL的CMake配置文件能被找到所以CMAKE_PREFIX_PATH一定要指对。5.3 继续深入的方向点云处理算法滤波、下采样、配准ICP、NDT、分割显示增强添加网格、坐标系、标签、法线可视化交互操作鼠标框选、点选、矩形裁剪融合其他数据源激光雷达实时数据流深度相机Kinect/RealSense多线程不用把点云处理和UI放在同一个线程用Qt的QThread或者并发模块避免界面卡死只要你把这个最小demo跑起来后面的路都是顺着这个基础往外扩。最后说一句实在话环境搭通不是难事难的是遇到看似莫名其妙的问题时不要慌着重装系统。我见过很多人卡在“no Qt platform plugin could be initialized”就怀疑人生实际上就是把插件路径放到exe目录下五秒钟的事。多用DependenciesGUI查依赖多留意编译平台是x64还是Win32多检查附加依赖项里有没有把Release和Debug的库搞混——记住这三个“多”比看十篇教程都有用。如果按我这套步骤还跑不起来别急在工程属性里逐项核对特别是附加包含目录和库目录有没有多了空格或反斜杠这种肉眼很难发现的错误往往才是罪魁祸首。祝你好运。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价