您无法“按需”获得 RGB 或深度或骨架框架。Kinect 数据由事件提供,因此您必须使用它们来获取数据。
要解决这个基于事件的系统,唯一可以做的是将数据保存在全局变量中,然后在需要时读取该变量。
例如,假设您将一个名为的函数depth_frame_ready
关联到与深度数据相关的事件:
from pykinect import nui
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)
您可以编写depth_frame_ready
函数以将数据保存在全局变量上(比如说depth_data
)。您还需要一种同步机制来读取和写入该变量(Lock
避免同时写入和读取的简单方法):
import threading
import pygame
DEPTH_WINSIZE = 320,240
tmp_s = pygame.Surface(DEPTH_WINSIZE, 0, 16)
depth_data = None
depth_lock = threading.Lock()
def update_depth_data(new_depth_data):
global depth_data
depth_lock.acquire()
depth_data = new_depth_data
depth_lock.release()
#based on https://bitbucket.org/snippets/VitoGentile/Eoze
def depth_frame_ready(frame):
# Copy raw data in a temp surface
frame.image.copy_bits(tmp_s._pixels_address)
update_depth_data((pygame.surfarray.pixels2d(tmp_s) >> 3) & 4095)
现在,如果您需要使用深度数据,您可以随时参考全局变量。
global depth_data
if depth_data is not None:
#read your data
记得使用depth_lock
来同步访问,就像update_depth_data()
函数中所做的那样。