PCL学习笔记(三):PCL的点类型

数据类型

基础类

    pcl::PointCloud
        pcl::PointCloud::width:点云宽度
        pcl::PointCloud::height:点云高度
        pcl::PointCloud::points:点云中包含的点
        pcl:`PointCloud<pcl::PointCloud::isOrganized:点云有无组织

//有组织点
cloud.width = 640; // Image-like organized structure, with 480 rows and 640 columns,
cloud.height = 480; // thus 640*480=307200 points total in the dataset

//无组织点
cloud.width = 307200;
cloud.height = 1; // unorganized point cloud dataset with 307200 points

//点云数组向量
pcl::PointCloud<pcl::PointXYZ> cloud;
std::vector<pcl::PointXYZ> data = cloud.points;

判断组织
if (!cloud.isOrganized ())
  ...

 

模板类型

对于模板类型,只需要熟悉大概有什么类型可用,使用时翻阅文档就可以了。

使用中会发现类型中通常包含一个用于SSE对齐的数据,感兴趣可以简单了解一下,Sreaming SIMD Extensions, 它是一组CPU指令,用于像信号处理、科学计算或者3D图形计算一样的应用,但是SSE对于数据是有很多种格式要求的,其中就有对齐这一点,所以就有了这一部分的操作

    PointXYZ - Members: float x, y, z
    最常用的数据类型之一,只表示3D xyz信息。这3个浮点数用一个附加浮点数进行填充,以进行SSE对齐。用户可以访问点[i].data[0]或点[i].x

    union
    {
     float data[4];
      struct
      {
       float x;
       float y;
       float z;
      };
    };



    PointXYZI - Members: float x, y, z, intensity
    XYZ+强度类型。在理想情况下,这4部分将创建一个单一的结构,SSE对齐。但是,由于大多数点操作会将data[4]数组的第四部分设置为0或1(用于转换),因此不能将intensity设置为同一结构的成员,因为它的内容将被覆盖。例如,两点之间的点积将其第四个分量设置为0,否则点积就没有意义,等等。
    因此,对于SSE对齐,我们使用3个额外的浮动来填充强度。在存储方面效率低,但在内存对齐方面很好。

    union
    {
      float data[4];
      struct
      {
       float x;
       float y;
       float z;
      };
    };
    union
    {
     struct
      {
        float intensity;
      };
      float data_c[4];
    };

 


    PointXYZRGBA - Members: float x, y, z; std::uint32_t rgba
    与PointXYZI类似,除了rgba包含打包成无符号32位整数的rgba信息外。由于联合声明,还可以按名称单独访问颜色通道。

    union
    {
     float data[4];
     struct
      {
       float x;
       float y;
       float z;
      };
    };
    union
    {
      union
      {
        struct
        {
          std::uint8_t b;
          std::uint8_t g;
          std::uint8_t r;
         std::uint8_t a;
        };
        float rgb;
      };
    std::uint32_t rgba;
    };

 


    PointXYZRGB - float x, y, z; std::uint32_t rgba    与PointXYZRGBA相同

    PointXY - *float x, y

    InterestPoint - float x, y, z, strength
    与PointXYZI类似,除了强度包含关键点强度的度量

    Normal - float normal[3], curvature
    最常用之一,表示给定点处的曲面法向,以及曲率的度量

    PointNormal - float x, y, z; float normal[3], curvature
    保存XYZ数据、曲面法线和曲率的点结构。

    PointXYZRGBNormal - float x, y, z, normal[3], curvature; std::uint32_t rgba
    保存XYZ数据、RGBA颜色以及曲面法线和曲率的点结构。

    PointXYZINormal - float x, y, z, intensity, normal[3], curvature
    保存XYZ数据和强度值以及曲面法线和曲率的点结构。

    PointWithRange - float x, y, z (union with float point[4]), range
    与PointXYZI类似,除了range包含从获取视点到世界上的点的距离的度量。

    PointWithViewpoint - float x, y, z, vp_x, vp_y, vp_z
    与点xyzi类似,除了vp_x、vp_y和vp_z包含作为3D点的采集视点

    MomentInvariants - float j1, j2, j3
    在曲面片上保持3个不变矩的简单点类型。

    PrincipalRadiiRSD - float r_min, r_max
    在曲面片上保持2 RSD半径的简单点类型

    Boundary - std::uint8_t boundary_point
    简单点类型,用于保存点是否位于曲面边界上

    PrincipalCurvatures -* float principal_curvature[3], pc1, pc2*
    保持给定点的主曲率的简单点类型。

    PFHSignature125 - float pfh[125]
    包含给定点的PFH(点特征直方图)的简单点类型。

    FPFHSignature33 - float fpfh[33]
    包含给定点的FPFH(快速点特征直方图)的简单点类型

    VFHSignature308 - float vfh[308]
    包含给定点的VFH(视点特征直方图)的简单点类型

    Narf36 - float x, y, z, roll, pitch, yaw; float descriptor[36]
    保持给定点的NARF(通常对齐的半径特征)的简单点类型

    BorderDescription - int x, y; BorderTraits traits
    保存给定点的边界类型的简单点类型

    IntensityGradient -* float gradient[3]*
    保持给定点的强度梯度的简单点类型

    Histogram - float histogram[N]
    通用n-D直方图占位符

    PointWithScale - float x, y, z, scale
    与PointXYZI类似,除了scale包含考虑某个点进行几何操作的比例

    PointSurfel - float x, y, z, normal[3], rgba, radius, confidence, curvature
    包含XYZ数据、曲面法线、RGB信息、比例、置信度和曲面曲率的复杂点类型

自定义类型

struct MyPointType
{
  float test;
};

 



————————————————
版权声明:本文为CSDN博主「CallMe航仔」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tobebest_lah/article/details/106241406

posted @ 2022-03-05 14:40  楸壳  阅读(785)  评论(0编辑  收藏  举报