如何使用open3d实时可视化kinect点云



我想做的是实时可视化来自我的xbox360 kinect的数据流。

本质上,我是从数据中创建一个点云,然后将其可视化。我的代码正在工作,但它真的很慢。

基本上这段代码添加了一个点云,一旦它从kinect接收。每当接收到另一个点云时,将删除前一个点云,并添加一个新的点云。

有更好的方法吗?更高帧率下的响应速度更快

mat = rendering.Material()  
mat.base_color = [
0,
0,
0, 1.0
]
mat.shader = "defaultLit"
pcl = o3d.geometry.PointCloud()
# This line recieves the data from the kinect in the format [x,y,z,r,g,b]
pcl.points = o3d.utility.Vector3dVector(kinect.streamCloud())
self.scene.scene.remove_geometry("kinect")
self.scene.scene.add_geometry("kinect", pcl, mat)

这是来自kinect的流数据代码

def streamCloud():
depth = freenect.sync_get_depth()
pcl = np.zeros(shape=(307200,3))
c = 0
for i in range(480):
for j in range(640):
z = depth[0][i,j]
#z = 1.0 / (d[i,j] * -0.0030711016 + 3.3309495161)
#z = depth[0][i,j].astype(np.uint8)
#x = (i - cx) * z / fx
x = j
y = i
#y = (j - cy) * z / fy
pcl[c] = [x,y,z]
c = c+1
return pcl

Kinect每帧生成约30万个点,数据太多,难以绘制。在30帧/秒的情况下,这是一秒钟9,000,000点。你能做的第一件事就是对云进行下采样,你可以使用cloud.uniform_down_sample(every_k_points)在云的每k个点上取点。或者你可以修改你的read函数,只是改变i和j的循环,每10取一个像素:

for i in range(0,480,10):

for j in range(0,640,10):

最新更新