Python_處理陣列式點云_讀取

前言
本文使用的模塊是numpy和ctypes,解析內(nèi)存里的數(shù)據(jù),并將之轉(zhuǎn)換為numpy數(shù)組
導入模塊:

正文
????原始數(shù)組在內(nèi)存里是以一維字節(jié)數(shù)組形式排列,需要把一維的字節(jié)數(shù)組轉(zhuǎn)為numpy數(shù)組,我們需要知道幾個預(yù)設(shè)值:
1. 點陣的尺寸(寬度width和高度height),用于初始numpy數(shù)組的shape屬性。
2. 點陣的通道數(shù),通常一個點包含了 X Y Z三個通道值,對于不同的傳感器,獲取的點陣信息結(jié)構(gòu)也不一樣,這里舉幾個常見的數(shù)據(jù)信息格式:
xyz_float32:xyz坐標值,用float32四字節(jié)表示一個值
總數(shù)據(jù)長度3*4*width*height
xyz_uint16:xyz坐標值,用uint16雙字節(jié)表示一個值
總數(shù)據(jù)長度(3*2+2)*width*height
xyzijk_float32: 在xyz_float32的基礎(chǔ)上,增加單位法向量值ijk
總數(shù)據(jù)長度6*4*width*height
xyzg_float32: 在xyz_float32的基礎(chǔ)上,增加灰度值gray
總數(shù)據(jù)長度(3*4+1+1)*width*height
xyzrgb_float32: 在xyz_float32的基礎(chǔ)上,增加r,g,b值
總數(shù)據(jù)長度(3*4+3*1+1)*width*height
等...以上格式中,未滿4字節(jié)的信息,一般會使用四字節(jié)對齊。比如xyzrgb_float32,xyz分別使用3個float32,rgb分別使用3個ubyte,共計15個字節(jié),為了對齊4字節(jié),會在最后補齊一字節(jié),做到16字節(jié)結(jié)構(gòu)。

知道上述兩點后,進入讀取數(shù)據(jù)環(huán)節(jié):
已經(jīng)三個變量,w(寬),h(高),data_ptr(原始數(shù)據(jù)數(shù)組指針)。
定義numpy數(shù)據(jù)格式,參照原始數(shù)據(jù)格式
names:通道名稱
formats:通道數(shù)據(jù)格式,'f4'表示四個字節(jié)長度的浮點數(shù),和原始數(shù)據(jù)保持一致
offsets:通道在原始字節(jié)中的偏移量
titles:另外一個名稱(具體不知道)
itemsize:單點數(shù)據(jù)長度,字節(jié)單位
申請一個內(nèi)存,用以存點陣字節(jié)數(shù)組
解析數(shù)據(jù)
得到了一個一維數(shù)組,對象是我們定義的dtype數(shù)據(jù)結(jié)構(gòu),這里已經(jīng)可以通過索引讀取對應(yīng)的數(shù)據(jù)值,注意此時是一維數(shù)組,當我們輸入像素坐標時[x,y]需要通過公式變換:
查找一個像素位置[100,100]的點信息:

最后,結(jié)構(gòu)體化的數(shù)組并不適合我們后續(xù)做數(shù)據(jù)處理,因此我們需要把結(jié)構(gòu)體數(shù)組轉(zhuǎn)換為非結(jié)構(gòu)體數(shù)組
這里為了后續(xù)處理方便,G,M通道原本Ubyte格式的數(shù)據(jù),也強制轉(zhuǎn)為float32格式。

END