我刚在我的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()
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)
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
然后,您可能需要显示此数据,因此您可能需要8位表示。要获取它:
arr2d >>= 4
arr2d >>= 4
):这个最后的操作将把您处理过的深度图转换为8位灰度图像。 - Vito Gentile