目录

  • pcl介绍
  • 工程创建与测试
    • CMakeLists.txt内容解释

pcl介绍

对于3D点云处理来说,PCL完全是一个模块化的现代C++模板库。其基于以下第三方库:Boost、Eigen、FLANN、VTK、CUDA、OpenNI,QHull,实现点云相关的获取、滤波、分割、配准、检索、特征提取、识别、追踪﹑曲面重建、可视化等。
PCL利用OpenMP,GPU,CUDA等先进高性能计算技术,通过并行化提高程序实时性。K近邻搜索操作的构架是基于FLANN (FastLibrary for ApproximateNearestNeighbors)所实现的,速度也是目前技术中最快的。PCL中的所有模块和算法都是通过Boost共享指针来传送数据,因而避免了多次复制系统中已存在的数据的需要,从0.6版本开始,PCL就已经被移入到Windows,MacOS和 Linux系统,并且在Android系统也已经开始投人使用,这使得 PCL的应用容易移植与多方发布。
从算法的角度,PCL是指纳入了多种操作点云数据的三维处理算法,其中包括过滤、特征估计、表面重建,模型拟合和分割、定位搜索等。每一套算法都是通过基类进行划分的,试图把贯穿整个流水线处理技术的所有常见功能整合在一起,从而保持了整个算法实现过程中的紧凑和结构清晰,提高代码的重用性,简洁可读。在 PCL中一个处理管道的基本接口程序如下:
(1)创建处理对象:(例如过滤﹑特征估计、分割等)。
(2)使用setInputCloud通过输入点云数据,处理模块。
(3)设置算法相关参数。
(4)调用计算(或过滤﹑分割等)得到输出。
为了进一步简化和开发,PCL被分成一系列较小的代码库,使其模块化,以便能够单独编译使用提高可配置性,特别适用于嵌入式处理中:
(1) libpcl filters:如采样、去除离群点﹑特征提取、拟合估计等数据实现过滤器。
(2) libpcl features :实现多种三维特征,如曲面法线﹑曲率、边界点估计、矩不变量、主曲率,PFH和FPFH 特征,旋转图像﹑积分图像,NARF描述子,RIFT,相对标准偏差,数据强度的筛选等。
(3) libpcl I/O:实现数据的输人和输出操作,例如点云数据文件(PCD)的读/写。
(4) libpcl segmentation:实现聚类提取,如通过采样一致性方法对一系列参数模型(如平面,柱面,球面、直线等)进行模型拟合点云分割提取,提取多边形棱镜内部点云等。
(5) libpcl surface:实现表面重建技术,如网格重建、凸包重建、移动最小二乘法平滑等。
(6) libpcl register:实现点云配准方法,如ICP等。
(7) libpclkeypoints :实现不同的关键点的提取方法,这可以用来作为预处理步骤,决定在哪儿提取特征描述符。
(8) libpcl range :实现支持不同点云数据集生成的范围图像。

pcl官方、linux教程

工程创建与测试

pcl_test.cpp

#include <iostream>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/console/parse.h>int main(int argc, char **argv) {std::cout << "Test PCL !!!" << std::endl;pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);uint8_t r(255), g(15), b(15);for (float z(-1.0); z <= 1.0; z += 0.05){for (float angle(0.0); angle <= 360.0; angle += 5.0){pcl::PointXYZRGB point;point.x = 0.5 * cosf (pcl::deg2rad(angle));point.y = sinf (pcl::deg2rad(angle));point.z = z;uint32_t rgb = (static_cast<uint32_t>(r) << 16 |static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));point.rgb = *reinterpret_cast<float*>(&rgb);point_cloud_ptr->points.push_back (point);}if (z < 0.0){r -= 12;g += 12;}else{g -= 12;b += 12;}}point_cloud_ptr->width = (int) point_cloud_ptr->points.size ();point_cloud_ptr->height = 1;pcl::visualization::CloudViewer viewer ("test");viewer.showCloud(point_cloud_ptr);while (!viewer.wasStopped()){ };return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.6)
project(pcl_test)find_package(PCL 1.2 REQUIRED)include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})add_executable(pcl_test pcl_test.cpp)target_link_libraries (pcl_test ${PCL_LIBRARIES})

