首页 > 其他分享 >点云库使用场景以及编译和使用实例

点云库使用场景以及编译和使用实例

时间:2024-08-31 17:56:25浏览次数:5  
标签:PCL ## sudo 编译 install 实例 cloud pcl 点云库

1 点云库概述与应用场景

## 什么是点云库?

点云库是一套专门用于处理三维点云数据的软件工具和算法集合。点云是由大量的三维坐标点组成的数据集,通常用来表示物体或环境的表面。

最知名的点云库是开源的 PCL(Point Cloud Library),但还有其他库如 Open3D, PDAL(Point Data Abstraction Library)等也提供类似的功能。

## 点云库的主要功能

1. **数据 I/O**:读取和写入各种点云文件格式(如 PCD, PLY, OBJ 等)。

2. **滤波**:去除噪声点、平滑处理、下采样等。

3. **特征提取**:计算法线、曲率、关键点等几何特征。

4. **配准**:将多个点云对齐或匹配。

5. **分割**:将点云分割成不同的部分或对象。

6. **表面重建**:从点云生成三维网格或表面模型。

7. **可视化**:提供点云数据的交互式 3D 可视化工具。

8. **识别**:基于点云数据进行物体识别和分类。

## 使用场景

点云库在多个领域有广泛的应用,以下是一些常见的使用场景:

1. **自动驾驶和机器人技术**
   - 环境感知和障碍物检测
   - SLAM(同时定位与地图构建)
   - 路径规划和导航

2. **3D 扫描和重建**
   - 建筑和考古遗址的数字化
   - 逆向工程(从实物创建 CAD 模型)
   - 质量检测和工业测量

3. **计算机视觉和增强现实**
   - 3D 物体识别和跟踪
   - 场景理解和重建
   - AR 应用中的环境映射

4. **地理信息系统(GIS)和遥感**
   - 地形分析和建模
   - 城市规划和 3D 地图制作
   - 森林调查和植被分析

5. **医疗成像**
   - 3D 医学图像分析
   - 器官和组织的 3D 建模
   - 手术规划和导航

6. **工业自动化**
   - 工业机器人的视觉引导
   - 产品检测和质量控制
   - 工厂布局规划和优化

7. **娱乐和游戏产业**
   - 3D 动画和特效
   - 虚拟现实(VR)环境创建
   - 游戏中的 3D 资产生成

8. **环境监测和灾害管理**
   - 地质灾害评估(如山体滑坡、洪水)
   - 森林资源调查和管理
   - 气候变化影响分析

9. **文化遗产保护**
   - 历史建筑和文物的 3D 数字化保存
   - 虚拟博物馆和展览

10. **智能制造**
    - 3D 打印前的模型优化
    - 自动化生产线中的部件识别和定位
    - 产品定制化设计

## 点云库的优势

1. **高效处理**:针对大规模 3D 数据的优化算法。
2. **跨平台**:支持多种操作系统和编程语言。
3. **开源社区**:持续更新和改进,有大量的文档和支持。
4. **模块化设计**:可以根据需求选择特定功能。
5. **与其他库集成**:通常可以与计算机视觉、机器学习库协同工作。

## 挑战和限制

1. **学习曲线**:使用这些库可能需要一定的专业知识。
2. **计算资源**:处理大型点云可能需要强大的硬件。
3. **数据质量依赖**:结果的质量很大程度上取决于输入数据的质量。
4. **实时处理**:某些复杂操作可能难以实现实时性能。

2 PCL (Point Cloud Library) linux编译指南

## 前置要求

在开始编译 PCL 之前,请确保您的系统已安装以下依赖项:

1. CMake (3.10+)
2. Boost (1.55+)
3. Eigen (3.0+)
4. FLANN (1.7+)
5. VTK (6.2+)
6. OpenNI (可选,用于 Kinect 支持)
7. Qt (可选,用于可视化工具)
8. CUDA (可选,用于 GPU 加速)

对于 Ubuntu/Debian 系统,可以使用以下命令安装大部分依赖:

