本文主要介绍将ContextCapture生成的点云数据转化为PCL可以处理的数据格式,即通过在ContextCapture生成的点云数据前面加上一些文件头。
示例代码:
file = open('point2.txt')
# 读取所需数据
val_list = file.readlines()
list_x = []
list_y = []
list_z = []
list_rgb = []
for string in val_list:
str2 = string.split(' ')
list_x.append(float(str2[0]))
list_y.append(float(str2[1]))
list_z.append(float(str2[2]))
'''
pcd文件中的格式为x y z rgb而不是分开的r g b,所以在原数据的基础上要进行变形,
由r g b得到rgb(float):int rgb = ((int)r << 16 | (int)g << 8 | (int)b); 式中的“<<”为左移符号;
由rgb得到r g b(int):int r = (rgb >> 16) & 0x0000ff; int g = (rgb >> 8) & 0x0000ff;
int b = (rgb) & 0x0000ff;
'''
list_rgb.append(int(str2[3])<<16 | int(str2[4])<<8 | int(str2[5]))
max1 = max(list_x)
min1 = min(list_x)
length1 = max1 - min1
max2 = max(list_y)
min2 = min(list_y)
length2 = max2 - min2
max3 = max(list_z)
min3 = min(list_z)
length3 = max3 - min3
# 数据归一化
list_x_r = []
list_y_r = []
list_z_r = []
for i in range(len(list_x)):
list_x_r.append(((list_x[i] - min1) / length1))
list_y_r.append((list_y[i] - min2) / length2)
list_z_r.append((list_z[i] - min3) / length3)
# 导出所需数据
with open('result.pcd', 'w') as f: # 设置文件对象
# 写入文件头
f.write('# .PCD v.7 - Point Cloud Data file format\n'
'VERSION .7\n'
'FIELDS x y z rgb\n'
'SIZE 4 4 4 4\n'
'TYPE F F F F\n'
'COUNT 1 1 1 1\n'
'WIDTH ' + str(len(list_x_r)) + '\n'
'HEIGHT 1\n'
'VIEWPOINT 0 0 0 1 0 0 0\n'
'POINTS ' + str(len(list_x_r)) + '\n'
'DATA ascii\n')
# 写入坐标数据和颜色数据
for i in range(len(list_x_r)):
stringr = str(list_x_r[i]) + ' ' + str(list_y_r[i]) + ' ' + str(list_z_r[i]) + ' ' + str(list_rgb[i]) +'\n'
f.write(stringr)