点云处理中阶 如何使用官方接口文档

一、概述

      如何看懂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、相关文件

  1. angles.h 定义了标准的C接口的角度计算函数
  2. centriod.h 定义了中心点的估算以及协方差矩阵的计算
  3. commo.h 标准的C以及C++类,是其他common 函数的父类
  4. distance.h 定义标准的C接口用于计算距离
  5. file_io.h 定义了一些文件帮助写或者读方面的功能。
  6. random.h 定义一些随机点云生成的函数
  7. geometry.h 定义一些基本的几何功能的函数
  8. intersection.h 定义线与线相交的函数
  9. norm.h 定义了标准的C方法计算矩阵的正则化
  10. time.h 定义了时间计算的函数
  11. 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的主要作用包括:

  1. 定义常量#define常用于定义常量值,避免在代码中多次出现相同的字面值,从而增强可读性和维护性。例如:

    #define PI 3.14159
  2. 定义宏函数:宏函数是通过#define定义的一种简单的函数替代形式。宏函数在调用时进行文本替换,避免了函数调用的开销,但缺点是缺乏类型检查。例如:

    #define SQUARE(x) ((x) * (x))

  3. 条件编译#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
    
  4. 防止重复包含:在头文件中使用#define可以防止文件被多次包含,避免重复定义。这通常使用头文件保护符实现: 

    #ifndef MY_HEADER_H
    #define MY_HEADER_H
    
    // 头文件内容
    
    #endif // MY_HEADER_H
    

  • 25
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值