日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python读取pcd文件_Python读取pcd点云文件

發布時間:2023/12/16 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python读取pcd文件_Python读取pcd点云文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有兩種方法讀取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信息??梢钥吹较聢D里三個浮點數就是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. ]]

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

總結

以上是生活随笔為你收集整理的python读取pcd文件_Python读取pcd点云文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。