PCL点云自定义数据类型
PCL官方例子
PCL官方链接
The following code snippet example creates a new point type that contains XYZ data (SSE padded), together with a test float.
#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; // preferred way of adding a XYZ+padding
float test;
PCL_MAKE_ALIGNED_OPERATOR_NEW // make sure our new allocators are aligned
} EIGEN_ALIGN16; // enforce SSE padding for correct memory alignment
POINT_CLOUD_REGISTER_POINT_STRUCT (MyPointType, // here we assume a XYZ + "test" (as fields)
(float, x, x)
(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 = 3;
pcl::io::savePCDFile ("test.pcd", cloud);
}
自定义示例
参考官方是咧,可以根据自己的需求添加想要的字段信息,下面给出一个例子
struct PointXYZIRT {
PCL_ADD_POINT4D;
uint8_t intensity;
uint16_t ring;
double timestamp;
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
}EIGEN_ALIGN16;
POINT_CLOUD_REGISTER_POINT_STRUCT(PointXYZIRT,
(float, x, x)
(float, y, y)
(float, z, z)
(uint8_t, intensity, intensity)
(uint16_t, ring, ring)
(double, timestamp, timestamp)
)
转成PointXYZI
void PointXYZIRT2PointXYZI(const pcl::PointCloud<PointXYZIRT>::Ptr in_cloud_xyzirt,
pcl::PointCloud<pcl::PointXYZI>::Ptr in_cloud)
{
in_cloud->header = in_cloud_xyzirt->header;
in_cloud->width = in_cloud_xyzirt->width;
in_cloud->height = in_cloud_xyzirt->height;
in_cloud->is_dense = in_cloud_xyzirt->is_dense;
for(size_t i=0;i<in_cloud_xyzirt->points.size();i++)
{
pcl::PointXYZI p = in_cloud_xyzirt->at(i);;
p.x = in_cloud_xyzirt->points.x;
p.y = in_cloud_xyzirt->points.y;
p.z = in_cloud_xyzirt->points.z;
p.intensity = in_cloud_xyzirt->points.intensity;
in_cloud->points.push_back(p);
}
}