VS+ QT(一)使用CGAL实现点云分类

本文详细介绍了使用CGAL库进行点云数据处理和分类的步骤,包括依赖库的添加、点云读取、预处理、特征计算、标签定义、权重设置、分类算法以及标签颜色信息转换和点云保存。通过对点云数据进行预处理和特征提取,使用不同的分类方法,实现了对点云数据的高效分类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、依赖的添加

1、附加包含文件目录

$(CGAL)\include
$(CGAL)\auxiliary\gmp\include

$(CGAL)代表CGAL的文件夹地址
例如我的是:($(SolutionDir)为解决方案文件夹目录)
$(SolutionDir)…\dependences\cgal\include;
$(SolutionDir)…\dependences\cgal\auxiliary\gmp\include;
附加包含目录

2、附加包含库文件目录

$(CGAL)\auxiliary\gmp\lib;

同上
库目录

3、附加包含库文件

libmpfr-4.lib;libgmp-10.lib;

在这里插入图片描述

4、头文件

#include <CGAL/Simple_cartesian.h>
#include <CGAL/Classification.h> //分类
#include <CGAL/bounding_box.h> //生成包含点云的矩形(平行于坐标轴)
#include <CGAL/tags.h>

#include <CGAL/IO/read_points.h> //读写ply文件
#include <CGAL/IO/write_ply_points.h>

#include <CGAL/Real_timer.h>//用于计算运行时间

#include <lasreader.hpp>
#include <laswriter.hpp> //LASTools读取文件

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <string>

二、代码

1、类名定义

typedef CGAL::Parallel_if_available_tag Concurrency_tag;

typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Iso_cuboid_3 Iso_cuboid_3;
typedef Kernel::Point_3 Point;
typedef std::vector<Point> Point_range;
typedef CGAL::Identity_property_map<Point> Pmap; //将 property map 映射到自身的属性映射(通过引用)

namespace Classification = CGAL::Classification;
typedef Classification::Sum_of_weighted_features_classifier Classifier;
typedef Classification::Planimetric_grid<Kernel, Point_range, Pmap>             Planimetric_grid;
typedef Classification::Point_set_neighborhood<Kernel, Point_range, Pmap>       Neighborhood;
typedef Classification::Local_eigen_analysis                                    Local_eigen_analysis;
typedef Classification::Label_handle                                            Label_handle;
typedef Classification::Feature_handle                                          Feature_handle;
typedef Classification::Label_set                                               Label_set;
typedef Classification::Feature_set                                             Feature_set;
typedef Classification::Feature::Distance_to_plane<Point_range, Pmap>           Distance_to_plane;
typedef Classification::Feature::Elevation<Kernel, Point_range, Pmap>           Elevation;
typedef Classification::Feature::Vertical_dispersion<Kernel, Point_range, Pmap> Dispersion;

重新定义类名,减少后续的代码量

2、点云读取

//点云读取
LASreadOpener lasreadopener;

