Как визуализировать облако точек kinect в режиме реального времени с помощью open3d

#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):