Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Pykinect访问Kinect深度数据_Python_Kinect_Pykinect - Fatal编程技术网

Python 使用Pykinect访问Kinect深度数据

Python 使用Pykinect访问Kinect深度数据,python,kinect,pykinect,Python,Kinect,Pykinect,我目前正在从事一个项目,需要使用PyKinect库访问和处理深度数据 我想做的是定义一个深度阈值,在这里我将进行一些图像分割,但是由于我是PyKinect的新手,我仍然不知道在哪里查找资源,我不知道如何访问该数据并获取值 我也尝试过使用freenect库,但我无法让它工作 有人能告诉我怎么做,或者把我重定向到某种文档中吗?我刚刚创建了一个应用PyKinect和Pygame可视化深度图像的工具。代码如下: import thread import pygame from pykinect impo

我目前正在从事一个项目,需要使用PyKinect库访问和处理深度数据

我想做的是定义一个深度阈值,在这里我将进行一些图像分割,但是由于我是PyKinect的新手,我仍然不知道在哪里查找资源,我不知道如何访问该数据并获取值

我也尝试过使用freenect库,但我无法让它工作

有人能告诉我怎么做,或者把我重定向到某种文档中吗?

我刚刚创建了一个应用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位和第一位。例如,这是您需要为每个像素执行的操作的示例(取自):

上述操作(删除最后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

我想做的是,在深度之间设置一个层,以仅捕获我伸出的手,并对其进行一些图像处理,而不是获取深度贴图。我想知道并理解如何从深度图中获取实际值。我刚刚编辑了我的答案。在第一种解决方案中,我处理了位,以便将它们显示为灰度图像。如果需要获取实际的深度数据,只需使用我刚才添加的第二个代码段。如果在某些处理后需要显示深度数据,只需在显示之前执行最后一次移位(
arr2d>=4
):最后一次操作将在8位灰度图像中转换处理后的深度贴图。谢谢,这将完成我正在尝试的操作,我不知道如何解释深度图,我猜测PyKinect中有一个函数,在给定阈值或类似的情况下过滤任何不需要的深度数据。
arr2d >>= 4