Python讀取pcd點雲文件

關於Kinect採集點雲數據,可以參考https://blog.csdn.net/qq_35565669/article/details/106627639

 

有兩種方法讀取pcd文件,使用Python的庫open3d讀取,或者直接當做txt文件讀取,然後python處理數據

目錄

open3d讀取點雲

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.        ]]

可以看出與第一種方法讀取的結果相同,這驗證了第二種方法的正確性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章