```bash
sudo apt-get update
sudo apt-get install git build-essential linux-libc-dev
sudo apt-get install cmake cmake-gui 
sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev
sudo apt-get install mpi-default-dev openmpi-bin openmpi-common  
sudo apt-get install libflann1.9 libflann-dev
sudo apt-get install libeigen3-dev
sudo apt-get install libboost-all-dev
sudo apt-get install libvtk7-dev libvtk7-qt-dev
sudo apt-get install libqhull* libgtest-dev
sudo apt-get install freeglut3-dev pkg-config
sudo apt-get install libxmu-dev libxi-dev 
sudo apt-get install mono-complete
sudo apt-get install qt5-default
sudo apt-get install libpcap-dev
```

## 编译步骤

### 1. 获取 PCL 源码

```bash
git clone https://github.com/PointCloudLibrary/pcl.git
cd pcl
```

### 2. 创建构建目录

```bash
mkdir build && cd build
```

### 3. 配置 CMake

```bash
cmake ..
```

如果您想自定义编译选项,可以使用 CMake GUI:

```bash
cmake-gui ..
```

在 GUI 中,您可以选择启用或禁用特定的模块,设置安装路径等。

### 4. 编译

```bash
make -j4
```

这里的 `-j4` 表示使用 4 个核心进行并行编译。根据您的 CPU 核心数,可以调整这个数字。

### 5. 安装

```bash
sudo make install
```

### 6. 更新链接器缓存(仅限 Linux)

```bash
sudo ldconfig
```

## 常见问题和解决方案

1. **缺少依赖项**:如果 CMake 报告缺少某些依赖项,请确保已安装所有必需的库。

2. **版本不兼容**:确保您的依赖库版本与 PCL 要求的版本兼容。

3. **内存不足**:如果在编译过程中遇到内存不足的问题,尝试减少并行编译的核心数(例如,使用 `make -j2` 而不是 `make -j4`)。

4. **CUDA 支持**:如果需要 CUDA 支持,确保已安装 CUDA 工具包,并在 CMake 配置时启用 CUDA 选项。

5. **自定义安装路径**:如果想要安装到非默认位置,可以在 CMake 配置时设置 `CMAKE_INSTALL_PREFIX`。

## 验证安装

编译安装完成后,您可以通过运行以下命令来验证 PCL 是否正确安装:

```bash
pcl_version
```

这应该会显示已安装的 PCL 版本信息。

## 使用 PCL

安装完成后,您可以在您的 C++ 项目中使用 PCL。以下是一个简单的 CMakeLists.txt 示例,展示如何在项目中链接 PCL:

```cmake
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(pcl_example)

find_package(PCL 1.10 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable(pcl_example main.cpp)
target_link_libraries(pcl_example ${PCL_LIBRARIES})
```

3 Windows 上编译 PCL (Point Cloud Library) 指南

## 前置要求

1. **Visual Studio**:推荐使用 Visual Studio 2019 或更新版本。
2. **CMake**:下载并安装最新版本的 CMake (3.10+)。
3. **Git**:用于克隆 PCL 源代码。
4. **Boost**:PCL 依赖 Boost 库。
5. **Eigen**:线性代数库。
6. **FLANN**:快速最近邻搜索库。
7. **VTK**:可视化工具包。
8. **Qt**(可选):用于 PCL 的可视化工具。

## 步骤

### 1. 安装依赖项

推荐使用 vcpkg 来管理依赖项,这可以大大简化安装过程。

1. 安装 vcpkg:
   ```
   git clone https://github.com/Microsoft/vcpkg.git
   cd vcpkg
   .\bootstrap-vcpkg.bat
   ```

2. 使用 vcpkg 安装依赖:
   ```
   .\vcpkg install boost:x64-windows eigen3:x64-windows flann:x64-windows vtk:x64-windows qhull:x64-windows
   ```

   如果需要 Qt 支持:
   ```
   .\vcpkg install qt5:x64-windows
   ```

### 2. 获取 PCL 源码

```
git clone https://github.com/PointCloudLibrary/pcl.git
cd pcl
```

### 3. 配置 CMake