将上述两个测试文件复制到下面目录结构下,并新建一个build文件夹:

cd build
cmake ..
make
./pcl_test

执行结果:

CMakeLists.txt内容解释

cmake_minimum_required(VERSION 2.6)

这是对CMake版本的最低要求,由于做的是非常基础的工程,不需要CMake 2.8或者更高版本中的功能。

project(pcl_test)

这一行为工程命名,同时CMake会自动产生一些有用的CMake变量,例如源代码目录路径变量名为(pcl_test),这些都是CMake在内部根据上面定义的工程名称自动生成的,不需要用户定义,而用户只需要利用project(XX)宏即可引发其他变量的内部定义。

find_package(PCL 1.2 REQUIRED)

这行要求该工程依赖PCL最低1.2的版本,即在CMake配置生成工程文件时,必须找到符合要求的PCL库相关模型所在的库和头文件路径,这里的REQUIRED意味着如果对应的库不能找到,则CMake配置过程将完全失败,因为PCL是模块化的,也可以作如下的要求:

一个组件:find_package(PCL1.3 REQUIRED COMPONENTS io)
多个组件:find_package(PCL1.3 REQUIRED COMPONENTS io common) ,该版本需要至少包含common和I/О两个模块
所有组件:find_package(PCL 1.3 REQUIRED)

下面语句是利用CMake的宏完成对PCL的头文件路径和链接路径变量的配置和添加,即如果缺省下面几句,在生成的过程文件编译时会提示找不到相关头文件错误,或者在链接的时候出现无法解析的外部符号等错误提示。

