PCL点云库学习

文章介绍了PCL库中多种点数据类型,如PointXYZ、PointXYZI等,详细说明了它们的成员变量和用途。此外,还阐述了点云的读取和保存方法,包括使用PCDReader和io模块的ASCII及Binary格式保存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、可用Point类型

  • PointXYZ–成员变量: float x, y, z;

        PointXYZ是使用最常见的一个点数据类型,因为它只包含三维xyz坐标信息,这三个浮点数附加一个浮点数来满足存储对齐,用户可利用points[i].data[0],或者points[i].x访问点的x坐标值。

  • PointXYZI–成员变量: float x, y, z, intensity;

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

  • PointXYZRGBA–成员变量: float x, y, z; uint32_t rgba;

除了rgba信息被包含在一个整型变量中,其它的和PointXYZI类似。

  • PointXY-float x, y;

        简单的二维x-y point结构

  • InterestPoint-float x, y, z, strength;

        除了strength表示关键点的强度的测量值,其它的和PointXYZI类似。

  • Normal - float normal[3], curvature;

        另一个最常用的数据类型,Normal结构体表示给定点所在样本曲面上的法线方向,以及对应曲率的测量值(通过曲面块特征值之间关系获得——查看NormalEstimation类API以便获得更多信息,后续章节有介绍),由于在PCL中对曲面法线的操作很普遍,还是用第四个元素来占位,这样就兼容SSE和高效计算,例如,用户访问法向量的第一个坐标,可以通过points[i].data_n[0]或者points[i].normal[0]或者points[i].normal_x,再一次强调,曲率不能被存储在同一个结构体中,因为它会被普通的数据操作覆盖掉。

  • PointNormal - float x, y, z; float normal[3], curvature;

        PointNormal是存储XYZ数据的point结构体,并且包括采样点对应法线和曲率。

  • PointXYZRGBNormal - float x, y, z, rgb, normal[3], curvature;

        PointXYZRGBNormal存储XYZ数据和RGB颜色的point结构体,并且包括曲面法线和曲率

  • PointXYZINormal - float x, y, z, intensity, normal[3], curvature;

        PointXYZINormal存储XYZ数据和强度值的point结构体,并且包括曲面法线和曲率。

  • PointWithRange - float x, y, z (union with float point[4]), range;

        PointWithRange除了range包含从所获得的视点到采样点的距离测量值之外,其它与PointXYZI类似。

  • PointWithViewpoint - float x, y, z, vp_x, vp_y, vp_z;

        PointWithViewpoint除了vp_x、vp_y和vp_z以三维点表示所获得的视点之外,其它与PointXYZI一样。

  • MomentInvariants - float j1, j2, j3;

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

  • PrincipalRadiiRSD - float r_min, r_max;

        PrincipalRadiiRSD是一个包含曲面块上两个RSD半径的point类型,查看RSDEstimation以获得更多信息。

  • Boundary - uint8_t boundary_point;

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

  • PrincipalCurvatures - float principal_curvature[3], pc1, pc2;

        PrincipalCurvatures包含给定点主曲率的简单point类型。查看PrincipalCurvaturesEstimation以获得更多信息。

  • PFHSignature125 - float pfh[125];

        PFHSignature125包含给定点的PFH(点特征直方图)的简单point类型,查看PFHEstimation以获得更多信息。

  • FPFHSignature33 - float fpfh[33];

        FPFHSignature33包含给定点的FPFH(快速点特征直方图)的简单point类型,查看FPFHEstimation以获得更多信息。

  • VFHSignature308 - float vfh[308];

        VFHSignature308包含给定点VFH(视点特征直方图)的简单point类型,查看VFHEstimation以获得更多信息。

  • Narf36 - float x, y, z, roll, pitch, yaw; float descriptor[36];

        Narf36包含给定点NARF(归一化对齐半径特征)的简单point类型,查看NARFEstimation以获得更多信息。

  • BorderDescription - int x, y; BorderTraits traits;

        BorderDescription包含给定点边界类型的简单point类型,看BorderEstimation以获得更多信息。

  • IntensityGradient - float gradient[3];

        IntensityGradient包含给定点强度的梯度point类型,查看IntensityGradientEstimation以获得更多信息。

  • Histogram - float histogram[N];

        Histogram用来存储一般用途的n维直方图。

  • PointWithScale - float x, y, z, scale;

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

  • PointSurfel - float x, y, z, normal[3], rgba, radius, confidence, curvature;

        PointSurfel存储XYZ坐标、曲面法线、RGB信息、半径、可信度和曲面曲率的复杂point类型。

二、文件读取与保存(io模块)

Ⅰ:用点云读取对象reader来进行读取

	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>); //存放读取点云的对象
	pcl::PCDReader reader;	//定义点云读取对象
    reader.read("test.pcd", *cloud_in) < 0

        用内置函数方法来读取

pcl::io::loadPCDFile<pcl::PointXYZ> ("test_pcd.pcd", *cloud)

Ⅱ:保存为ASICC格式,可以直接用记事本打开

pcl::io::savePCDFileASCII("ASICC_1.pcd", *cloud_out);

        保存为Binary格式,不可用记事本打开,但更快速

pcl::io::savePCDFileBinary("Binary_1.pcd", *cloud_out);

三、点云链接   

        连接两个不同点云为一个点云,进行操作前要确保两个数据集中字段的类型相同和维度相等,同时了解如何连接两个不同点云的字段(例如颜色 法线)这种操作的强制约束条件是两个数据集中点的数目必须一样

        例如:点云A是N个点XYZ点,点云B是N个点的RGB点,则连接两个字段形成点云C是N个点xyzrgb类型

        连接分为两种:

  • 点云连接concatenate points :拼接列
        cloud_c = cloud_a;
        cloud_c += cloud_b;
  • 字段连接concatenate fields :拼接行
pcl::concatenateFields(cloud_a, n_cloud_b, p_n_cloud_c);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值