数据展示:
将点云转换从kitti格式转换到pcd格式(目的是为了让CloudCompare方便读入)
批量转换脚本kitti2pcd.py
import numpy as np
import struct
import sys
import open3d as o3d
import fire
import os
def bin_to_pcd(binFileName):
size_float = 4
list_pcd = []
with open(binFileName, "rb") as f:
byte = f.read(size_float * 4)
while byte:
x, y, z, intensity = struct.unpack("ffff", byte)
list_pcd.append([x, y, z])
byte = f.read(size_float * 4)
np_pcd = np.asarray(list_pcd)
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(np_pcd)
return pcd
def convert_single(binFileName, pcdFileName):
pcd = bin_to_pcd(binFileName)
o3d.io.write_point_cloud(pcdFileName, pcd)
def convert(binFileFolder,pcdFileFolder):
for root,dirs,files in os.walk(binFileFolder):
for file_ in files:
binFileName = os.path.join(root,file_)
pcdFileName = os.path.join(pcdFileFolder,file_.replace("bin","pcd"))
convert_single(binFileName,pcdFileName)
if __name__ == "__main__":
fire.Fire()
具体使用方法,指定好目标路径和存储路径,脚本走起
python kitti2pcd.py convert D:\\velodyne D:\\velodyne_pcd
使用cloudcompare commandline 与 python脚本 从当前的工具中创建新的标量域(生成txt数据)
将上一步转换好的点云取一个放到cloudcompare中,确定下计算曲率和粗糙度的参数
使用这条命令进行高斯曲率和粗糙度的生成
CloudCompare.exe -SILENT -AUTO_SAVE OFF -O D:\\velodyne_pcd\\000001.pcd -ROUGH 6.0 -CURV GAUSS 6.0 -C_EXPORT_FMT PCD -SAVE_CLOUDS FILE "D:\\velodyne_pcd\\dst\\000001.pcd"
批量进行转换的脚本batch_convert.py
import os
import subprocess
import fire
def singleprocess(srcfile,dstfile):
command_line = "CloudCompare.exe -SILENT -AUTO_SAVE OFF -O " + srcfile + " -ROUGH 20.0 -CURV GAUSS 20.0 -C_EXPORT_FMT ASC -SAVE_CLOUDS FILE " + dstfile.replace("pcd",'txt')
process = subprocess.Popen(command_line)
process.wait()
print(srcfile,'done')
def convert(srcfilefolder, dstfilefolder):
for root,dirs,files in os.walk(srcfilefolder):
for file_ in files:
srcFileName = os.path.join(root,file_)
dstFileName = os.path.join(dstfilefolder,file_)
singleprocess(srcFileName,dstFileName)
if __name__ == "__main__":
fire.Fire()
批量转换脚本走起
python batch_convert.py convert d:\\velodyne_pcd d:\\velodyne_dst
将生成的数据转换到kitti格式(转换成原来的格式,方便进行后续例如深度学习的处理)
脚本名字 ascii2bin.py
import os
import numpy as np
dst_folder = "d:\\velodyne_c_r"
src_folder = "d:\\velodyne_dst"
for root,dirs,files in os.walk(src_folder):
for f in files:
if 'pcd' in f:
continue
# load into numpy array
a_f = os.path.join(src_folder,f)
d_f = os.path.join(dst_folder,f.replace('.txt','.pcd'))
file_data = np.loadtxt(a_f,dtype=np.float32 ,encoding='latin-1')
# save to target file
file_data.reshape(-1,5).astype(np.float32)
file_data.tofile(d_f)
print(f,"done")
脚本走起
python ascii2bin.py