基于python实现点云数据格式的转换(csv转bin,csv转pcd)
- csv转bin
import numpy as np
import os
import pandas as pd
def pointsTobin(input, output):
data = pd.read_csv(input, encoding='utf-8') # 读取csv文件
data_234 = data.iloc[:, 0:3] # 这里做的是切割,因为我这里只用到了其收集数据的第1列到第三列,即x,y,z 可根据自身需要设置
np_x = (np.array(data_234['x'], dtype=np.float32)).astype(np.float32)
np_y = (np.array(data_234['y'], dtype=np.float32)).astype(np.float32)
np_z = (np.array(data_234['z'], dtype=np.float32)).astype(np.float32)
np_i = np.zeros(shape=(np_z.size), dtype=np.float32).astype(np.float32)
points_32 = np.transpose(np.vstack((np_x, np_y, np_z, np_i)))
points_32.tofile(output)
path = "output"
data_paths = os.listdir(path)
for data_path in data_paths:
out_path = "binfolder/" + data_path.replace('.csv', '.bin')
data_path = os.path.join(path, data_path)
print(data_path)
pointsTobin(data_path, out_path)
- csv转pcd
import os
import numpy as np
import pandas as pd
def pointsTopcd(input, output):
data = pd.read_csv(input, encoding='utf-8') # 读取csv文件
data_234 = data.iloc[:, 0:3]
data_234 = np.array(data_234)
points = data_234
PCD_FILE_PATH = output
if os.path.exists(PCD_FILE_PATH):
os.remove(PCD_FILE_PATH)
handle = open(PCD_FILE_PATH, 'a')
# 得到点云点数
point_num = len(data)
# pcd头部
handle.write(
'# .PCD v0.7 - Point Cloud Data file format\nVERSION 0.7\nFIELDS x y z\nSIZE 4 4 4\nTYPE F F F\nCOUNT 1 1 1')
string = '\nWIDTH ' + str(point_num)
handle.write(string)
handle.write('\nHEIGHT 1\nVIEWPOINT 0 0 0 1 0 0 0')
string = '\nPOINTS ' + str(point_num)
handle.write(string)
handle.write('\nDATA ascii')
# 依次写入点
for i in range(point_num): # 这里我只用到了前三列,故只需展示0,1,2三列 读者可根据自身需要写入其余列
string = '\n' + str(points[i, 0]) + ' ' + str(points[i, 1]) + ' ' + str(points[i, 2])
handle.write(string)
handle.close()
path = "output"
data_paths = os.listdir(path)
for data_path in data_paths:
out_path = "pcdfolder/" + data_path.replace('.csv', '.pcd')
data_path = os.path.join(path, data_path)
print(data_path)
pointsTopcd(data_path, out_path)