将 32 字节二进制大端文件(LiDAR 数据)转换为 python 列表或数组

Convert 32 bytes binary big endian file (LiDAR data) to python list or array

我有一个 32 字节二进制大端格式的 LiDAR 数据集,我需要将其转换为 python 列表或数组,然后将其转换为 PCD 文件。我目前正在使用以下代码,但它仅适用于 16 字节。

我应该做哪些修改才能使代码适用于 32 字节大端文件? This 是我正在处理的文件的 link。

import open3d as o3d
import numpy as np
import os
import sys
import struct

size_float = 4
list_pcd = []
with open ("C:\Users\wilso\python\datasets\DOTX182013031901004142612.log", "rb") as f:
    byte = f.read(size_float*4)
    while byte:
        x,y,z,intensity = struct.unpack("ffff", byte)
        list_pcd.append([x, y, z])
        byte = f.read(size_float*4)
np_pcd = np.asarray(list_pcd)
pcd = o3d.geometry.PointCloud()
v3d = o3d.utility.Vector3dVector
pcd.points = v3d(np_pcd)
o3d.io.write_point_cloud("copy_of_fragment.pcd", pcd)

根据您链接到的文件的下载副本,您的代码似乎已经设置了正确的数据长度。 (有关此的更多详细信息,请参见下文。)问题是您没有告诉它使用 big-endian。在 struct.unpack 中,> 可用于此 - 参见 byte order. size and alignment.

如果您在程序中将 "ffff" 更改为 ">ffff",那么它将起作用。

然后而不是得到像这样的数字:

1.5583606204912748e-38 -112.75440216064453 8.758058715979973e+18
5.859210099898786e-23 7344.03173828125 44007040221184.0
2.734360572280704e+35 2.1044305180549755e+30 6.728572770953178e-05
862.4961547851562 -1167176.125 -9.643602918084717e+20

您会看到如下数字:

-22.08251953125 16.360233306884766 -2.3429789543151855
-21.318897247314453 16.111948013305664 -2.3769736289978027
-20.665271759033203 15.926865577697754 -2.4304943084716797
-19.91761016845703 15.659859657287598 -2.442497730255127

我认为有些混淆是因为您(误解)将 ffff 理解为 16 位,就好像每个 f 代表一个 4 位十六进制数字一样。这不是这个意思。每个f代表“float”,意思是一个32位的浮点数,这样的数有四个(x,y,z,intensity)所以有四个f。例如,如果有三个 64 位(即 double-precision)数字,那么这将是 ddd。参见:list of format characters