cout << "read File " << Path << endl;
l
<think>我们正在配置个复杂的开发环境,需要集成多个第三方库。由于这些库之间存在依赖关系,且版本兼容性很重要,我们将分步骤进行配置。以下步骤假设您已经安装了Visual Studio 2019和Qt 5.15.2。 参考引用[1][2][3]中提到的配置方法,特别是关于VTK和PCL的配置。同时,我们还需要集成其他库(LASlib, Eigen3, CGAL, GDAL, PROJ)。注意,有些库可能已经包含在PCL的依赖中(如Eigen3、VTK),但为了确保完整性和版本致性,我们可能需要单独安装和配置。 步骤概览: 1. 安装并配置Qt 5.15.2与VS2019的集成。 2. 安装和编译VTK(建议使用9.1.0或9.3.1,根据PCL的要求选择,因为PCL1.12.1依赖VTK9.1.0)。 3. 安装PCL(点云库)并替换其自带的VTK(如果使用自己编译的VTK)。 4. 安装其他库:Eigen3(通常只需头文件)、CGAL、GDAL、PROJ、LASlib。 详细步骤: ### 1. 安装VS2019和Qt5.15.2 - 确保VS2019已安装“使用C++的桌面开发”工作负载。 - 安装Qt5.15.2,并确保在安装时选择与VS2019兼容的版本(如msvc2017_64,因为VS2019使用msvc2017的编译器)。注意:Qt5.15.2官方安装程序可能只提供msvc2017的预编译版本,而VS2019可以使用msvc2017的编译器(即v141)和msvc2019的编译器(v142)。如果使用v142,可能需要自行编译Qt5.15.2,或者使用v141工具集(在VS2019中可以选择v141工具集)。 - 安装Qt VS Tools扩展(通过VS2019的扩展管理器),然后配置Qt版本(在Qt VS Tools -> Qt Options中添加Qt的安装路径)。 ### 2. 编译VTK - 下载VTK源码(建议9.1.0或9.3.1,根据PCL版本要求,PCL1.12.1通常使用VTK9.1.0)。如果使用引用[3]中的方法,则使用VTK9.1.0。 - 使用CMake配置VTK: - 设置源码路径和构建路径(建议新建个build目录)。 - 点击Configure,选择VS2019和合适的编译器(x64)。 - 根据引用[3]的步骤,可能需要设置些选项,例如: - `BUILD_SHARED_LIBS:BOOL=ON` # 构建动态库 - `CMAKE_INSTALL_PREFIX` # 设置安装路径(如D:\VTK\VTK9.1.0-install) - 如果需要Qt支持,开启`VTK_GROUP_QT`,并设置Qt的路径(需要设置`Qt5_DIR`为Qt安装目录下的`lib/cmake/Qt5`)。 - 其他选项根据需求开启,然后Generate生成VS工程。 - 在VS2019中打开生成的VTK.sln,选择Release x64,右键生成ALL_BUILD,然后生成INSTALL(可能需要管理员权限)。 - 将安装路径(如D:\VTK\VTK9.1.0-install)下的bin目录添加到系统环境变量PATH中。 ### 3. 安装PCL - 下载PCL1.12.1的二进制安装包(或者从源码编译,但二进制包更方便)。安装包通常包含第三方依赖(如Eigen3、FLANN等)。 - 安装后,根据引用[1]和[3],将之前编译好的VTK(整个文件夹)替换PCL安装目录下的`3rdParty\VTK`(注意备份原VTK文件夹)。 - 将PCL的bin目录(如`D:\PCL1.12.1\bin`)添加到系统PATH。 ### 4. 安装其他库 - **Eigen3**: 只需下载头文件库(如Eigen3.4.0),将包含目录(如`eigen-3.4.0`)添加到工程包含路径。 - **CGAL**: 下载CGAL(如5.5.1)的安装程序或源码。如果使用源码,用CMake编译安装(需要Boost依赖)。将CGAL的include目录和lib目录(如果编译了)添加到工程。 - **GDAL**和**PROJ**: 这两个库通常使用。下载GDAL(如3.4.0)和PROJ(如8.2.1)的Windows二进制包(或源码编译)。将它们的bin目录添加到PATH,将include和lib目录分别添加到工程。 - **LASlib**: 下载LASlib源码(如2.4.0),使用CMake生成VS工程,编译后得到库文件。将头文件和库文件路径添加到工程。 ### 5. 配置Qt项目(.pro文件或.pri文件) - 在Qt项目中,需要配置包含路径(INCLUDEPATH)和库路径(LIBS),以及链接所需的库文件。 - 创建个.pri文件(例如thirdparty.pri)来管理所有第三方库的路径,然后在.pro文件中包含它。 示例thirdparty.pri文件内容(注意替换为实际路径): ```qmake # VTK INCLUDEPATH += "D:/VTK/VTK9.1.0-install/include/vtk-9.1" LIBS += -L"D:/VTK/VTK9.1.0-install/lib" -lvtkCommonCore-9.1 -lvtkFiltersCore-9.1 ... # 根据实际需要链接的库 # PCL INCLUDEPATH += "D:/PCL1.12.1/include/pcl-1.12" INCLUDEPATH += "D:/PCL1.12.1/3rdParty/Eigen/eigen3" # 如果PCL自带的Eigen版本符合要求,则使用 # 注意:PCL包含多个模块,需要分别包含 LIBS += -L"D:/PCL1.12.1/lib" -lpcl_common -lpcl_io ... # 根据实际需要链接的库 # Eigen3 (如果使用独立安装的Eigen) INCLUDEPATH += "D:/eigen-3.4.0" # CGAL INCLUDEPATH += "D:/CGAL-5.5.1/include" LIBS += -L"D:/CGAL-5.5.1/lib" -lCGAL -lCGAL_Core ... # 根据实际需要链接的库 # GDAL INCLUDEPATH += "D:/gdal/include" LIBS += -L"D:/gdal/lib" -lgdal_i # PROJ INCLUDEPATH += "D:/proj/include" LIBS += -L"D:/proj/lib" -lproj # LASlib INCLUDEPATH += "D:/LASlib/include" LIBS += -L"D:/LASlib/lib" -llas ``` 注意:在Windows中,链接库时通常使用`.lib`文件,而动态链接库(.dll)需要放在PATH包含的目录中(如exe所在目录或系统PATH)。在Qt项目中,也可以使用`$$PWD`来指定相对路径。 ### 6. 测试环境 - 创建个简单的Qt控制台或GUI程序,包含个测试代码(如读取点云文件并显示)。 - 确保在VS2019中配置了正确的Qt工具集,并设置生成后事件将所需的dll复制到输出目录(或者将各个库的bin目录加入PATH)。 注意事项: - 版本兼容性:特别注意各个库之间的版本依赖。例如,PCL1.12.1依赖VTK9.1.0,如果使用VTK9.3.1可能需要重新编译PCL。同样,GDAL和PROJ版本需要匹配(GDAL3.4.0需要PROJ>=8.0.0)。 - 路径问题:确保所有路径使用正确的分隔符(Windows下为反斜杠,但在Qt的.pro文件中可以使用正斜杠)和正确的引号。 - 编译选项:所有第三方库和项目必须使用相同的运行时库(如MD/MDd),否则会出现链接错误。建议使用Release模式进行开发测试,因为Debug模式可能需要大量内存和磁盘空间。 - 如果遇到链接错误,检查库文件名是否正确(如版本号、后缀等)。 以上步骤是个大致的指南,具体操作可能因实际环境而异。建议参考各个库的官方文档进行安装和配置。 根据引用[3][4],VTK的编译和替换是关键步骤之。同时,引用[5]提到Qtitan组件支持Qt5.15.2和VS2019,但我们这里不使用商业组件。 最后,如果遇到问题,可以尝试: - 使用Dependency Walker(或类似工具)检查dll依赖。 - 在VS2019中查看链接错误的具体信息,逐解决。 由于配置过程复杂,建议分阶段测试(先配置VTK+Qt,再PCL,再其他)。 §§相关问题§§ 1. 如何解决在配置VTK时CMake找不到Qt的问题? 2. 在替换PCL的VTK后,运行程序出现VTK相关链接错误怎么办? 3. 如何确保所有第三方库使用相同的C++运行时库(如MD/MDd)? 4. 在Qt项目中如何管理多个第三方库的路径和链接选项? 5. 如何测试PCL和VTK是否配置成功?</think>### 在VS2019中配置Qt 5.15.2集成多库的完整指南 #### **1. 环境准备** - **安装VS2019**:确保已安装"使用C++的桌面开发"工作负载[^2] - **安装Qt 5.15.2**: ```bash qt-unified-windows-x64-4.5.1-online.exe ``` 勾选`MSVC 2017 64-bit`组件(兼容VS2019)[^2] - **安装Qt VS Tools**: VS2019菜单 → 扩展 → 管理扩展 → 搜索"Qt Visual Studio Tools" #### **2. 第三方库安装与编译** 按顺序安装以避免依赖冲突: | 库名 | 推荐版本 | 安装方式 | 关键配置项 | |------------|------------|------------------------------|-----------------------------| | **Eigen3** | 3.4.0 | 头文件库(无需编译) | `INCLUDEPATH += D:\eigen-3.4.0` | | **CGAL** | 5.5.1 | CMake编译(需Boost) | `-DCGAL_HEADER_ONLY=OFF` | | **PROJ** | 9.2.1 | CMake编译 | `-DBUILD_SHARED_LIBS=ON` | | **GDAL** | 3.6.4 | 依赖PROJ | `-DPROJ_INCLUDE_DIR=D:\proj\include` | | **VTK** | 9.3.1 | CMake编译(需Qt集成)[^4] | `-DVTK_GROUP_QT=ON` | | **PCL** | 1.12.1 | 替换自带的VTK[^1][^3] | 替换`PCL\3rdParty\VTK`目录 | | **LASlib** | 2.4.0 | 修改`lasdefinitions.hpp` | 注释`#define _MSC_VER 193X` | > **关键步骤**:编译VTK后替换PCL的VTK目录[^1][^3] > ```bash > xcopy /E /Y D:\VTK-9.3.1-install\* D:\PCL1.12.1\3rdParty\VTK > ``` #### **3. Qt项目配置(.pro文件)** ```qmake # 基础配置 QT += core gui opengl CONFIG += c++17 # Eigen3 (头文件) INCLUDEPATH += D:/eigen-3.4.0 # VTK INCLUDEPATH += D:/VTK-9.3.1-install/include/vtk-9.3 LIBS += -L"D:/VTK-9.3.1-install/lib" \ -lvtkCommonCore-9.3 -lvtkFiltersCore-9.3 # PCL INCLUDEPATH += D:/PCL1.12.1/include/pcl-1.12 LIBS += -L"D:/PCL1.12.1/lib" \ -lpcl_common_release -lpcl_io_release # CGAL INCLUDEPATH += D:/CGAL-5.5.1/include LIBS += -L"D:/CGAL-5.5.1/lib" -lCGAL # GDAL/PROJ INCLUDEPATH += D:/gdal/include LIBS += -L"D:/gdal/lib" -lgdal_i ``` #### **4. 环境变量配置** 添加PATH(系统环境变量): ```plaintext D:\VTK-9.3.1-install\bin; D:\PCL1.12.1\bin; D:\gdal\bin; D:\CGAL-5.5.1\bin ``` #### **5. 测试代码(验证PCL+VTK)** ```cpp #include <pcl/point_cloud.h> #include <vtkSmartPointer.h> #include <vtkSphereSource.h> int main() { // 测试PCL pcl::PointCloud<pcl::PointXYZ> cloud; cloud.width = 100; std::cout << "PCL works! Points: " << cloud.width << std::endl; // 测试VTK auto sphere = vtkSmartPointer<vtkSphereSource>::New(); sphere->Update(); std::cout << "VTK works! Sphere points: " << sphere->GetOutput()->GetNumberOfPoints() << std::endl; return 0; } ``` #### **6. 常见问题解决** 1. **VTK-Qt链接错误**: - 检查CMake VTK时勾选`VTK_GROUP_QT` - 确保Qt版本与VS工具链匹配(MSVC2017 64-bit) 2. **GDAL PROJ数据路径**: ```cpp qputenv("PROJ_LIB", "D:/proj/share/proj"); qputenv("GDAL_DATA", "D:/gdal/share/gdal"); ``` 3. **LASlib编译错误**: 修改`lasdefinitions.hpp`: ```cpp // #define _MSC_VER 1930 // VS2022版本号注释掉 ``` > **重要提示**:所有库必须使用**相同的运行时库**(MD/MDd),在CMake配置中统设置: > ```cmake > set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL") > ``` #### **7. 引用资源** - [VTK源码下载][^4] - [PCL-VTK替换步骤][^1][^3] - [Qt-VS官方工具][^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值