由于我的ply三维点云是python导出的,现在要基于c++ pcl库处理。结果我发现python保存后点云xyz都是双精度(python没有单精度),而PCL 点云类型xyz都用的float,这导致无法将python导出的双精度三维点云读入PCL自带的点云类型,因此需要自定义一个double xyz的点云类型。
代码如下:
// 自定义点云类型
struct MyPoint
{
double x, y, z; // xyz
union
{
struct
{
//rgb顺序不能乱,要不然加载后rgb错乱
std::uint8_t b; // 蓝色通道
std::uint8_t g; // 绿色通道
std::uint8_t r; // 红色通道
std::uint8_t a; // alpha通道
};
std::uint32_t rgba; // 整体颜色信息
};
EIGEN_MAKE_ALIGNED_OPERATOR_NEW // 矩阵对齐
} EIGEN_ALIGN16;
// 注册点云类型 xyz都是double
POINT_CLOUD_REGISTER_POINT_STRUCT(MyPoint,
(double, x, x)
(double, y, y)
(double, z, z)
(std::uint32_t, rgba, rgba))
int main{
// 加载自定义点云
pcl::PointCloud<MyPoint>::Ptr cloud(new pcl::PointCloud<MyPoint>);
pcl::io::loadPLYFile("R1_C1_nosoil.ply", *cloud);
}
其中需要注意的是自定义类中,rgb的顺序要是bgr,不然加载进来的点云rgb会错乱。