pcd点云文件成功转成npy文件

pcd点云文件成功转成npy文件

文章目录

  • pcd点云文件成功转成npy文件
  • 前言
  • 一、安装pypcd
  • 二、读取pcd文件并修改
    • 1.list(tuple)转numpy array
    • 2.保存文件


前言

使用OpenPCDet平台进行3D激光点云的障碍物检测模型的训练,但是平台本身支持的格式是.bin文件,我们的点云数据是.pcd文件,尝试了直接读取pcd文件未果,所以需要进行格式转换,转成npy格式进行训练。

一、安装pypcd

详细步骤请见上一篇博客:
安装pypcd教程

二、读取pcd文件并修改

python
from pypcd import pypcd
cloud=pypcd.PointCloud.from_path('文件存放路径/文件名.pcd')
import pprint
pprint.pprint(cloud.get_metadata())
import numpy as np
new = cloud.pc_data.copy() //把数据复制给new数组

会打印出点云文件的信息:
pcd点云文件成功转成npy文件_第1张图片

1.list(tuple)转numpy array

导入数据后,因为要与kitti数据集做对标进行测试,所以数据格式需要保持统一,OpenPCDet的测试demo里对点云的要求如图所示,一共有四个参数,应该是(N, 4),包括[x, y, z, intensity],其中intensity范围是【0-1】,都一样可以置为0。
跟上图对比一下可以发现,我们要做的有:
1.把第5、6列删掉,预训练模型中没有这两个参数。
2.因为pcd文件中的intensity的值不在要求的0-1范围内,把第四列置为0。

pcd点云文件成功转成npy文件_第2张图片
元组和数组的区别
因为list(tuple)数据格式的数据无法进行更改,所以需要转换成numpy array的格式,网上有方法如下:

Converting a List of Tuples to numpy array results in single dimension

测试之后发现不行,又找到下面这个方法:
python: how to convert list of tuples to numpy array

代码如下(接上文代码):

acc=np.array([list(new) for new in new]) //把元组转成数组元素,并把结果传到acc数组

把第5、6列删掉,第四列置为0:

acc=np.delete(acc,[4,5],1)
acc[:,3]=0

2.保存文件

需要先根据Pypcd教程文档转存为pcd文件,然后再读取此文件,存为npy文件。
这么做的原因目前不太清楚,只是不先存为pcd文件后面使用OpenPCDet测试就会报错。

acc[:,[0,1]]=acc[:,[1,0]]
new_cloud = pypcd.make_xyz_label_point_cloud(acc)
new_cloud.save_pcd('路径/文件名.pcd', compression='binary_compressed')
cloud2=pypcd.PointCloud.from_path('路径/文件名.pcd')
new2 = cloud2.pc_data.copy()
acc2=np.array([list(new2) for new2 in new2])
np.save('/home/xie/OpenPCDet/tools/data/kitti/training/test/test.npy',acc2)

acc[:,[0,1]]=acc[:,[1,0]] 这一行是后期使用OpenPCDet测试的时候发现有bug,应该是自己数据集的坐标系定义与kitti的不同,所以尝试着把xy坐标对调了一下,结果分别如下图所示:
pcd点云文件成功转成npy文件_第3张图片pcd点云文件成功转成npy文件_第4张图片

你可能感兴趣的:(深度学习,3D点云目标检测,PCL,机器学习,python,数据挖掘)