PCL学习02之自定义PointT类型

6 篇文章 2 订阅
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 <pcl/filters/passthrough.h>
#include <pcl/filters/impl/passthrough.hpp>
注:从 PCL-1.7 开始,您需要在包含任何 PCL 标头之前定义PCL_NO_PRECOMPILE,以包含模板化算法。

4. 【例】

#define PCL_NO_PRECOMPILE
#include<pcl/memory.h>
#include<pcl/pcl_macros.h>
#include<pcl/point_types.h>
#include<pcl/point_cloud.h>
#include<pcl/io/pcd_io.h>


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<cloud.points.size()
	{
		std::cerr << cloud.points[i].x << "   " 
			<< cloud.points[i].y << "   " << cloud.points[i].z<<std::endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值