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,这样在存储方面效率较低,但是符合存储对齐要求,运行效率较高。

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信息被包含在一个浮点型变量中,其它和PointXYZRGB类似。rgb数据被压缩到一个浮点数里的原因在于早期PCL是作为ROS项目的一部分来开发的,那里RGB数据是用浮点数来传送的,PCL设计者希望所有遗留代码会重新更改(在PCL 2.x中很可能这样做),可能取消此数据类型。

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结构体表示给定点所在样本曲面上的法线方向,以及对应曲率的测量值(通过曲面块特征值之间关系获得——查看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结构体,并且包括曲面法线和曲率。

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.PointXYZINormal

成员变量:float x, y, z, intensity, normal[3], curvature;
PointXYZINormal存储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 intensity;
        float curvature;
    };
    float data_c[4];
};

11.PointXYZL

成员变量:float x, y, z, uin32_t label

12.PointXYZRGBL

成员变量: float x, y, z, rgb, uint32_t label

13.PointXYZLNormal

成员变量:float x, y, z, label, normal[3], curvature

14.PointXYZHSV

成员变量:  float x, y, z, h, s, v

15.PointWithRange

成员变量:float x, y, z(union with float point[4]), range;
PointWithRange除了range包含从所获得的视点到采样点的距离测量值之外,其它与PointXYZI类似。

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

16.PointWithViewpoint

成员变量:float x, y, z, vp_x, vp_y, vp_z;
PointWithViewpoint除了vp_x、vp_y和vp_z以三维点表示所获得的视点之外,其它与PointXYZI一样。

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

17.MomentInvariants

成员变量:float j1, j2, j3;
MomentInvariants是一个包含采样曲面上面片的三个不变矩的point类型,描述面片上质量的分布情况。查看MomentInvariantsEstimation以获得更多信息。

struct
{
    float j1, j2, j3;
};

18.PrincipalRadiiRSD

成员变量:float r_min, r_max;
PrincipalRadiiRSD是一个包含曲面块上两个RSD半径的point类型,查看RSDEstimation以获得更多信息。

struct
{
    float r_min, r_max;
};

19.Boundary

成员变量:uint8_t boundary_point;
Boundary存储一个点是否位于曲面边界上的简单point类型,查看BoundaryEstimation以获得更多信息。

struct
{
    uint8_t boundary_point;
};

20.PrincipalCurvatures

成员变量:float principal_curvature[3], pc1, pc2;
PrincipalCurvatures包含给定点主曲率的简单point类型。查看PrincipalCurvaturesEstimation以获得更多信息。

struct
{
    union
    {
        float principal_curvature[3];
        struct
        {
            float principal_curvature_x;
            float principal_curvature_y;
            float principal_curvature_z;
        };
    };
    float pc1;
    float pc2;
};

21.PFHSignature125

成员变量:float pfh[125];
PFHSignature125包含给定点的PFH(点特征直方图)的简单point类型, 查看PFHEstimation以获得更多信息。

struct
{
    float histogram[125];
};

22.FPFHSignature33

成员变量:float fpfh[33];
FPFHSignature33包含给定点的FPFH(快速点特征直方图)的简单point类型,查看FPFHEstimation以获得更多信息。

struct
{
    float histogram[33];
};

23.VFHSignature308

成员变量:float vfh[308];
VFHSignature308包含给定点VFH(视点特征直方图)的简单point类型,查看VFHEstimation以获得更多信息。

struct
{
    float histogram[308];
};

24.Narf36

成员变量:float x, y, z, roll, pitch, yaw; float descriptor[36];
Narf36包含给定点NARF(归一化对齐半径特征)的简单point类型,查看NARFEstimation以获得更多信息。

struct
{
    float x, y, z, roll, pitch, yaw;
    float descriptor[36];
};

25.BorderDescription

成员变量:int x, y; BorderTraits traits;
BorderDescription包含给定点边界类型的简单point类型,看BorderEstimation以获得更多信息。

struct
{
    int x, y;
    BorderTraitstraits;
};

26.IntensityGradient

