【点云处理技术之PCL】PCL中的基本数据类型——PointCloud与PointT

文章目录

  • 0. PointCloud
  • 1. PointXYZ——x,y,z
  • 2. PointXYZI——x,y,z,intensity
  • 3. PointXYZRGBA——x,y,z,r,g,b,a
  • 4. PointXYZRGB——x,y,z,r,g,b
  • 5. PointXY——x,y
  • 6. InterestPoint——x, y, z, strength
  • 7. PointNormal——x, y, z,normal,curvature
  • 8. PointXYZRGBNormal——x, y, z, normal[3], curvature,rgba
  • 9. PointXYZINormal——float x, y, z, intensity, normal[3], curvature
  • 10. PointWithRange——x, y, z,range
  • 11. 其它类型

pcl中有很多预定义的数据类型,这些类型应该足以支持PCL中实现的所有算法和方法, 所以这节内容很重要,但是难度又不大,即使用户想要自定义数据类型,pcl中的数据类型也是大有帮助的。

0. PointCloud

先来介绍一下pcl::PointCloud数据类型,单看它的名字PointCloud(点云),就知道它由很多点云组成。

  • 定义

我们定义一个点云类型可能类似于以下形式:

pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPtr (new pcl::PointCloud<pcl::PointXYZ>);//点云指针类型
pcl::PointCloud<pcl::PointXYZ> cloud;//点云对象
pcl::PointXYZ  point;//单个点云
  • 访问形式
cloud.points[0].x;//访问第一个点的x
cloudPtr->points[0].x;//访问第一个点的x
point.x;//访问单个点的x
  • 常用的成员变量和方法的使用与说明
属性 说明
cloud.size() 点云的个数
cloud.height 有序列点云:点云行数(类似于图像);无序点云:height=1
cloud.width 点云个数标识width*height,如果height=1,则size()=width
cloud.points PointT的点,它是vector形式,方便点云访问
cloud.is_dense 如果为false,则表示点云中包含inf/NaN这样的点,使用的时候注意滤除这些点
cloud.isOrganized () 判断点云是否有序(一般不使用height=1判断)
sensor_origin_ 传感器的采集位姿(origin/translation),Eigen::Vector4f类型,可选的,不常用
sensor_orientaion_ 传感器的采集位姿(方向),Eigen::Quaternionf类型,可选的,不常用

想要了解pointcloud的更多操作,可以访问官网API:https://pointclouds.org/documentation/classpcl_1_1_point_cloud.html

或者访问github:https://github.com/PointCloudLibrary/pcl/blob/master/common/include/pcl/PCLPointCloud2.h

1. PointXYZ——x,y,z

成员变量 成员类型 访问形式
xyz xyz均为float points[i].data[0]或points[i].x

xyz三个浮点数附加一个浮点数来满足存储对齐,具体类型如下:

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

2. PointXYZI——x,y,z,intensity

成员变量 成员类型 访问形式
x、y、z和intensity 均为float 请查看以下数据结构

由于point的大部分操作会把data[4]元素设置成0或1,所以需要将intensity与xyz放在两个结构体中,具体如下:

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

3. PointXYZRGBA——x,y,z,r,g,b,a

成员变量 成员类型 访问形式
x、y、z、r、g、b和a等 xyz为float;rgba为std::int32_t 请查看以下数据结构

因为使用了union,所以可以很方便地单独访问每个颜色通道。具体数据类型如下:

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;
};

4. PointXYZRGB——x,y,z,r,g,b

与PointXYZRGBA类似,只是少一个a

5. PointXY——x,y

成员变量 成员类型 访问形式
x,y 都是float类型 请查看以下数据结构
struct
{
  float x;
  float y;
};

6. InterestPoint——x, y, z, strength

成员变量 成员类型 访问形式
x, y, z, strength 都是float类型 请查看以下数据结构
union
{
    float data[4];
    struct
    {
        float x;
        float y;
        float z;
    };
};
union
{
    struct
    {
        float strength;
    };
    float data_c[4];
};

7. PointNormal——x, y, z,normal,curvature

成员变量 成员类型 访问形式
x, y, z,normal,curvature 都是float类型 请查看以下数据结构

这里包含了3个独立的union,其中normal为曲面的法向量,curvature为曲率

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

union
{
    float data_n[4];
    float normal[3];
    struct
    {
        float normal_x;
        float normal_y;
        float normal_z;
    };
};

union
{
    struct
    {
        float curvature;
    };
    float data_c[4];
};

8. PointXYZRGBNormal——x, y, z, normal[3], curvature,rgba

成员变量 成员类型 访问形式
x, y, z,normal,curvature,rgb rgba为无符号整型,其它为float 请查看以下数据结构

包含:点云的x, y, z和rgba,另外还包括曲面的法向量和曲率

union
{
    float data[4];
    struct
    {
        float x;
        float y;
        float z;
    };
};
union
{
    float data_n[4];
    float normal[3];
    struct
    {
        float normal_x;
        float normal_y;
        float normal_z;
    };
} union
{
    struct
    {
        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;
        };
        float curvature;
    };
    float data_c[4];
};

9. PointXYZINormal——float x, y, z, intensity, normal[3], curvature

成员变量 成员类型 访问形式
x, y, z,normal,curvature,intensity 都是float 请查看以下数据结构
union
{
    float data[4];
    struct
    {
        float x;
        float y;
        float z;
    };
};
union
{
    float data_n[4];
    float normal[3];
    struct
    {
        float normal_x;
        float normal_y;
        float normal_z;
    };
} union
{
    struct
    {
        float intensity;
        float curvature;
    };
    float data_c[4];
};

10. PointWithRange——x, y, z,range

类似于PointXYZI,只不过range是用来表示视点到采样点之间的距离测量值

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

11. 其它类型

还有一些不常用的数据类型,只对它们进行列举如下,后续如有使用,再继续更新。

数据类型 解释
PointWithViewpoint 包含视点信息
MomentInvariants
PrincipalRadiiRSD
Boundary
PrincipalCurvatures
PFHSignature125
FPFHSignature33
VFHSignature308
Narf36
BorderDescription
IntensityGradient
Histogram 存储一般用途的n维直方图
PointWithScale x,y,z,scale,它假设点云是由尺度的,比如球状则表示半径
PointSurfel 坐标、法线、GRB、半径、可信度和曲率的复杂信息类型

参考:https://pcl.readthedocs.io/projects/tutorials/en/latest/adding_custom_ptype.html#how-to-add-a-new-pointt-type

你可能感兴趣的:(PCL,pcl,pcl中的数据类型,PointXYZ,PointXYZI,PointXYZRGB)