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


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.pointsPointT的点,它是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

成员变量成员类型访问形式
xyzxyz均为floatpoints[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,rgbrgba为无符号整型,其它为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维直方图
PointWithScalex,y,z,scale,它假设点云是由尺度的,比如球状则表示半径
PointSurfel坐标、法线、GRB、半径、可信度和曲率的复杂信息类型

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

  • 23
    点赞
  • 196
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非晚非晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值