include_directories($ {PCL_INCLUDE_DIRS})
link_directories($ {PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
在配置CMake时,当CMake找到了安装的PCL,下面相关的包含文件.链接库路径变量等就会自动设置:

PCL_FOUND:如果找到了PCL,被设置为1,否则不设置。
PCL_INCLUDE_DIRS:被设置成PCL安装头文件和依赖头文件的目录。
PCL_LIBRARIES:被设置成所建立和安装的PCL库的文件名。
PCL_LIBRARY_DIRS:被设置成PCL库和第三方依赖文件所在的目录。
PCL_VERSION:所找到的PCL的版本。
PCL_COMPONENTS:列出所有可用组件。
PCL_DEFINITIONS:列出所需要的预处理器定义和编译器标志。

为了让CMake知道包含到自己工程中的外部头文件,需要使用include_directo-ries()宏,在实例中为PCL_INCLUDE_DIRS,精确地包含了我们所需要的PCL相关的头文件,因此CMake 会自动根据找到的PCL安装目录自动搜索PCL所有可能包含的目录。

add_executable(pcl_test pcl_test.cpp)

该句告诉CMake,我们正试图从单个源文件pcl_test.cpp来新建一个名为pcl_test的可执行文件,CMake会注意到后缀(在
Windows平台上为.exe,在UNIX平台上为空)和权限。

target_link_libraries (pcl_test ${PCL_LIBRARIES})

到目前为止,我们仅仅包含了PCL头文件,因此编译器知道我们现在访问所用的方法,我们也需要让链接器知道我们所链接的库,PCL找到库文件由PCL_LI-BRARIES变量指示,剩下的是通过访问target_link_libraries()这个宏来触发链接操作。

PCL——1.介绍及工程创建与测试相关推荐

  1. U-Boot源码目录分析(VScode工程创建及文件夹过滤)

    参考:U-Boot工程目录介绍 作者:一只青木呀 发布时间: 2020-10-21 14:47:30 网址:https://blog.csdn.net/weixin_45309916/article/ ...

  2. 头条项目---01项目介绍和工程搭建

    第一章 项目介绍和工程搭建 学习目标 熟悉移动端应用系统的架构设计 熟悉大型软件系统设计中的各种图形结构 熟悉数据库分库分表设计技巧 熟悉Spring boot2.0+JavaConfig项目封装配置 ...

  3. Java在线教育项目 第一天项目介绍和工程搭建

    第一章 项目介绍和工程搭建 学习目标 熟悉移动端应用系统的架构设计 熟悉大型软件系统设计中的各种图形结构 熟悉数据库分库分表设计技巧 熟悉Spring boot2.0+JavaConfig项目封装配置 ...

  4. 162. Python语言 的 Flask框架项目 之 项目准备 第三章 :工程创建和配置

    工程创建和配置 本章主题 关键词 准备工作 测试创建 Flask 工程 项目配置文件创建 配置开发环境 config.py 文件 新建配置文件 确认需要配置哪些信息 配置 MySQL 数据库 安装所需 ...

  5. maven配置与IDEA工程创建

    Maven 第1章 Maven概述 1.1 Maven的概念 Maven是项目进行模型抽象,充分运用的面向对象的思想,Maven可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具.M ...

  6. Android官方开发文档Training系列课程中文版:构建第一款安卓应用之工程创建

    这节课你将会学到: - 使用Android Studio创建一个工程. - 使用命令行工具创建一个工程. 你也应该阅读: - 安装SDK - 管理工程 安卓项目包含了包括源代码在内的所有文件.Andr ...

  7. idea maven 删除dependencies_使用IDEA创建Maven工程 创建javase工程

    5. 使用IDEA创建Maven工程 - 创建javase工程 1.目标 能够使用IDEA创建javase的Maven工程 2.路径 创建java工程 java工程目录结构 编写Hello World ...

  8. 微信小程序(微信开发者工具及工程创建、小程序配置、逻辑层、模块化)

    一.阶段概述 1.课程安排 课程市场:14+1 课程安排:微信小程序:5uniapp:5数据可视化:4答辩:1 2.项目展示 小u商城 数据可视化 3.阶段目标 1.培养学员能力独立完成小程序原生开发 ...

  9. Jmeter基本使用到精通(一)从安装第一个任务线程的创建及测试

    (一)jemter介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态和动态资源的性能,例如:静态文件, ...

最新文章

  1. luogu P4085 [USACO17DEC]Haybale Feast(尺取法 + 线段树)
  2. [LeetCode] Count Primes
  3. 红黑树二叉查找树二叉排序树的理解
  4. 一个vue管理系统的初步搭建总结
  5. RabbitMQ学习(七)_RabbitMQ Consumer获取消息的两种方式(poll,subscribe)解析
  6. oracle中行数少于1000,oracle中in的个数超过1000的解决办法
  7. Java 并发总结——进程与线程
  8. 黑马day16 jqueryamp;属性过滤选择器
  9. 面向对象软件设计原则(一) —— 引子
  10. 哈佛博士主导的一桩勒索病毒离奇历史
  11. average diffusion distance
  12. html 转换 pdf 工具
  13. 1.供给与需求分析(交通流理论)
  14. 刷脸支付会逐步取代扫码成为主流支付方式
  15. 钢笔与矢量形状—文字路径制作印章效果
  16. TX4223芯鼎盛PWM开关型DC-DC转换驱动器DCDC升压恒压芯片开关电源IC
  17. java魂斗罗_向经典致敬--跟我用Java写魂斗罗
  18. 小米笔记本 wifi linux,被小米笔记本的WiFi坑了一道
  19. 一、Chrome浏览器调试工具/文档
  20. java 文件读取中文乱码_java文件读取时发生中文乱码怎么解决

热门文章

  1. 定点数和浮点数_Simulink模型中定点数的介绍
  2. beetl调用java方法_08.自定义方法以及直接访问java类方法---《Beetl视频课程》
  3. 软件工程导论 01章软件工程学概述
  4. LeetCode:62. 不同路径(python、c++)
  5. 2018: 跑图(深搜)
  6. B - Frogger(最短路之多条最短路径中最大权值的最小值)
  7. E - Tautology(永真式)
  8. 牛客小白月赛——G题
  9. 实验3.1 定义一个CPU类,观察构造函数和析构函数的调用顺序
  10. Numpy中出现“ValueError: zero-size array to reduction operation maximum which has no identity”错误的调试笔记