PCL--PCL基础

一、PCL基础

  1.1 Retrun 语句

    return语句需要在圆括号中设定返回值,即规定return语句必须有返回值。return如果没有返回值也会编译,例如:

int main()
{
   return (0);
}

二、 编写新的PCL类

  2.1 建立文件结构

    有两种不同的方法建立文件结构:
        1.分别编写代码,最为独立的PCL类在PCL代码数之外;
        2.直接把文件建立在PCL代码目录树中;

三、PCL点类型

  点云是复杂的n维结构,他需要能表示不同类型的信息,而用户因该知道并理解需要传送什么样的信息。例如:下面是对XYZ数据的简单操作,

struct PointXYZ
{
    float x;
    float y;
    float z;
    float padding;  //填补位数,以满足存储对齐要求。
}

   然而,例如用户在嵌入是平台上寻找编译PCL的时候,增加额外的填补就是浪费存储空间,因此,可以用一个简单的不带最后浮点数的PointXYZ结构来替代。

  3.1 PCL中可用的PointT类型

    为了涵盖所有可能的情况,PCL定义了大量的point类型。在point_types.hpp中有完整的目录。

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;
     };
};
2. PointXYZI——成员变量:float x,y,z,intensity;

  **PointXYZI是一个简单的XYZ坐标加上intensity的point类型。**理想情况下,这4个变量将新建单独一个结构体,并且满足存储对齐,然而,由于point的大部分操作会把data[4]元素设置为0或1(用以转换),**不能让intensity和XYZ在同一个结构体中,如果这样的话,其内容将会被覆盖。**例如,两个点的点击会把他们第四个元素设置成0,否则点积没有意义,等等。因此,对于兼容存储对齐用三个额外的浮点数来填补intensity,这样在存储方面效率较低,但是符合存储对其要求,运行效率较高。

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; uint32_t rgba;

  除了RGBA信息被包含在一个整型变量中,其他和PointXYZI类似

union
{
   float data[4];
   struct
     {
        float x;
        float y;
        float z;
     };
};
union
{
   struct
     {
        uint32_t rgba;
     };
   float data_c[4];
};
4. PointXYZRGB——成员变量:float x,y,z,rgb;

  除了RGB信息被包含在一个浮点型变量中,其他和PointXYZRGBA类似。RGB数据被压缩到一个浮点数里的原因在于早期PCL是作为ROS项目的一部分来开发的,那里,RGB数据是用浮点数来传送的。

union
{
   float data[4];
   struct
     {
        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结构体表示给定点所在样本曲面上的法线方向,以及对应曲率的测量值。由于在PCL中对曲面法线的操作很普遍,还是用第4个元素来占位,这样就兼容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结构体,并且包括曲面法线和曲率。

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 rgb;
      float curvature;
  };
  float data_c[4];
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值