第一周PCL学习

第一周 PCL学习

一、PCL介绍
PCL(Point Cloud Library)是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源c++编程库,它实现了大扯点云相关的通用算法和高效数据结构,涉及点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等,支持多种操作系统平台,可在Windows、Linux、Android、MacOS X、部分嵌入式实时系统上运行。如果说OpenCV是2D信息获取与处理的结晶,那么PCL就在3D信息获取与处理上具有同等地位,PCL是BSD授权方式,可以免费进行商业和学术应用。

简单的来说 PCL有利于三维模型的处理。
1.1 PCL框架介绍
    如图PCL架构图所示,对于3D点云处理来说,PCL完全是一个的模块化的现代C++模板库。其基于以下第三方库:Boost、Eigen、FLANN、VTK、CUDA、OpenNI、Qhull,实现点云相关的获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。
    PCL利用OpenMP、GPU、CUDA等先进高性能计算技术,通过并行化提高程序实时性。K近邻搜索操作的构架是基于FLANN (Fast Library for Approximate Nearest Neighbors)所实现的,速度也是技术中最快的。PCL中的所有模块和算法都是通过Boost共享指针来传送数据的,因而避免了多次复制系统中已存在的数据的需要,从0.6版本开始,PCL就已经被移入到Windows,MacOS和Linux系统,并且在Android系统也已经开始投入使用,这使得PCL的应用容易移植与多方发布。

在这里插入图片描述

Boost介绍
其是一个C++可以移植的、开源的C++库
https://baike.baidu.com/item/Boost/69144

Eigen
Eigen是一个高层次的C ++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法。Eigen是一个开源库,从3.1.1版本开始遵从MPL2许可。
https://blog.csdn.net/fengbingchun/article/details/47378515

FLANN
FLANN(Fast Library for Approximate Nearest Neighbors)是一个执行快速近似最近邻搜索的库。FLANN使用C++写成。他能够很容易地通过C,MTALAB和Python等绑定提供的库,用在很多环境中。
https://blog.csdn.net/Linux_bin/article/details/82586343

VTK
可视化工具包(Visualization Toolkit, VTK)是一个开源、跨平台、可自由获取、支持并行处理的图形应用函数库。
 
 VTK包含一个C++类库,众多的编程语言接口,包括Tcl/Tk、Java、Python,在三维函数库OpnGL的基础上采用面向对象的设计方法发展起来的,将可视化开发过程中会经常遇到的细节屏蔽起来,并封装了一些常用的算法。
 
 基本概念和数据结构是最重要的基础,可视化管线是实现数据到显示结果的组织形式,是VTK中的核心概念
https://blog.51cto.com/11496263/1825917

CUDA
CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的运算平台。 CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。 开发人员可以使用C语言来为CUDA™架构编写程序,C语言是应用最广泛的一种高级编程语言。所编写出的程序可以在支持CUDA™的处理器上以超高性能运行。CUDA3.0已经开始支持C++和FORTRAN。

*** GPU与CUDA***
https://blog.csdn.net/u014380165/article/details/77340765

OpenNI
OpenNI(开放自然交互)是一个多语言,跨平台的框架,它定义了编写应用程序,并利用其自然交互的API。OpenNI API由一组可用来编写通用自然交互应用的接口组成。OpenNI的主要目的是要形成一个标准的API,来搭建视觉和音频传感器与视觉和音频感知中间件通信的桥梁。
https://blog.csdn.net/u013207865/article/details/50458019

Qhull
QHull是一个开源的程序软件,用来研究解决凸包问题,生成凸包形体。
QHull计算凸包,Delaunay三角网格,Voronoi图,点halfspaceintersection,furthest-site Delaunay三角网格,furthest-siteVoronoi图。

Qhull的使用
https://www.jianshu.com/p/f7b80b4a2f4e

OpenMP
OpenMP是一个跨平台的多线程实现,主线程(顺序的执行指令)生成一系列的子线程,并将任务划分给这些子线程进行执行。这些子线程并行的运行,由运行时环境将线程分配给不同的处理器。
具体介绍:
https://zh.wikipedia.org/wiki/OpenMP

    从算法的角度,PCL是指纳入了多种操作点云数据的三维处理算法,其中包括:过滤,特征估计,表面重建,模型拟合和分割,定位搜索等。每一套算法都是通过基类进行划分的,试图把贯穿整个流水线处理技术的所有常见功能整合在一起,从而保持了整个算法实现过程中的紧凑和结构清晰,提高代码的重用性、简洁可读。
    在PCL中一个处理管道的基本接口程序是:
    1、创建处理对象:(例如过滤、特征估计、分割等);
    2、使用setInputCloud通过输入点云数据,处理模块;
    3、设置算法相关参数;调用计算(或过滤、分割等)得到输出。
    为了进一步简化和开发,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中操作的正确性,上述提到的库中的方法和类包含了单位和回归测试。这套单元测试通常都是由专门的构建部门按需求编译和验证的。当某一部分测试失败时,这些特定部分的各自作者就会立即被告知。这彻底地保证了代码测试过程出现的任何变故,以及新功能或修改都不会破坏PCL中已经存在的代码。
二、PCL安装和cmake介绍

