一、概述
如何看懂pcl官方接口文档依赖于有良好的C++变成基础,能够通过接口问题中的阐述就明白这个类、结构或者是函数定义的功能,作者的意图。能够极大提高读者的阅读效率以及开发效率。
另外,我们对一个开源库的学习和理解不是说通过一段时间的学习就达到百分百理解,通过框架性的学习,掌握使用的方法、门路,然后在后续的使用和实践过程中,不断深入理解,技能更加熟练,学习是一个过程。
二、阅读指引
官方开发文档:Point Cloud Library (PCL): PCL API Documentation
1、目录结构
2、PCL模块指引
举common模块为例,可以看到common并不依赖于其他模块,因此如果项目需要,能够单独将common模块拿出来进行编译。
pcl_common库包含大多数PCL库使用的通用数据结构和方法。核心数据结构包括PointCloud类和大量用于表示点、表面法线、RGB颜色值、特征描述符等的点类型。它还包含许多用于计算距离/规范、平均值和协方差、角转换、几何转换等的函数。
3、Class类
定义了PCL中点的类型以及点云特征描述子
-
点云结构
以下是点云库中已经定义好的点云的形式
struct pcl::PointXYZ
表示Euclidean xyz坐标的点集结构类型
struct pcl::Intensity
表示单通道图像灰度强度的点集结构类型
struct pcl::Intensity8u
一种表示单通道图像灰度强度的点集结构类型
struct pcl::Intensity32u
表示单通道图像灰度强度的点集结构类型
struct pcl::_PointXYZI
表示欧氏XYZ坐标的点集结构和强度值
struct pcl::PointXYZRGBA
表示欧氏XYZ坐标和RGBA颜色的点集结构类型
struct pcl::PointXYZRGB
表示欧氏XYZ坐标和RGB颜色的点集结构类型struct
pcl::PointXY
表示Euclidean xy坐标的二维点集结构类型
struct pcl::PointUV
表示像素图像坐标的2D点集结构类型
struct pcl::InterestPoint
表示具有欧几里德xyz坐标和兴趣值的点集结构类型
给个例子关于这个特殊的类型:
pcl::visualization::RangeImageVisualizer*
pcl::visualization::RangeImageVisualizer::getInterestPointsWidget (
const pcl::RangeImage& range_image, const float* interest_image, float min_value, float max_value,
const pcl::PointCloudpcl::InterestPoint& interest_points, const std::string& name)
{
RangeImageVisualizer* widget = new RangeImageVisualizer;
widget->showFloatImage (interest_image, range_image.width, range_image.height, min_value, max_value);
widget->setWindowTitle (name);
for (unsigned int i=0; i
{
const pcl::InterestPoint& interest_point = interest_points.points[i];
float image_x, image_y;
range_image.getImagePoint (interest_point.x, interest_point.y, interest_point.z, image_x, image_y);
widget->markPoint (static_cast (image_x), static_cast (image_y), green_color, red_color);
}
return widget;
}
struct pcl::Normal
表示法向量坐标和曲面曲率估计的点集结构类型
struct pcl::Axis
用法向量坐标表示轴的点集结构
struct pcl::PointNormal
表示欧几里德xyz坐标的点集结构,连同法线坐标和表面曲率估计值
struct pcl::PointXYZRGBNormal
表示欧几里德xyz坐标和RGB颜色的点集结构,以及法线坐标和表面曲率估计.
struct pcl::PointXYZINormal
表示欧几里德xyz坐标,强度,连同法线坐标和表面曲率估计的点集结构类型。
struct pcl::PointXYZLNormal
表示欧几里得xyz坐标,一个标签,法线坐标和表面曲率估计的点集结构类型
struct pcl::PointWithRange
表示欧几里德XYZ坐标的点集结构,并连同的浮点数的深度信息
struct pcl::PointWithViewpoint
表示欧几里得xyz坐标的点集结构以及的视点的点集结构
struct pcl::MomentInvariants
表示三个矩是不变量的点集结构类型
struct pcl::PrincipalRadiiRSD
表示使用RSD计算的最小和最大表面半径(以米为单位)的点集结构类型
struct pcl::Boundary
表示点是否位于表面边界的点集结构
struct pcl::PrincipalCurvatures
表示主曲率及其幅值的点集结构
-
点云描述子
以下是一些三维特征点描述子的点集结构,其中每个描述子都是一篇论文,希望有兴趣的小伙伴加入我们,每个人分析解释一种描述子的由来以及理论研究。
struct pcl::PFHSignature125
表示点云的特征直方图(PFH)的点集结构类型
struct pcl::PFHRGBSignature250
表示颜色特征点特征直方图的点结构(PFHGB)
struct pcl::PPFSignature
用于存储点对特征(PPF)值的点集结构
struct pcl::CPPFSignature
用于存储点对特征(CPPP)值的点集结构
struct pcl::PPFRGBSignature
用于存储点对颜色特征(PPFRGB)值的点集结构
struct pcl::NormalBasedSignature12
表示4-By3的特征矩阵的基于正常的签名的点结构
struct pcl::ShapeContext1980
表示形状上下文的点结构
struct pcl::UniqueShapeContext1960
表示唯一形状上下文的点结构
struct pcl::SHOT352
表示OrienTations直方图(SHOT)的通用标签形状的点集结构
struct pcl::SHOT1344
一种点结构,表示OrienTations直方图(SHOT)的通用签名-形状+颜色。
struct pcl::_ReferenceFrame
表示点的局部参照系的结构
struct pcl::FPFHSignature33
表示快速点特征直方图(FPFH)的点结构
struct pcl::VFHSignature308
表示视点特征直方图(VFH)的点结构
struct pcl::GRSDSignature21
表示全局半径的表面描述符(GRSD)的点结构。
struct pcl::BRISKSignature512
表示二进制鲁棒不变可缩放关键点(BRISK)的点结构。
struct pcl::ESFSignature640
表示形状函数集合的点结构(ESF)
struct pcl::GASDSignature512
表示全局对准的空间分布(GASD)形状描述符的点结构
struct pcl::GASDSignature984
表示全局对齐空间分布(GASD)形状和颜色描述符的点结构
struct pcl::GASDSignature7992
表示全局对齐空间分布(GASD)形状和颜色描述符的点结构
struct pcl::GFPFHSignature16
表示具有16个容器的GFPFH描述符的点结构。
struct pcl::Narf36
表示NARF描述符的点结构
struct pcl::BorderDescription
用于存储距离图像中的点位于障碍物和背景之间的边界上的结构
struct pcl::IntensityGradient
表示Xyz点云强度梯度的点结构
struct pcl::Histogram< N >
表示N-D直方图的点结构
struct pcl::PointWithScale
表示三维位置和尺度的点结构
struct pcl::PointSurfel
曲面,即表示欧几里德xyz坐标的点结构,连同法向坐标、RGBA颜色、半径、置信值和表面曲率估计。
struct pcl::PointDEM
表示数字高程图的点结构 Digital Elevation Map. ..
class pcl::PCLBase< PointT >
PCL的基类
struct pcl::GradientXY
表示欧氏XYZ坐标的点结构和强度值
4、相关文件
- angles.h 定义了标准的C接口的角度计算函数
- centriod.h 定义了中心点的估算以及协方差矩阵的计算
- commo.h 标准的C以及C++类,是其他common 函数的父类
- distance.h 定义标准的C接口用于计算距离
- file_io.h 定义了一些文件帮助写或者读方面的功能。
- random.h 定义一些随机点云生成的函数
- geometry.h 定义一些基本的几何功能的函数
- intersection.h 定义线与线相交的函数
- norm.h 定义了标准的C方法计算矩阵的正则化
- time.h 定义了时间计算的函数
- Point_types.h 定义了所有PCL实现的点云的数据结构的类型
4、宏定义
宏定义的作用见3.1 5、枚举定义
pcl::BorderTrait
是Point Cloud Library (PCL)中的一个枚举类型,主要用于描述点云数据中的点相对于边界的特征。在点云处理中,特别是在提取边缘和轮廓时,了解点的边界特性是非常重要的。pcl::BorderTrait
枚举为每个点提供了一种标记,指示它在边界中的角色,通常与边缘检测算法和边界特性提取结合使用。
例子:
#include <pcl/point_types.h>
#include <pcl/features/border_estimation.h>
int main() {
// 创建一个点云对象
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
// 填充点云数据 (示例中略)
// 创建一个点云边界特性估计对象
pcl::BorderEstimation<pcl::PointXYZ, pcl::PointXYZ, pcl::Label> border_estimation;
border_estimation.setInputCloud(cloud);
// 创建结果点云和标签对象
pcl::PointCloud<pcl::Label>::Ptr labels(new pcl::PointCloud<pcl::Label>);
// 设置半径搜索参数(根据需要调整)
border_estimation.setRadiusSearch(0.01);
// 计算边界特性
border_estimation.compute(*labels);
// 遍历所有点,输出其边界特性
for (size_t i = 0; i < labels->size(); ++i) {
pcl::Label label = labels->points[i];
switch (label.label) {
case pcl::BORDER_TRAIT_UNDEF:
std::cout << "Point " << i << " is UNDEFINED" << std::endl;
break;
case pcl::BORDER_TRAIT_BORDER:
std::cout << "Point " << i << " is a BORDER point" << std::endl;
break;
case pcl::BORDER_TRAIT_VP_BORDER:
std::cout << "Point " << i << " is a VIEWPOINT BORDER point" << std::endl;
break;
case pcl::BORDER_TRAIT_SURFACE:
std::cout << "Point " << i << " is a SURFACE point" << std::endl;
break;
default:
std::cout << "Point " << i << " has an unknown trait" << std::endl;
break;
}
}
return 0;
}
6、其他枚举
7、函数定义
详细内容见:点云处理中阶 common模块-CSDN博客
三、编程知识点
3.1 宏定义
在C++编程中,#define
是一个预处理指令,用于定义宏。宏是一种在编译时进行文本替换的机制,可以用于定义常量、简单的函数、代码片段等。#define
的主要作用包括:
-
定义常量:
#define
常用于定义常量值,避免在代码中多次出现相同的字面值,从而增强可读性和维护性。例如:#define PI 3.14159
-
定义宏函数:宏函数是通过
#define
定义的一种简单的函数替代形式。宏函数在调用时进行文本替换,避免了函数调用的开销,但缺点是缺乏类型检查。例如:#define SQUARE(x) ((x) * (x))
-
条件编译:
#define
可以与预处理指令#ifdef
、#ifndef
、#if
、#else
、#elif
和#endif
结合使用,控制代码的编译。例如:#define DEBUG #ifdef DEBUG #include <iostream> #define LOG(x) std::cout << x << std::endl #else #define LOG(x) #endif
-
防止重复包含:在头文件中使用
#define
可以防止文件被多次包含,避免重复定义。这通常使用头文件保护符实现:#ifndef MY_HEADER_H #define MY_HEADER_H // 头文件内容 #endif // MY_HEADER_H