使用Pykinect访问Kinect深度数据 [英] Access Kinect Depth Data with Pykinect

查看:18
本文介绍了使用Pykinect访问Kinect深度数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在进行一个项目,在该项目中我需要使用PyKinect库访问和处理深度数据。

我想要做的是定义一个深度阈值,我将在其中进行一些图像分割,但由于我不熟悉PyKinect,而且我仍然不太清楚在哪里查找资源,我不知道如何访问这些数据并获得值。

我也尝试使用freenect库,但无法使其正常工作。

有人能告诉我如何做到这一点吗?或者将我重定向到某种文档?

推荐答案

我刚刚创建了一个snippet on my BitBucket account来用PYKINECT和PYGAME可视化深度图像。代码如下:

import thread
import pygame
from pykinect import nui

DEPTH_WINSIZE = 320,240

screen_lock = thread.allocate()
screen = None

tmp_s = pygame.Surface(DEPTH_WINSIZE, 0, 16)


def depth_frame_ready(frame):
    with screen_lock:
        frame.image.copy_bits(tmp_s._pixels_address)
        arr2d = (pygame.surfarray.pixels2d(tmp_s) >> 7) & 255
        pygame.surfarray.blit_array(screen, arr2d)

        pygame.display.update()


def main():
    """Initialize and run the game."""
    pygame.init()

    # Initialize PyGame
    global screen
    screen = pygame.display.set_mode(DEPTH_WINSIZE, 0, 8)
    screen.set_palette(tuple([(i, i, i) for i in range(256)]))
    pygame.display.set_caption('PyKinect Depth Map Example')

    with nui.Runtime() as kinect:
        kinect.depth_frame_ready += depth_frame_ready   
        kinect.depth_stream.open(nui.ImageStreamType.Depth, 2, nui.ImageResolution.Resolution320x240, nui.ImageType.Depth)

        # Main game loop
        while True:
            event = pygame.event.wait()

            if event.type == pygame.QUIT:
                break

if __name__ == '__main__':
    main()

编辑:上面的代码显示了如何将深度数据转换为8位表示形式(以便可以轻松地将它们绘制为灰度图像)。但如果您想要使用实际深度数据,您需要知道它们是如何构造的。

使用Microsoft Kinect SDK(PyKinect所基于的),单个深度像素由16位组成。3个不太有意义的词代表了球员指数,而我还没有很好地理解最有意义的一个的意思。但假设我们需要删除最后3位和第一位。例如,以下是您需要为每个像素执行的操作的示例(摘自this question):

0 1 1 0 0 0 1 0 0 0 1 1 1 0 0 0 - 16 bits number
0 1 1 0 0 0 1 0 0 0 1 1 1       - 13 bits number
  1 1 0 0 0 1 0 0 0 1 1 1       - 12 bits number
上述操作(删除后3位和第一位)可以通过对arr2d数组进行两次逐位操作来实现。因为它是一个NumPy数组,所以您可以按如下步骤进行:

def depth_frame_ready(frame):
    frame.image.copy_bits(tmp_s._pixels_address)

    arr2d = (pygame.surfarray.pixels2d(tmp_s) >> 3) & 4095
    # arr2d[x,y] is the actual depth measured in mm at (x,y)
然后,您可能需要显示此数据,因此您可能需要8位表示形式。要获得它:

arr2d >>= 4

这篇关于使用Pykinect访问Kinect深度数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