關於Kinect採集點雲數據,可以參考https://blog.csdn.net/qq_35565669/article/details/106627639
有兩種方法讀取pcd文件,使用Python的庫open3d讀取,或者直接當做txt文件讀取,然後python處理數據
目錄
open3d讀取點雲
import open3d as o3d
import numpy as np
def read_pcd(file_path):
pcd = o3d.io.read_point_cloud(file_path)
print(np.asarray(pcd.points))
colors = np.asarray(pcd.colors) * 255
points = np.asarray(pcd.points)
print(points.shape, colors.shape)
return np.concatenate([points, colors], axis=-1)
注意讀取的點雲三維座標和顏色是分開的,分別是points和colors,而且colors中的RGB數據是歸一化的,所以要乘以255.
讀取的結果爲
[[ 0.49283338 1.870551 3.8150003 106. 112.
128. ]
[ 0.50465167 1.8759862 3.8260002 129. 133.
149. ]
[ 0.51545358 1.8775003 3.8290002 138. 141.
155. ]
[ 0.52380067 1.8701893 3.8140001 142. 144.
155. ]
[ 0.53598863 1.8766096 3.8270001 148. 150.
161. ]
[ 0.5481053 1.8825409 3.8390002 157. 161.
172. ]
[ 0.55548692 1.8722914 3.8180001 156. 160.
170. ]
[ 0.57120341 1.8899956 3.8540001 159. 163.
173. ]
[ 0.57821184 1.8787676 3.8310001 160. 164.
174. ]
[ 0.59047383 1.8847055 3.8430002 161. 165.
175. ]]
python直接讀取
因爲Kinect的使用是用C++,而當對點雲數據進行處理時,使用Python比較方便。pcd文件其實就是一個txt文件,裏面存儲了點雲信息,包括點雲的數目,點雲的類型(是pointxyz還是pointxyzrgb),還有點雲的寬度和高度。
這裏使用的點雲文件存儲的點是pointxyzrgb類型,每個點存儲了xyz座標信息,還有argb信息。可以看到下圖裏三個浮點數就是xyz座標了,後面的4294901502是一個32位數,argb每個通道對應了8位。要注意的是,透明度a是在RGB前面的,一般是255,所以可以看到argb的二進制數都很大。
先讀取一下點雲的大小,然後對每行數據處理,把每行的xyzrgba存進一個列表,最後轉爲numpy數組就行了。
def load_pcd_data(file_path):
pts = []
f = open(file_path, 'r')
data = f.readlines()
f.close()
line = data[9]
# print line
line = line.strip('\n')
i = line.split(' ')
pts_num = eval(i[-1])
for line in data[11:]:
line = line.strip('\n')
xyzargb = line.split(' ')
x, y, z = [eval(i) for i in xyzargb[:3]]
argb = xyzargb[-1]
# print type(bgra)
argb = bin(eval(argb))[2:]
a, r, g, b = [int(argb[8 * i:8 * i + 8], 2) for i in range(4)]
pts.append([x, y, z, a, r, g, b])
assert len(pts) == pts_num
res = np.zeros((pts_num, len(pts[0])), dtype=np.float)
for i in range(pts_num):
res[i] = pts[i]
# x = np.zeros([np.array(t) for t in pts])
return res
最後讀取的效果爲
[[ 0.49283338 1.870551 3.8150003 255. 106.
112. 128. ]
[ 0.50465167 1.8759862 3.8260002 255. 129.
133. 149. ]
[ 0.51545358 1.8775003 3.8290002 255. 138.
141. 155. ]
[ 0.52380067 1.8701893 3.8140001 255. 142.
144. 155. ]
[ 0.53598863 1.8766096 3.8270001 255. 148.
150. 161. ]
[ 0.5481053 1.8825409 3.8390002 255. 157.
161. 172. ]
[ 0.55548692 1.8722914 3.8180001 255. 156.
160. 170. ]
[ 0.57120341 1.8899956 3.8540001 255. 159.
163. 173. ]
[ 0.57821184 1.8787676 3.8310001 255. 160.
164. 174. ]
[ 0.59047383 1.8847055 3.8430002 255. 161.
165. 175. ]]
可以看出與第一種方法讀取的結果相同,這驗證了第二種方法的正確性。