由于项目需要,故将采集到的点云数据进行归一化,原始的点云数据为*.xyz格式,即只包含每个点的x、y、z三维空间坐标。这里进行的是等比例归一化,将z坐标归一化到 [ -0.5 , 0.5 ] 区间,x 和y坐标归一化到等比例区间。
import numpy as np
#将.xyz文件中的数据加载为Numpy数组
def load_xyz(file_path):
with open(file_path, 'r') as f:
data = []
for line in f:
x, y, z = map(float, line.split())
data.append([x, y, z])
return np.array(data)
#保存*.xyz文件
def save_xyz(file_path, data):
with open(file_path, 'w') as f:
for point in data:
f.write(' '.join(map(str, point)) + '\n')
#加载原始*.xyz文件
data = load_xyz('input/path')
#获取坐标的最大最小值
x_min, x_max = data[:,0].min(), data[:,0].max()
y_min, y_max = data[:,1].min(), data[:,1].max()
z_min, z_max = data[:,2].min(), data[:,2].max()
#计算差距
x_range = x_max - x_min
y_range = y_max - y_min
z_range = z_max - z_min
#进行归一化
data_norm = np.copy(data)
data_norm[:,0] = ((data[:,0] - x_min) / x_range - 0.5) * x_range / z_range
data_norm[:,1] = ((data[:,1] - y_min) / y_range - 0.5) * y_range / z_range
data_norm[:,2] = (data[:,2] - z_min) / z_range - 0.5
#保存归一化后的数据
save_xyz('output/path', data_norm)