欢迎光临散文网 会员登陆 & 注册

Python_处理阵列式点云_读取

2023-03-31 18:43 作者:Z5  | 我要投稿

前言

本文使用的模块是numpy和ctypes,解析内存里的数据,并将之转换为numpy数组

导入模块:

正文

    原始数组在内存里是以一维字节数组形式排列,需要把一维的字节数组转为numpy数组,我们需要知道几个预设值:

1. 点阵的尺寸(宽度width和高度height),用于初始numpy数组的shape属性。

2. 点阵的通道数,通常一个点包含了 X Y Z三个通道值,对于不同的传感器,获取的点阵信息结构也不一样,这里举几个常见的数据信息格式:

xyz_float32:xyz坐标值,用float32四字节表示一个值

总数据长度3*4*width*height

xyz_uint16:xyz坐标值,用uint16双字节表示一个值

总数据长度(3*2+2)*width*height

xyzijk_float32: 在xyz_float32的基础上,增加单位法向量值ijk

总数据长度6*4*width*height

xyzg_float32: 在xyz_float32的基础上,增加灰度值gray

总数据长度(3*4+1+1)*width*height

xyzrgb_float32: 在xyz_float32的基础上,增加r,g,b值

总数据长度(3*4+3*1+1)*width*height

等...以上格式中,未满4字节的信息,一般会使用四字节对齐。比如xyzrgb_float32,xyz分别使用3个float32,rgb分别使用3个ubyte,共计15个字节,为了对齐4字节,会在最后补齐一字节,做到16字节结构。

知道上述两点后,进入读取数据环节:

已经三个变量,w(宽),h(高),data_ptr(原始数据数组指针)。

定义numpy数据格式,参照原始数据格式

names:通道名称

formats:通道数据格式,'f4'表示四个字节长度的浮点数,和原始数据保持一致

offsets:通道在原始字节中的偏移量

titles:另外一个名称(具体不知道)

itemsize:单点数据长度,字节单位

申请一个内存,用以存点阵字节数组

解析数据

得到了一个一维数组,对象是我们定义的dtype数据结构,这里已经可以通过索引读取对应的数据值,注意此时是一维数组,当我们输入像素坐标时[x,y]需要通过公式变换:

index%3Dx%2By*widht

查找一个像素位置[100,100]的点信息:

最后,结构体化的数组并不适合我们后续做数据处理,因此我们需要把结构体数组转换为非结构体数组

这里为了后续处理方便,G,M通道原本Ubyte格式的数据,也强制转为float32格式。

END


Python_处理阵列式点云_读取的评论 (共 条)

分享到微博请遵守国家法律