PCL学习02之自定义PointT类型

PCL 附带各种预定义的点类型,从 XYZ 数据的 SSE 对齐结构到更复杂的 n 维直方图表示,如 PFH(点特征直方图)。
这些类型应该足以支持在PCL中实现的所有算法和方法。但是,在某些情况下,用户希望定义新类型。

1、为什么选择点T类型

不理解可以看官方文档:
PCL中文文档—添加自己的PointT类型

2、PCL中有哪些PointT类型

  • PointXYZ-成员:浮点x,y,z;
    最常见的数据类型之一,仅表示 3D xyz 信息
    用户可以访问点[i].data[0]或者点[i].x来访问坐标
union
{
  float data[4];
  struct
  {
    float x;
    float y;
    float z;
  };
};
  • PointXYZI - 成员:浮点 x,y,z,强度;
  • PointXYZRGBA - 成员: 浮点 x, y, z;标准::uint32_t rgba;
    与 PointXYZI 类似,除了 rgba 包含打包成无符号 32 位整数的 RGBA 信息。
  • PointXYZRGB - float x, y, z;标准::uint32_t rgba;
  • PointXY - float x, y;简单的 2D x-y 点结构。
  • PointXYZRGBNormal - 浮点 x, y, z, normal[3], 曲率;标准::uint32_t rgba;
    保存 XYZ 数据和 RGBA 颜色以及曲面法线和曲率的点结构。
  • PointWithRange - float x, y, z (与浮点数[4]并集), 范围;
    与 PointXYZI 类似,除了范围包含从采集视点到世界中的点的距离的度量。

3、如何添加新的PointT类型

  1. 首先必须先定义
struct MyPointType
{
    float test;
};
  1. 确保代码包含自己希望新点类型 MyPointType 使用的 PCL 中特定类/算法的模板标头实现
#define PCL_NO_PRECOMPILE
#include 
#include 
注:从 PCL-1.7 开始,您需要在包含任何 PCL 标头之前定义PCL_NO_PRECOMPILE,以包含模板化算法。

4. 【例】

#define PCL_NO_PRECOMPILE
#include
#include
#include
#include
#include


struct MyPointType
{
	PCL_ADD_POINT4D;//添加是XYZ的首选方式
	float test;
	PCL_MAKE_ALIGNED_OPERATOR_NEW//确保新的分配器是对齐的
}EIGEN_ALIGN16;//强制SSE填充以实现正确的内存对齐

POINT_CLOUD_REGISTER_POINT_STRUCT(MyPointType,
	(float,x,y)
	(float,y,y)
	(float,z,z)
	(float,test,test)
)

int  main(int argc, char** argv)
{
	pcl::PointCloud<MyPointType>cloud;
	cloud.points.resize(2);
	cloud.width = 2;
	cloud.height = 1;

	cloud[0].test = 1;
	cloud[1].test = 2;

	cloud[0].x = cloud[0].y = cloud[0].z = 0;
	cloud[1].x = cloud[1].y = cloud[1].z = 0;

	pcl::io::savePCDFile("test.pcd", cloud);

	//打印输出点云数据
	std::cerr << "Saved:" << cloud.points.size() << std::endl;
	for (size_t i = 0; i < 2; ++i)//i
	{
		std::cerr << cloud.points[i].x << "   " 
			<< cloud.points[i].y << "   " << cloud.points[i].z<<std::endl;
	}
	return 0;
}

你可能感兴趣的:(PCL,学习,学习,计算机视觉,c++)