我目前正在进行一个项目,在这个项目中,我需要使用PyKinect库访问和处理深度数据。
我想要做的是定义一个深度阈值,在这里我要做一些图像分割,但是由于我是PyKinect新手,而且我仍然不知道在哪里查找资源,所以我不知道如何访问这些数据并获取这些值。
我也试过使用免费图书馆,但我无法让它工作。
有人能告诉我怎么做吗,或者把我转到某种文档上?
发布于 2015-05-18 12:04:35
我刚刚创建了一个我的BitBucket帐户上的代码片段,用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 ( PyKinect所基于的),单个深度像素由16位组成。三个不太有意义的指标代表玩家指数,而我还没有很好地理解最有意义的一个的含义。但假设我们需要移除最后的3位和第一位。例如,这是一个例子,说明您需要对每个像素做什么(取自这个问题):
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 >>= 4https://stackoverflow.com/questions/29655679
复制相似问题