1. 创建构建目录:
   ```
   mkdir build
   cd build
   ```

2. 运行 CMake GUI:
   - 设置源代码目录为 PCL 源码目录。
   - 设置构建目录为刚创建的 build 目录。
   - 点击 "Configure",选择您的 Visual Studio 版本和 x64 平台。
   - 设置 `CMAKE_TOOLCHAIN_FILE` 为 vcpkg 的 toolchain 文件路径(通常是 `[vcpkg root]/scripts/buildsystems/vcpkg.cmake`)。
   - 如果需要,可以禁用一些不需要的模块以加快编译速度。
   - 再次点击 "Configure",然后点击 "Generate"。

### 4. 编译

1. 打开生成的 .sln 文件(在 build 目录中)。
2. 在 Visual Studio 中,将解决方案配置设置为 "Release" 和 "x64"。
3. 右键点击 "ALL_BUILD" 项目,选择 "生成"。

### 5. 安装

编译完成后,在 Visual Studio 中右键点击 "INSTALL" 项目并选择 "生成"。这将安装 PCL 到指定的安装目录。

## 常见问题和解决方案

1. **内存不足**:编译 PCL 需要大量内存。如果遇到内存不足的问题,尝试关闭其他应用程序,或增加虚拟内存。

2. **编译错误**:确保所有依赖项的版本兼容。如果遇到特定错误,可以在 PCL 的 GitHub Issues 中搜索解决方案。

3. **链接错误**:可能是由于依赖项版本不匹配造成的。确保使用 vcpkg 安装的所有库版本一致。

4. **CUDA 支持**:如果需要 CUDA 支持,确保已安装 CUDA 工具包,并在 CMake 中启用相关选项。

5. **路径过长**:Windows 有路径长度限制。如果遇到相关错误,考虑将 PCL 源码和构建目录移动到更短的路径。

## 验证安装

编译安装完成后,您可以通过在 Visual Studio 中创建一个新的 C++ 项目来测试 PCL:

1. 创建一个新的 C++ 控制台应用程序。
2. 在项目属性中,添加 PCL 的 include 和 lib 目录。
3. 链接必要的 PCL 库。
4. 尝试编译并运行一个简单的 PCL 程序,例如:

```cpp
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <iostream>

int main() {
    pcl::PointCloud<pcl::PointXYZ> cloud;
    std::cout << "PCL test successful!" << std::endl;
    return 0;
}
```

如果编译和运行都成功,说明 PCL 已经正确安装和配置。

4 点云库应用实例

以下是几个使用点云库(主要是 PCL)的具体应用例子:

## 1. 自动驾驶中的障碍物检测

**场景描述**:
自动驾驶汽车需要实时检测周围环境中的障碍物,以确保安全导航。

**应用方法**:
- 使用激光雷达(LiDAR)采集周围环境的点云数据。
- 利用 PCL 的分割算法(如 RANSAC)将地面点从点云中分离。
- 使用聚类算法(如 Euclidean Cluster Extraction)识别潜在的障碍物。
- 应用边界框估计来确定障碍物的位置和尺寸。

**代码示例**:
```cpp
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/segmentation/extract_clusters.h>

// 地面分割
pcl::SACSegmentation<pcl::PointXYZ> seg;
seg.setOptimizeCoefficients(true);
seg.setModelType(pcl::SACMODEL_PLANE);
seg.setMethodType(pcl::SAC_RANSAC);
seg.setDistanceThreshold(0.01);
seg.setInputCloud(cloud);
seg.segment(*inliers, *coefficients);

// 障碍物聚类
pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;
ec.setClusterTolerance(0.02);
ec.setMinClusterSize(100);
ec.setMaxClusterSize(25000);
ec.setInputCloud(cloud_filtered);
ec.extract(cluster_indices);
```

## 2. 3D 扫描和重建

**场景描述**:
在考古学中,需要对历史文物进行 3D 数字化保存。

**应用方法**:
- 使用 3D 扫描仪获取文物的点云数据。
- 应用 PCL 的配准算法(如 ICP)将多个扫描结果对齐。
- 使用表面重建算法(如 Poisson 表面重建)生成完整的 3D 模型。
- 应用纹理映射技术为模型添加颜色信息。

