#python #kinect #open3d
#python #kinect #open3d
Вопрос:
Что я хочу сделать, так это визуализировать данные, передаваемые из моего 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
Ответ №1:
Kinect генерирует около 300 000 точек в каждом кадре, слишком много данных для рисования. При 30 кадрах в секунду это составляет 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):