如何解决如何使用open3d实时可视化kinect点云
我想要做的是实时可视化从我的 xBox360 kinect 流式传输的数据。
本质上,我是从数据中创建一个点云,然后对其进行可视化。我的代码正在运行,但速度真的很慢。
基本上,一旦从 kinect 接收到点云,此代码就会添加点云。每当接收到另一个点云时,就会删除前一个点云并添加一个新点云。
有没有更好的方法来做到这一点?更高的帧速率响应更快
mat = rendering.Material()
mat.base_color = [
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,z]
c = c+1
return pcl
解决方法
Kinect 在每一帧中生成大约 300.000 个点,太多的数据无法绘制。在 30 FPS 下,这是一秒钟 9.000.000 点。您可以做的第一件事是对云进行下采样,您可以使用 cloud.uniform_down_sample(every_k_points)
在云的每 k 个点处取点。或者你可以修改你的读取函数,只需改变 i 和 j 的循环以每 10 个像素:
for i in range(0,480,10):
for j in range(0,640,10):
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。