ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PCL学习四

PCL学习四 1✅ CMake现在越来越多人用新项目首选适合工业上位机、长期维护、代码要跨平台、工程大点云算法、多模块 优点原生支持 PCL 的find_package(PCL)不用手动写一大堆头文件、库路径不容易配错。换电脑、换环境只需要改 PCL_ROOT比.pro省心很多。CMake 是 C 工业界标准PCL、VTK、OpenCV 全都是 CMake 工程以后加第三方库统一一套逻辑。VS Qt 插件也能直接打开 CMake 项目你熟悉 VS 的话可以继续用 VS 写代码不用强制换到 QtCreator。后期想加单元测试、打包、多编译目标都很方便。缺点初次上手 CMake 语法有一点学习成本。✅ qmake.pro 文件老项目、小 Demo、入门学习适合简单小工具、快速验证 PCL 功能、个人学习、代码量不大。 优点语法简单QtCreator 一键新建项目上手快。缺点第三方库PCL/VTK需要手动写一堆INCLUDEPATH、LIBS路径写死换电脑很容易炸。qmake 已经属于Qt 旧的构建工具Qt 官方不再主推新项目不再推荐。✅ 使用VS新建项目中的Qt widgets Applycation简单一句话Qt 官方推荐新项目全部迁移到 CMake。2. 编辑器选择两个主流VS Qt 插件Qt VS Tools很多做工业自动化、工控上位机的人用这个。优势已经熟悉 VS 调试、看代码PCL 之前就是 VS 调通的环境无缝衔接可以直接打开 Qt 的 CMake 项目。缺点需要额外装 Qt VS Tools 插件。QtCreatorQt 原生 IDE专门为 Qt 设计CMake/qmake 都支持跨平台友好。优点Qt 信号槽、UI 设计器体验最好缺点如果你习惯 VS 快捷键需要适应。3安装QTMSVC2022PCL1.15.1Release库Qt vs tool 插件3.51、下载在线安装器官网下载页Download Qt OSS: Get Qt Online Installer 下载Qt Online Installer for Windows (x64)文件名qt-unified-windows-x64-online.exeQt⚠️国内下载很慢推荐用镜像加速a,把下载好的 exe 放到一个文件夹b,在文件夹地址栏输入cmd回车打开命令行c,执行这条命令用清华镜像速度快很多qt-unified-windows-x64-online.exe --mirror https://mirrors.tuna.tsinghua.edu.cn/qt2、注册 Qt 账号并登录打开安装器需要注册一个免费 Qt 社区账号邮箱注册个人开源免费。许可证选择个人开源开发Open Source企业用途要注意 LGPL 协议。3、安装路径设置建议安装到 D 盘不要放 C 盘例如D:\Qt路径不要带中文、空格✅ 勾选CMakeNinjaQt Creator 可选如果你只用 VS 开发 QtQt Creator 可以不勾选节省空间❌全部取消Android、iOS、WebAssembly、32 位版本、源码、示例文档不需要就不勾减少下载4Qt MSVC安装完成后接着安装Qt vs toolVS下找到菜单扩展---管理扩展---查找QT visual studio tool点下载安装5安装完成后会出现Qt VS tools6选择option添加已经安装的Qt MSVS20227,Qt-General下面的Qt Designer改为True8系统环境变量 PATH 追加这两个目录D:\Qt\6.7.3\msvc2022_64\binD:\PCL 1.15.1\bin添加环境变量后重启 VS生效。安装完成4测试两个方案选择方案 AQt Widgets ApplicationQt 原生模板ui 拖拽方便推荐新手方案 BCMake 项目自己写 CMakeLists适合 PCL 联调更灵活方案 BCMake 项目自己写 CMakeLists适合 PCL 联调更灵活步骤1第 1 步新建Cmake项目第 2 步新建 4 个源码文件在项目资源管理器右侧右键项目 → 添加 → 新建项依次创建main.cppmainwindow.hmainwindow.cppmainwindow.ui第 2 步编写 CMakeLists.txt在项目根目录打开CMakeLists.txt全部替换成下面这段记得修改 PCL 路径cmake_minimum_required(VERSION 3.20)# 重点指定Qt6路径改成你本机Qt目录 set(CMAKE_PREFIX_PATH C:/Qt/6.7.3/msvc2022_64)project(QtPclDemo)set(CMAKE_CXX_STANDARD 17)set(CMAKE_INCLUDE_CURRENT_DIR ON)# Qt6自动处理moc/ui/rccset(CMAKE_AUTOUIC ON)set(CMAKE_AUTOMOC ON)set(CMAKE_AUTORCC ON)# 加载Qt6 Widgets模块find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)# PCL路径改成你本机PCL安装目录 set(PCL_ROOT D:/PCL1.15.1)find_package(PCL REQUIRED)include_directories(${PCL_INCLUDE_DIRS})link_directories(${PCL_LIBRARY_DIRS})add_definitions(${PCL_DEFINITIONS})add_executable(QtPclDemomain.cppmainwindow.hmainwindow.cppmainwindow.ui # 新增这一行)target_link_libraries(QtPclDemoQt6::Core Qt6::Gui Qt6::Widgets${PCL_LIBRARIES})修改完保存CMake 会自动重新加载配置。main.cpp#include mainwindow.h#include QApplicationint main(int argc, char* argv[]){QApplication a(argc, argv);MainWindow w;w.show();return a.exec();}mainwindow.cpp#include mainwindow.h#include ui_mainwindow.h#include pcl/io/pcd_io.h#include pcl/point_types.h#include pcl/visualization/pcl_visualizer.h#include QFileDialog#include QMessageBoxMainWindow::MainWindow(QWidget* parent): QMainWindow(parent), ui(new Ui::MainWindow){ui-setupUi(this);// 不要在这里直接创建viewer容易阻塞Qt事件循环}MainWindow::~MainWindow(){delete ui;}void MainWindow::on_pushButton_loadpcd_clicked(){QString filePath QFileDialog::getOpenFileName(this, 打开PCD文件, , PCD点云文件(*.pcd));if (filePath.isEmpty())return;pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ);if (pcl::io::loadPCDFilepcl::PointXYZ(filePath.toStdString(), *cloud) -1){QMessageBox::critical(this, 错误, PCD文件读取失败);return;}// 新建查看器添加点云并显示pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer(PCL点云查看器));viewer-setBackgroundColor(0, 0, 0);viewer-addPointCloudpcl::PointXYZ(cloud, cloud);viewer-resetCamera(); // 自动缩放视角适配点云while (!viewer-wasStopped()){viewer-spinOnce(100);}}mainwindow.h#ifndef MAINWINDOW_H#define MAINWINDOW_H#include QMainWindow#include pcl/visualization/pcl_visualizer.hQT_BEGIN_NAMESPACEnamespace Ui { class MainWindow; }QT_END_NAMESPACEclass MainWindow : public QMainWindow{Q_OBJECTpublic:MainWindow(QWidget* parent nullptr);~MainWindow();private slots:void on_pushButton_loadpcd_clicked();private:Ui::MainWindow* ui;boost::shared_ptrpcl::visualization::PCLVisualizer viewer;};#endif // MAINWINDOW_Hmainwindow.ui点击运行后点按钮手动加载一副点云图成功方案 AQt Widgets ApplicationQt 原生模板ui 拖拽方便推荐新手使用VS新建项目中的Qt widgets Applycation首先还是配置项目属性文件修改如下内容VC包含目录D:\PCL1.15.1\3rdParty\Boost\include\boost-1_87;D:\PCL1.15.1\3rdParty\Eigen3\include\eigen3\;D:\PCL1.15.1\3rdParty\VTK\include\vtk-9.1;D:\PCL1.15.1\3rdParty\FLANN\include;D:\PCL1.15.1\include\pcl-1.15;D:\Program Files\OpenNI2\include;$(IncludePath)VC库目录D:\PCL1.15.1\3rdParty\VTK\lib;D:\PCL1.15.1\3rdParty\Boost\lib;D:\PCL1.15.1\lib;D:\PCL1.15.1\3rdParty\FLANN\lib;D:\Program Files\OpenNI2\Lib;$(LibraryPath)连接器-输入pcl_common.lib;pcl_commond.lib;pcl_features.lib;pcl_featuresd.lib;pcl_filters.lib;pcl_filtersd.lib;pcl_io.lib;pcl_iod.lib;pcl_io_ply.lib;pcl_io_plyd.lib;pcl_kdtree.lib;pcl_kdtreed.lib;pcl_keypoints.lib;pcl_keypointsd.lib;pcl_ml.lib;pcl_mld.lib;pcl_octree.lib;pcl_octreed.lib;pcl_outofcore.lib;pcl_outofcored.lib;pcl_people.lib;pcl_peopled.lib;pcl_recognition.lib;pcl_recognitiond.lib;pcl_registration.lib;pcl_registrationd.lib;pcl_sample_consensus.lib;pcl_sample_consensusd.lib;pcl_search.lib;pcl_searchd.lib;pcl_segmentation.lib;pcl_segmentationd.lib;pcl_stereo.lib;pcl_stereod.lib;pcl_surface.lib;pcl_surfaced.lib;pcl_tracking.lib;pcl_trackingd.lib;pcl_visualization.lib;pcl_visualizationd.lib;%(AdditionalDependencies)c---常规----附加目录D:\PCL1.15.1\3rdParty\VTK\lib;D:\PCL1.15.1\3rdParty\Boost\lib;D:\PCL1.15.1\lib;D:\PCL1.15.1\3rdParty\FLANN\lib;D:\Program Files\OpenNI2\Lib;c----预处理NDEBUG;_CONSOLE;BOOST_ALL_NO_LIB;PCL_SILENCE_MALLOC_WARNING1;EIGEN_MAX_ALIGN_BYTES32;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)扩展--Qt VS Tool -Qt versions扩展--Qt VS Tool -Options修改QT Designer为True更改程序QtWidgetsApplication1.h文件修改为下面#pragma once//#ifndef MAINWINDOW_H//#define MAINWINDOW_H#include QtWidgets/QMainWindow#include ui_QtWidgetsApplication1.h// PCL头文件#include pcl/point_cloud.h#include pcl/point_types.hQT_BEGIN_NAMESPACEnamespace Ui { class QtWidgetsApplication1Class; }QT_END_NAMESPACEclass QtWidgetsApplication1 : public QMainWindow{Q_OBJECTpublic:QtWidgetsApplication1(QWidget *parent nullptr);~QtWidgetsApplication1();private:Ui::QtWidgetsApplication1Class * ui;private slots:// 按钮点击槽函数ui自动生成void on_pushButton_clicked();};//#endif // MAINWINDOW_HQtWidgetsApplication1.cpp修改如下#include QtWidgetsApplication1.h//#include ui_QtWidgetsApplication1.h // ← 加上这一行#include pcl/io/pcd_io.h#include QString#include QMessageBox#include iostreamQtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent): QMainWindow(parent),ui(new Ui::QtWidgetsApplication1Class){ui-setupUi(this);}QtWidgetsApplication1::~QtWidgetsApplication1(){delete ui;}void QtWidgetsApplication1::on_pushButton_clicked(){// 简单PCL测试代码 pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ);cloud-width 5;cloud-height 1;cloud-points.resize(cloud-width * cloud-height);QMessageBox::information(this, 提示 , QString(点云创建成功共%1个点 ).arg(cloud-size()));// 给点填点数据示例for (auto p : cloud-points) {p.x 1.0f; p.y 2.0f; p.z 3.0f;}// 保存为 PCD 文件if (pcl::io::savePCDFileASCII(D:/test_pointcloud.pcd, *cloud) 0){qDebug()点云保存成功 ;}else{qDebug() 保存失败 ;}}main.cpp修改如下#include QtWidgetsApplication1.h#include QtWidgets/QApplicationint main(int argc, char *argv[]){QApplication app(argc, argv);QtWidgetsApplication1 window;window.show();return app.exec();}QtWidgetsApplication1.ui界面加一个按钮启动程序点击按钮生成点云文件编译出现问题和运行出现乱码的问题程序出现问题汉字失败老是报错改成英文和数字就没问题。后来在失败后面和之间加上一个空格就解决问题此更改可以让程序通过编译和运行但是运行中出现中文提示时会出现乱码根本原因VS 的 MSVC 编译器默认把源码当成 GBK 编码但 Qt 内部全部用 UTF-8 存储字符串编码不一致 → 弹窗中文变成问号 / 方框乱码。更改方案如下VS 右键你的 Qt 项目 →属性配置属性 → C/C →命令行在【其他选项】里面添加/utf-8/utf-8等价于源码编码 UTF-8 程序运行字符串也是 UTF-8一步到位Qt6 最适配 4. 保存 →清理项目 → 重新生成所有.h.cpp文件VS 右下角编码选择UTF-8带 BOM文件 → 高级保存选项 → 编码选Unicode (UTF-8 带签名) - 代码页650014. 保存 →清理项目 → 重新生成所有.h.cpp文件VS 右下角编码选择UTF-8带 BOM文件 → 高级保存选项 → 编码选Unicode (UTF-8 带签名) - 代码页65001需要打开所有文件然后点击菜单栏的文件-源代码管理-高级-高级保存按照上述要求修改保存内容5文件-源代码管理-高级-高级保存没有响应选项的解决方法把【高级保存选项】添加回文件菜单以后方便点顶部菜单工具 (T) → 自定义 (C)...切换到【命令】标签页单选框选【菜单栏】下拉框选择【文件】点【添加命令 (A)...】左侧类别选【文件】右侧找到高级保存选项 (V)...选中确定关闭窗口现在文件菜单就有这个选项了清理结局方案重新编译问题解决。
返回列表