我在windows 7上使用Kynect + Python(不使用microsoft visual studio)。
有人知道如何在不使用事件循环的情况下从Kinect获取帧吗?
我指的是PyKinect/nui/init.py
这个方法def get_next_frame(self, milliseconds_to_wait = 0):
# TODO: Allow user to provide a NUI_IMAGE_FRAME ?
return self.runtime._nui.NuiImageStreamGetNextFrame(self._stream, milliseconds_to_wait)
上面的函数是我需要的,它还没有实现。我需要它按需获取帧(不使用事件循环)。
我该怎么做?
我正在使用以下环境和版本:
- Python 2.7.2
- PyKinect 2.1 b1
- Kinect传感器(from XBOX v1)
- Kinect SDK 1.8 Windows 7
你不能得到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()
函数中做的那样。