PCL点云数据格式,可⽤的PointT类型
点云的数据结构主要有如下格式:PointXYZ、PointXYZI、PointXYZRGBA、PointXYZRGB、PointXY、InterestPoint、Normal、PointNormal、PointXYZRGBNormal、PointXYZINormal、PointXYZLNormal、PointXYZL、PointXYZRGBL、PointXYZHSV、PointWithRange、PointWithViewpoint、MomentInvariants、PrincipalRadiiRSD、Boundary、PrincipalCurvatures、PFHSignature125、FPFHSignature33、VFHSignature308、Narf36、BorderDescription、IntensityGradient、Histogram、PointWithScale、PointSurfel。
参见头⽂件:pcl/point_types.h
1.PointXYZ
成员变量: float x, y, z;
PointXYZ是使⽤最常见的⼀个点数据类型,因为它只包含三维xyz坐标信息,这三个浮点数附加⼀个浮点数来满⾜存储对齐,⽤户可利⽤points[i].data[0],或者points[i].x访问点的x坐标值。
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
PCL的example⾥通常都是这样定义点云:
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> );
如果要访问某⼀个点,则需要:
cloud->points[i].x
可以看到,points是个vector变量,所以points[i]就是单个的点,这⾥访问了他的x的值,同理可以访问y和z,如果想往cloud这个变量⾥⾯添加⼀个点的信息,则只需要定⼀个PointXYZ的变量,然后通过vector的push_back,加⼊到points这个变量⾥⾯。
pcl::PointXYZ point;
point.x = 2.0f - y;
point.y = y;
point.z = z;
cloud.points.push_back(point);
如果有两个坐标相同的点,则颜⾊信息以最后的⼀个为准。
2.PointXYZI
成员变量: float x, y, z, intensity;
PointXYZI是⼀个简单的XYZ坐标加intensity的point类型,理想情况下,这四个变量将新建单独⼀个结构体,并且满⾜存储对齐,然⽽,由于point的⼤部分操作会把data[4]元素设置成0或1(⽤于变换),不能让intensity与xyz在同⼀个结构体中,如果这样的话其内容将会被覆盖。例如,两个点的点积会把他们的第四个元素设置成0,否则该点积没有意义,等等。因此,对于兼容存储对齐,⽤三个额外的浮点数来填补intensity,这样在存储⽅⾯效率较低,但是符合存储对齐要求,运⾏效率较⾼。
{
float x;
float y;
float z;
};
};
union
{
struct
{
float intensity;
};
float data_c[4];
};
3.PointXYZRGBA
成员变量: float x, y, z; uint32_t rgba;
除了rgba信息被包含在⼀个整型变量中,其它的和PointXYZI类似。
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
union
{
struct
{
htmlborderuint32_t rgba;
};
float data_c[4];
};
4.PointXYZRGB
成员变量:float x, y, z, rgb;
除了rgb信息被包含在⼀个浮点型变量中,其它和PointXYZRGB类似。rgb数据被压缩到⼀个浮点数⾥的原因在于早期PCL是作为ROS项⽬的⼀部分来开发的,那⾥RGB数据是⽤浮点数来传送的,PCL设计者希望所有遗留代码会重新更改(在PCL 2.x中很可能这样做),可能取消此数据类型。
{
float x;
float y;
float z;
};
};
union
{
struct
{
float rgb;
};
float data_c[4];
};
5.PointXY
成员变量:float x, y
简单的⼆维x-y point结构。
struct
{
float x;
float y;
};
6.InterestPoint
成员变量:float x, y, z, strength
除了strength表⽰关键点的强度的测量值,其它的和PointXYZI类似。
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
union
{
struct
{
float strength;
};
float data_c[4];
};
7 .Normal
成员变量:float normal[3], curvature;
另⼀个最常⽤的数据类型,Normal结构体表⽰给定点所在样本曲⾯上的法线⽅向,以及对应曲率的测
量值(通过曲⾯块特征值之间关系获得——查看NormalEstimation类API以便获得更多信息),由于在PCL中对曲⾯法线的操作很普遍,还是⽤第四个元素来占位,这样就兼容SSE和⾼效计算,例如,⽤户访问法向量的第⼀个坐标,可以通过points[i].data_n[0]或者points[i].normal[0]或者
points[i].normal_x,再⼀次强调,曲率不能被存储在同⼀个结构体中,因为它会被普通的数据操作覆盖掉。
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.PointNormal
成员变量:float x, y, z; float normal[3], curvature;
PointNormal是存储XYZ数据的point结构体,并且包括采样点对应法线和曲率。
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];
};
9.PointXYZRGBNormal
成员变量:float x, y, z, rgb, normal[3], curvature;
PointXYZRGBNormal存储XYZ数据和RGB颜⾊的point结构体,并且包括曲⾯法线和曲率。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论