1. 程式人生 > >將ContextCapture生成的點雲資料轉化為PCL可以處理的資料格式

將ContextCapture生成的點雲資料轉化為PCL可以處理的資料格式

示例程式碼:

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)