成员变量:float gradient[3];
IntensityGradient包含给定点强度的梯度point类型,查看IntensityGradientEstimation以获得更多信息。

struct
{
    union
    {
        float gradient[3];
        struct
        {
            float gradient_x;
            float gradient_y;
            float gradient_z;
        };
    };
};

27.Histogram

成员变量:float histogram[N];
Histogram用来存储一般用途的n维直方图。

template<int N>
struct Histogram
{
    float histogram[N];
};

28.PointWithScale

成员变量:float x, y, z, scale;
PointWithScale除了scale表示某点用于几何操作的尺度(例如,计算最近邻所用的球体半径,窗口尺寸等等),其它的和PointXYZI一样。

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

29.PointSurfel

成员变量:float x, y, z, normal[3], rgba, radius, confidence, curvature;
PointSurfel存储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
    {
        uint32_trgba;
        float radius;
        float confidence;
        float curvature;
    };
    float data_c[4];
};

  • 20
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: pcl是Point Cloud Library的缩写,是一个功能强大的点云库,提供了多种点云处理算法。其中,点云平面拟合是pcl中比较基础的一个算法。 点云平面拟合的目的是根据给定的一组点云,拟合出一个平面模型,描述这些点云所在的平面。通常情况下,需要指定一个距离阈值来控制哪些点云被认为是在同一个平面上的。 在pcl中,点云平面拟合可以使用SACSegmentation类来实现。步骤如下: 1. 定义点云数据结构(PointCloud<PointT>)。 2. 创建SACSegmentation类的对象seg。 3. 定义存储平面模型的数据结构(ModelCoefficients)。 4. 设置SACSegmentation对象的参数(模型类型、距离阈值等)。 5. 调用Segment()函数,对点云进行平面拟合,得到平面模型系数。 6. 根据平面模型系数,对点云进行分类,判断哪些点云属于该平面。 具体实现代码如下: ``` pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients); pcl::SACSegmentation<pcl::PointXYZ> seg; // 读取点云数据到cloud中 seg.setOptimizeCoefficients(true); // 设置最佳系数优化选项 seg.setModelType(pcl::SACMODEL_PLANE); // 设置模型类型为平面 seg.setMethodType(pcl::SAC_RANSAC); // 设置方法类型为RANSAC seg.setMaxIterations(1000); // 设置最大迭代次数 seg.setDistanceThreshold(0.01); // 设置距离阈值 seg.setInputCloud(cloud); seg.segment(*inliers, *coefficients); // 进行平面拟合 if (inliers->indices.size() == 0) { std::cerr << "Failed to estimate a planar model for the given dataset." << std::endl; return (-1); } // 分类点云,得到属于该平面的点云 pcl::ExtractIndices<pcl::PointXYZ> extract; extract.setInputCloud(cloud); extract.setIndices(inliers); extract.setNegative(false); pcl::PointCloud<pcl::PointXYZ>::Ptr plane_cloud(new pcl::PointCloud<pcl::PointXYZ>); extract.filter(*plane_cloud); ``` 以上就是使用pcl实现点云平面拟合的基本步骤和代码示例。当然,具体的实现还需要根据实际情况进行适当调整。 ### 回答2: PCL(Point Cloud Library)是一种非常流行的点云处理库,它提供了许多点云数据处理和分析的算法。其中,点云的平面拟合是其中的重要应用。 点云平面拟合是指将一个三维点云数据拟合成一个平面模型,以便于处理和分析。在PCL库中,点云平面拟合主要通过RANSAC算法实现。RANSAC(Random Sample Consensus)是一种随机采样一致性算法,它通过从点云数据中随机采样子集,并通过估计平面模型与采样点之间的误差来找到最佳的平面模型。 下面我们简单介绍PCL实现点云平面拟合的步骤: 1. 导入点云数据:将点云数据读取或者生成并导入到程序中。 2. 定义平面模型:使用PCL提供的ModelCoefficients数据类型来定义平面模型。这个数据类型内部包含了平面模型的法向量以及平面上的一个点。我们需要初始化这些值。 3. 构造PointIndices数据类型:该类型用于储存点云数据中的总体点集和样本点集,为后续的RANSAC算法做准备。 4. 定义RANSAC参数:在RANSAC算法的实现过程中,需要定义一些参数来控制算法的执行,包括采样点数量、迭代次数、阈值等参数。 5. 执行RANSAC算法:通过PCL提供的SACSegmentation类实现平面拟合。该类的主要函数是segment,该函数接受点云数据、平面模型数据、RANSAC参数等输入,并且返回平面模型和符合模型的点集。 最后,我们还需要将平面模型和符合模型的点集输出,以便后续的处理。PCL提供了各种输出方式,可以将数据导出到文件或者实时在GUI中可视化。 需要注意的是,在实际应用中,因为点云数据的复杂性以及类似于数据缺失等问题,在执行过程中需要根据实际情况进行参数调整,以获得最佳的拟合效果。 总之,PCL提供了丰富的点云数据处理和分析算法,尤其是点云平面拟合等常用算法的实现非常方便。通过合理的参数调整和算法运用,我们可以获得高精度、准确的点云平面拟合模型。 ### 回答3: PCL(Point Cloud Library)是一个由C++编写的开源库,用于处理点云数据。点云平面拟合是PCL中常用的功能之一,可用于从点云数据中提取出平面形状。 实现PCL点云平面拟合的步骤如下: 1.加载点云数据 首先需要将点云数据加载到程序中,PCL支持多种点云数据格式,如PLY、PCD、OBJ、STL等。可以使用PCL中的PointCloud类来存储点云数据。 PointCloud<pcl::PointXYZ>::Ptr cloud(new PointCloud<pcl::PointXYZ>); if (pcl::io::loadPCDFile<pcl::PointXYZ>("cloud.pcd", *cloud) == -1) //加载pcd文件 { PCL_ERROR("Couldn't read file"); return (-1); } 2.把点云数据转换成PCL中的数据类型 由于点云数据可以是多种格式,为了在PCL中做处理,需要将它们转换成PCL中支持的数据类型。常见的转换方法有从XYZRGBXYZ、从XYZXYZRGB、从PointXYZRGBA到PointXYZ等。 3.对点云数据进行滤波 在进行点云平面拟合之前,可以对点云数据进行一些预处理以提高拟合效果,其中最常用的方法是滤波。PCL中提供了多种过滤器,如VoxelGrid、StatisticalOutlierRemoval、PassThrough、ConditionalRemoval等。 pcl::PassThrough<pcl::PointXYZ> pass; pass.setInputCloud (cloud); pass.setFilterFieldName ("z"); //设置过滤字段为z坐标 pass.setFilterLimits (0.0, 1.0); //设置过滤范围 pass.filter (*cloud_filtered); //滤波后得到的点云数据存储在cloud_filtered中 4.进行平面拟合 PCL中的平面拟合方法是使用RANSAC算法进行,它可以在包含噪声的数据中寻找拟合的最佳模型。 pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients ()); pcl::PointIndices::Ptr inliers (new pcl::PointIndices ()); // 创建SAC模型,并设置其中的随机参数最大迭代次数、距离阈值等参数 pcl::SACSegmentation<pcl::PointXYZ> seg; seg.setOptimizeCoefficients (true); seg.setModelType (pcl::SACMODEL_PLANE); seg.setMethodType (pcl::SAC_RANSAC); seg.setDistanceThreshold (0.01); seg.setInputCloud (cloud_filtered); //执行拟合 seg.segment (*inliers, *coefficients); 5.从点云数据中提取平面 最后,利用平面拟合得到的系数来提取点云数据中的平面。 pcl::ExtractIndices<pcl::PointXYZ> extract; extract.setInputCloud (cloud_filtered); extract.setIndices (inliers); extract.setNegative (false); extract.filter (*cloud_plane); 以上就是实现PCL点云平面拟合的基本步骤。需要注意的是,调整算法参数、优化模型以及后续处理等均需要根据具体应用场景进行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值