**代码示例**:
```cpp
#include <pcl/registration/icp.h>
#include <pcl/surface/poisson.h>

// 点云配准
pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;
icp.setInputSource(cloud_source);
icp.setInputTarget(cloud_target);
icp.align(*cloud_aligned);

// 表面重建
pcl::Poisson<pcl::PointNormal> poisson;
poisson.setDepth(9);
poisson.setInputCloud(cloud_with_normals);
poisson.reconstruct(triangles);
```

## 3. 工业质量检测

**场景描述**:
在制造业中,需要自动检测产品是否符合规格。

**应用方法**:
- 使用 3D 相机捕获产品的点云数据。
- 利用 PCL 的配准算法将扫描的点云与 CAD 模型对齐。
- 使用点到模型距离计算来检测偏差。
- 应用统计离群值移除来过滤噪声点。

**代码示例**:
```cpp
#include <pcl/registration/icp.h>
#include <pcl/filters/statistical_outlier_removal.h>

// 配准
pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;
icp.setInputSource(cloud_product);
icp.setInputTarget(cloud_cad_model);
icp.align(*cloud_aligned);

// 离群值移除
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
sor.setInputCloud(cloud_aligned);
sor.setMeanK(50);
sor.setStddevMulThresh(1.0);
sor.filter(*cloud_filtered);
```

## 4. 室内导航机器人

**场景描述**:
开发一个能在室内自主导航的服务机器人。

**应用方法**:
- 使用 RGB-D 相机(如 Kinect)采集环境点云数据。
- 应用 PCL 的 SLAM 算法进行实时定位和地图构建。
- 使用平面分割算法识别地面和墙壁。
- 应用路径规划算法在构建的地图上进行导航。

**代码示例**:
```cpp
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/filters/extract_indices.h>

// 平面分割(识别地面)
pcl::SACSegmentation<pcl::PointXYZ> seg;
seg.setOptimizeCoefficients(true);
seg.setModelType(pcl::SACMODEL_PLANE);
seg.setMethodType(pcl::SAC_RANSAC);
seg.setDistanceThreshold(0.01);
seg.setInputCloud(cloud);
seg.segment(*inliers, *coefficients);

// 提取非地面点
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud(cloud);
extract.setIndices(inliers);
extract.setNegative(true);
extract.filter(*cloud_obstacles);
```

## 5. 森林资源调查

**场景描述**:
使用无人机进行大规模森林资源调查和树木计数。

**应用方法**:
- 使用无人机搭载的 LiDAR 系统采集森林的点云数据。
- 应用 PCL 的地面分割算法分离地面和植被。
- 使用聚类算法识别单个树木。
- 应用特征提取算法估计树木的高度和冠幅。

**代码示例**:
```cpp
#include <pcl/segmentation/progressive_morphological_filter.h>
#include <pcl/segmentation/extract_clusters.h>

// 地面分割
pcl::ProgressiveMorphologicalFilter<pcl::PointXYZ> pmf;
pmf.setInputCloud(cloud);
pmf.setMaxWindowSize(20);
pmf.setSlope(1.0f);
pmf.setInitialDistance(0.5f);
pmf.setMaxDistance(3.0f);
pmf.extract(ground_indices);

// 树木聚类
pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;
ec.setClusterTolerance(0.5);
ec.setMinClusterSize(100);
ec.setMaxClusterSize(25000);
ec.setInputCloud(cloud_vegetation);
ec.extract(cluster_indices);
```

这些例子展示了点云库在不同领域的应用。每个应用都涉及到点云数据的采集、处理和分析,充分利用了 PCL 提供的各种算法和工具。

标签:PCL,##,sudo,编译,install,实例,cloud,pcl,点云库
From: https://blog.csdn.net/zhangyihu321/article/details/141754971

