Python_处理阵列式点云_读取

前言
本文使用的模块是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]需要通过公式变换:
查找一个像素位置[100,100]的点信息:

最后,结构体化的数组并不适合我们后续做数据处理,因此我们需要把结构体数组转换为非结构体数组
这里为了后续处理方便,G,M通道原本Ubyte格式的数据,也强制转为float32格式。

END