Как распаковать / преобразовать двоичные данные в файле в читаемые значения? - PullRequest
0 голосов
/ 11 июля 2019

У меня есть файл .pcd, и когда я открываю его в текстовом редакторе, я вижу это:

# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z _
SIZE 4 4 4 1
TYPE F F F U
COUNT 1 1 1 4
WIDTH 246564
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 246564
DATA binary
É,>  Ì= €¿  €?  .>  Ì=ÃY¿  €?  .>Ì~Í= €¿  €?  2>  Ì=5a¿  €?  2>øuÍ= €¿  
€?  6>  Ì=Ûv¿  €?  6>²vÌ= €¿  €?¹“6>  Ì= €¿  €?CÊ">  Ä= €¿  €?  &  Ä=…¿
......

Документ этого формата находится здесь: http://pointclouds.org/documentation/tutorials/pcd_file_format.php

Пример из документов:

# .PCD v.7 - Point Cloud Data file format
VERSION .7
FIELDS x y z rgb
SIZE 4 4 4 4
TYPE F F F F
COUNT 1 1 1 1
WIDTH 213
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 213
DATA ascii
0.93773 0.33763 0 4.2108e+06
0.90805 0.35641 0 4.2108e+06
0.81915 0.32 0 4.2108e+06

Теперь я хочу преобразовать эти двоичные данные в числа, как в документах. Как я вижу, я могу использовать python struck.unpack, но я не мог понять, как это сделать.

1 Ответ

0 голосов
/ 11 июля 2019

Если вы хотите использовать struct, а предоставленный файл - единственный, из которого вы хотите извлечь данные, это можно сделать одним из способов:

import struct

with open("your_file.pcd") as f:
    lines = f.readlines()

unpacker = struct.Struct("fff4B")
packed_data = lines[-1]
x = []
y = []
z = []
_ = []
for i in range(0, 246564):
    try:
        unpacked = unpacker.unpack_from(packed_data[i:])
    except struct.error:
        break
    x.append(unpacked[0])
    y.append(unpacked[1])
    z.append(unpacked[2])
    _.append(unpacked[3:])

print(x)
print(y)
print(z)
print(_)

Это, конечно, неОбщий подход к анализу файлов PCD, таких как PyPCD , есть, но он работает для этого конкретного файла и набора данных.

...