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数组

会打印出点云文件的信息:

生成nuscenes数据集_python

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。

生成nuscenes数据集_数据挖掘_02

元组和数组的区别 因为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坐标对调了一下,结果分别如下图所示:

生成nuscenes数据集_生成nuscenes数据集_03

生成nuscenes数据集_python_04