点云数据预处理-bin格式与pcd格式转化(open3d库处理)
PCD格式:是常见的点云开放式存储格式,通常以文本文件的形式存储,其中包含点云数据的元数据可以根据其内容直接了解到每一列数据的具体含义,可以选择ascii 格式或binary格式进行存储,ascii格式易于阅读与编辑,binary格式无法直接阅读但可以大大节省存储空间。
BIN格式:通常采用二进制形式存储且没有点云的元数据,因此数据的存储格式需提前规定好否则数据无法解析。
在不同的项目中我们可能需要根据pcd格式与bin格式进行相互转化;
下列代码可以实现将bin或pcd文件内容批量转化。
pcd转bin格式代码:
def pcd_to_bin(pcd_read_file,bin_save_file):
#文件夹路径读取
pcd_pth = pcd_read_file
bin_pth = bin_save_file
#pcd文件加载
files = os.listdir(pcd_pth)
files = [f for f in files if f[-4:] == '.pcd']
#处理文件夹内所有pcd文件
for ic in tqdm(range(len(files)), desc='进度 '):
f = files[ic]
#当前处理的pcd文件路径生成
pcdname = os.path.join(pcd_pth, f)
#转化后保存的bin文件路径生成
binname = os.path.join(bin_pth, f[:-4] + '.bin')
#读取pcd文件
pcd = o3d.io.read_point_cloud(pcdname)
#将读取的点云数据转化为npumpy数组
points = np.array(pcd.points)
#可通过hstack添加需要保存的其余数据
#points = np.hstack((np.array(pcd.points),np.ones([len(np.array(pcd.points)),1])))
#将数据格式转化写入到bin文件中
binary_data = points.astype(np.float32).tobytes()
with open(binname, 'wb') as f: # Save as bin format
f.write(binary_data)
pcd转bin格式:在转化过程中我们通过提取pcd文件中我们需要的数据将其保存到np数组中(如果需要多列根据代码中np.hstack进行拼接),随后将其编码为byte类型保存到bin文件中即可完成pcd到bin文件的转化。
bin转pcd格式代码:
def bin_to_pcd(bin_read_file,pcd_save_file):
#文件夹路径读取
bin_pth = bin_read_file
pcd_pth = pcd_save_file
#bin文件加载
files = os.listdir(bin_pth)
files = [f for f in files if f[-4:] == '.bin']
#处理文件夹内所有bin文件
for ic in tqdm(range(len(files)), desc='进度 '):
f = files[ic]
#当前处理的bin文件路径生成
binname = os.path.join(bin_pth, f)
#转化后保存的pcd文件路径生成
pcdname = os.path.join(pcd_pth, f[:-4] + '.pcd')
#bin文件内部点云数据加载-其中3表示存储格式中存储了三列数据根据具体文件修改
points = np.fromfile(binname, dtype=np.float32).reshape(-1,3)
#创建pcd点云格式并将numpy格式的点云数据写入保存为pcd文件
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
o3d.io.write_point_cloud(pcdname,pcd, write_ascii=True)
bin转为pcd格式:由于bin文件为二进制格式保存且没有元数据我们需要通过numpy库进行读取,并且将其中的点位数据写入到pcd文件中。若bin文件中不止xyz数据则应根据列数进行reshape,后将其中的xyz数据按顺序写入到pcd的points中。
在转化过程中我们同样可以根据上一批文档中提到的write_ascii参数来确定我们保存的数据为ascii格式还是binary格式。