cmake简介和使用
https://www.jianshu.com/p/c042abb42133

CmakeLists的规则
http://www.pclcn.org/bbs/forum.php?mod=viewthread&tid=491

MinGW-w64安装教程——著名C/C++编译器GCC的
这里一定要记得安装MinGW64,安装mingw32会无法使用cmake -G “MinGW Makefiles” . 进行编译,我一开始安装了mingw32,浪费了好长时间才发现只有安装mingw64才可以
https://www.jianshu.com/p/d66c2f2e3537

MINGW简单使用
第一步:编写hello.cpp
在这里插入图片描述
第二步:编写CmakeLists.txt
在这里插入图片描述
第三步:在当前文件下,在命令行编译,输入cmake -G “MinGW Makefiles” . (这个点代表当前文件下)
在这里插入图片描述
会生成一个Makefile文件,下一步使用make命令进行生成exe文件
在这里插入图片描述
第四步:使用mingw32-make命令运行
在这里插入图片描述
现在已经编译生成了exe文件
在这里插入图片描述
第五步:在命令行运行这个exe文件
在这里插入图片描述

存在问题:现在可以熟练使用这些命令,得到exe文件,但是用cmake运行pcl的代码会报错,找到了问题所在,可是还查不到解决的办法。如下图所示。

在这里插入图片描述

三、PCL的读写pcd文件

pcl::PointCloud<pcl::PointXYZ> : PointCloud为点云定义,pcl::PointXYZ为点云数据类型,代表XYZ代表空间中的x、y、z坐标

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);这是声明的数据类型,用来存储我们打开的点云数据格式,是共享指针类型

PointCloud类型介绍https://blog.csdn.net/u013925378/article/details/83541247

pcl::io::savaPCDFileASCII(“文件名”,点云); 把点云数据存取到文件名中,文件名是".pcd"格式

# pcd_write.cpp
#include<iostream>
#include<pcl/io/pcd_io.h>
#include<pcl/point_types.h>

using namespace std;


int 
main() {
       // 定义点云
       pcl::PointCloud<pcl::PointXYZ> cloud;
       // 创建点云
       cloud.width = 5;
       cloud.height = 3;
       cloud.is_dense = false;
       cloud.points.resize(cloud.width * cloud.height);
       // 赋值
       for (size_t i = 0; i < cloud.size(); i++) {
               cloud.points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
               cloud.points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
               cloud.points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
       }
       // 把点云保存到pcd文件中
       pcl::io::savePCDFileASCII("test.pcd", cloud);
       // 输出
       std::cerr << "Saved " << cloud.points.size() << " data points to test_pcd.pcd." 
<< std::endl;
       for (size_t i = 0; i < cloud.points.size(); ++i)
               std::cerr << "    " << cloud.points[i].x << " " << cloud.points[i].y << " 
" << cloud.points[i].z << std::endl;

      return(0);
}

在这里插入图片描述在这里插入图片描述

pcl/visualization为可视化工具
pcl::visualization::PCLVisualizer viewer创建视图
viewer.setBackgroundColor(r,g,b)设置视图背景颜色
viewer.addSphere(o,r,“Sphere”,0):o为PointXYZ数据类型,代表球心,r为球的半径,0代表第一个viewpoint

pcl::io::loadPCDFile():读取pcd文件
viewer.showCloud(cloud); 把读取后的点云数据进行可视化

#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h
#include <pcl/io/pcd_io.h>

int user_data;
void
viewerOneOff(pcl::visualization::PCLVisualizer& viewer)
{
       viewer.setBackgroundColor(1.0f, 0.5f, 1.0f);  // 设置视图背景颜色,三个参数是rgb
       pcl::PointXYZ o;  // 球心
       o.x = 1.0;
       o.y = 0;
       o.z = 0;
       viewer.addSphere(o, 0.25, "Sphere", 0);  // 半径0.25
       std::cout << "I only run once" << std::endl;
}

/*
下面函数是作为回调函数,在主函数中注册后每帧显示都执行一次,函数具体实现在可视化对象中添加一个刷新显示字符串。
*/
void
viewerPsycho(pcl::visualization::PCLVisualizer& viewer)
{
       static unsigned count = 0;
       std::stringstream ss;  // 字符串
       ss << "Once per viewer loop: " << count++;
       viewer.removeShape("text", 0);
       viewer.addText(ss.str(), 200, 300, "text", 0);  //更新字符串     
       user_data++;
}


int
main()
{
       pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new 
pcl::PointCloud<pcl::PointXYZRGBA>);
       pcl::io::loadPCDFile("pcd/maize.pcd", *cloud);  // 加载点云
       pcl::visualization::CloudViewer viewer("Cloud Viewer");  // 创建viewer对象
       //showCloud 函数是同步的,在此处等待直到渲染显示为止
       viewer.showCloud(cloud);
       //该注册函数在可视化时只调用一次
       viewer.runOnVisualizationThreadOnce(viewerOneOff);
       //该注册函数在渲染输出是每次都调用
       viewer.runOnVisualizationThread(viewerPsycho);
       while (!viewer.wasStopped())
       {
               //在此处可以添加其他处理
               user_data++;
       }
       return 0;
}

运行结果
在这里插入图片描述

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值