PCL点云库--点的类型

PCL带有多种预定义的点类型,包括XYZ数据、SEE结构和更复杂的n维直方图表示形式。这些类型应该足以支持PCL中实现的所有算法和方法,但是在某种情况下,用户希望定义新的类型。

1、为何是PointT类型

在早期,对于点云的共识是他是一种复杂的n维机构,需要能够表示不同类型的信息。但是,用户应该知道并且理解需要传递哪些类型的信息,以便于代码的理解、调试和优化。
一个简单的例子是-->对XYZ数据的简单操作。对于启用了SSE的处理器,最有效的方法是将3个维度存储为浮点数,然后再添加一个用于填充的浮点数。
1
2
3
4
5
6
7
 struct PointXYZ
{
float x;
float y;
float z;
float padding;
};
但是,作为示例,如果用户正在考虑在嵌入式平台上编译PCL,这样的结构可能会浪费内存。因此,可以使用没有最后一个浮点数的更简单的PointXYZ结构。
此外,如果您的应用程序要求PointXYZPRGBNormal包含每个点的三维坐标、颜色信息和表面法线,则用上述方法定义的结构而言,都是很容易表示的。由于PCL中所有算法都应该是模块化的,因此除了结构定义外,无需进行其他更改。

2、PCL提供了那些PointT类型

为了尽可能的涵盖我们可能想到的所有可能情况,我们在PCL中定义了许多点类型,在我们去定义自己的点类型前,我们最好查看一下现有的点列表,有可能我们需要的点类型已经存在了。

1)PointXYZ:float  x,y,z
    这是最常用的数据类型之一,因为他仅包含了三维x,y,z坐标信息。三个浮点数用一个附加的浮点数填充来进行SSE对齐。用户可以通过points[i].data[0]或points[i].x以访问x坐标。
1
2
3
4
5
6
7
8
9
10
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
2)PointXYZI:float x,y,z,intensity(强度)
     简单的XYZ+强度的点类型。在理想情况下,这四个成员变量将创建一个于SSE对齐的单一结构。但是,由于大多数的点操作会将data[4]数组的最后一个分量设置为0或1(用于转换),因此我们不能
     使强度成为统一结构的成员,因为其内容将被覆盖。例如,两个点之间的点积会将其第四个分量设置为0,否则该点积就没有意义了,以此类推。
     因此,为了SS3对齐,我们用3个额外的浮点填充强度。做这样的处理有可能在存储处理方面效率低下,但是在内存对齐方法则表现良好。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
union
{
struct
{
float intensity;
};
float data_c[4];
};
3)PointXYZRGBA:float x,y,z; std::unint32_t rgba
     与PointXYZI相似,不同之处在于rgba包含打包成无符号32位整数的RGBA信息。由于使用了联合声明,还可以按照名称分别访问颜色通道。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 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:float x,y,z;std::uint32_t rgba;
        与PointXYZRGBA相同       
5)PointXY:float x,y;
        简单的2D x,y点结构
1
2
3
4
5
 struct
{
float x;
float y;
};
6)InrerestPoint:浮点数x,y,z,强度
        与PointXYZ相似,不同之处在于强度包含了关键点强度的度量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
union
{
struct
{
float strength;
};
float data_c[4];
};
7)Normal :float normal[3],curbature(曲率);
        另一种最常用的数据类型,"法线"结构表示给定点处的表面法线,以及一个"曲率"度量值(在同一调度中获得,与贴面的特征值之间的关系相同)
        由于在PCL中对表面法线进行的操作非常普遍,因此我们用第四个分量来填充他,以便于进行SSE对齐并提高计算效率。用户可以访问points[i].data_n[0]或points[i].normal[0]或points[i].normal_x,以访问法线向量的第一个坐标。同样的,曲率不能以正常数据操作就被覆盖的结构来存储。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
        保存XYZ数据以及表面法线和曲率的点结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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,normal[3],curvature;std::uint32_t rgba;
    包含XYZ数据和RGBA颜色以及表面法线和曲率的点结构。(尽管名称内没有包括A,但该类型确实包含Aloha通道)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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];
};
10)PointXYZINormal:float x,y,z,intensity,normal[3],curvature
    保存XYZ,强度值以及表面法线和曲率的点结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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];
};
11)PointWithRange:float x,y,z(union with float point[4]),range;
    与PointXYZI相似,range包含从采集视点到某个点的距离的度量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
union
{
struct
{
float range;
};
float data_c[4];
};
12)PointWithViewpoint-float x,y,z,vp_x,vp_y,vp_z;
    与PointXYZI相似,除了vp_x,vp_y和vp_z包含获取视点作为3D点。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
union
{
struct
{
float vp_x;
float vp_y;
float vp_z;
};
float data_c[4];
};
13)MomentInvariants:float j1,j2,j3;
    简单点类型,将3个矩不变式保存在曲贴面上
1
2
3
4
struct
{
float j1, j2, j3;
};
14)PrincipalRadiiRSD :float r_min, r_max;
        简单点类型,将2 RSD半径保持在表面斑块处   
15)Boundary :std::uint8_t boundary_point;
    简单点类型,用于确定点是否位于曲面边界上
1
2
3
4
struct
{
std::uint8_t boundary_point;
};
16)PrincipalCurvatures:float Principal_curvature [3],pc1,pc2;
    简单点类型,用于保存给定点的主曲率。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct
{
union
{
float principal_curvature[3];
struct
{
float principal_curvature_x;
float principal_curvature_y;
float principal_curvature_z;
};
};
float pc1;
float pc2;
};
17)PFHSignature125:float pfh [125]
    简单点类型,用于保存给定点的PFH(点特征直方图)
1
2
3
4
struct
{
float histogram[125];
};
18)FPFHSignature33:float fpfh [33];
    保存给定点的FPFH(快速特征直方图)的简单点类型
1
2
3
4
struct
{
float histogram[33];
};
19)VFHSignature308 :float vfh [308];
    保留给定点的VFH(视点特征直方图)的简单点类型。
1
2
3
4
struct
{
float histogram[308];
};
20)Narf36 :float x, y, z, roll, pitch, yaw; float descriptor[36]
    简单点类型,用于保存给定点的NARF(正常对齐的半径特征
1
2
3
4
5
struct
{
float x, y, z, roll, pitch, yaw;
float descriptor[36];
};
21)BorderDescription - int x, y; BorderTraits traits
    简单点类型,用于保存给定点的边框类型。
1
2
3
4
5
struct
{
int x, y;
BorderTraits traits;
};
22)IntensityGradient - float gradient[3]
    简单点类型,用于保存给定点的强度梯度。
1
2
3
4
5
6
7
8
9
10
11
12
13
struct
{
union
{
float gradient[3];
struct
{
float gradient_x;
float gradient_y;
float gradient_z;
};
};
};
23)Histogram - float histogram[N]
    通用nD直方图占位符。
1
2
3
4
5
template <int N>
struct Histogram
{
float histogram[N];
};
24)PointWithScale - float x, y, z, scal
    与PointXYZI相似,不同之处是比例尺包含考虑将某个点用于几何运算的比例尺(例如,用于其最近邻居计算的球体的半径,窗口大小等)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct
{
union
{
float data[4];
struct
{
float x;
float y;
float z;
};
};
float scale;
};
25)PointSurfel - float x, y, z, normal[3], rgba, radius, confidence, curvature
    一种复杂点类型,包含XYZ数据,表面法线以及RGB信息,比例,置信度和表面曲率。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
{
std::uint32_t rgba;
float radius;
float confidence;
float curvature;
};
float data_c[4];
};

感谢您的阅读。 🙏 关于转载请看这里