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类型
- 首先必须先定义
struct MyPointType
{
float test;
};
- 确保代码包含自己希望新点类型 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;
}