相关文章

  • 微信小程序+php后台服务器实现登录流程实例说明(转)
    下面就对PHP后台实现微信小程序登录进行详细讲解。一、获取微信小程序登录凭证小程序登录流程中,首先需要通过微信小程序接口获取登录凭证(code)。我们需要在小程序端调用微信提供的wx.login()函数,该函数返回用户登录凭证code。例如:wx.login({success:function(res){......
  • 《NET CLR via C#》---第八章(类的实例构造器,结构的实例构造器,类型构造器,操作符重载方
    类的实例构造器构造器是将类型的实例初始化为良好状态的特殊方法。构造器方法在“方法定义元数据表”中始终叫做.ctor(constructor的简称)。创建引用类型的实例时,首先为实例的数据字段分配内存,然后初始化对象的附加字段(类型对象指针和同步块索引),最后调用类型的实例构造器来设置对象......
  • python并发与并行(五.1) ———— 不要在每次fan-out时都新建一批Thread实例
    我们使用康威生命游戏的例子来解释这个专题。首先我们要实现一个康威生命游戏。这是个经典的有限状态自动机。它的规则很简单:在任意长宽的二维网格中,每个单元格都必须处于ALIVE或EMPTY状态,前者表示这个单元格里有生命存在,后者表示这里没有生物(或者原有生物已经死亡)。时钟每走一格......
  • 管易云API接口对接实例
    管易云(C-ERP)是一款面向电商企业的企业管理软件,它集成了订单管理、库存管理、财务管理等多种功能。为了更好地与其他系统集成,管易云提供了API接口,使得第三方应用可以通过调用这些接口来实现数据交互。管易云API接口对接实例假设我们有一个电商平台需要与管易云进行订单同步,以便及时......
  • python并发与并行(五.2) ———— 不要在每次fan-out时都新建一批Thread实例
    想在Python里平行地做I/O,首先要考虑的工具当然是线程。但如果真用线程来表示fan-out模式中的执行路径,你就会发现,这样其实有很多问题。我们用上一篇文章的conwaygame的实现来举例说明。我们用线程来解决game_logic函数由于执行I/O而产生的延迟问题。首先,这些线程之间需要锁定功能对......
  • 【Linux】Linux64位环境下编译32位报错的解决办法
    问题如题,当我尝试在wsl2的ubuntu中使用-m32选项编译32位程序的时候,出现了下面的两种报错❯g++-m32test.cpp-otest1&&./test1Infileincludedfromtest.cpp:1:/usr/include/stdio.h:27:10:fatalerror:bits/libc-header-start.h:Nosuchfileordirectory27|#i......
  • C++:类的定义、实例化
    目录一、类的定义1.1类的定义格式1.2访问限定符1.3类域二、实例化2.1实例化概念2.2对象大小一、类的定义1.1类的定义格式•class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略,类体中内容称为类的成员:类中的变量称为类的......
  • 编译执行和解释执行是两种不同的程序执行方式,它们在处理源代码时有着本质的区别:
    1.编译执行(CompiledExecution)定义:编译执行是指将源代码一次性转换成机器可执行的二进制代码的过程。这种转换通常是由编译器完成的。过程:编译阶段:源代码被编译器转化为目标代码(通常是机器码)。链接阶段:目标代码被链接器链接成可执行文件。优点:运行速度快,因为执行的是机器码。安......
  • Gluon 编译 JavaFx -> exe
    Gluon编译JavaFx->exe能力强的伙伴可以直接参考官方文档开发工具idea2023.3ideagluonplugingitapache-maven-3.8.4环境准备vs2022community版本(使用微软官方的安装器安装,社区版即可)jdk11or17+(可以使用idea进行下载安装)GraalVMCEGluon22.1.0.1-Fi......
  • [昌哥IT课堂]使用MySQL Shell 部署沙盒数据库实例详解
     概述:这部分解释了如何使用AdminAPI设置沙盒部署。部署和使用本地MySQL的沙盒实例是开始探索AdminAPI的好方法。在将功能部署到生产服务器之前,您可以在本地测试功能。AdminAPI具有内置功能,用于创建正确配置的沙箱实例,以便在本地部署的情况下与InnoDBCluster、InnoDBClusterS......