Доступ к данным о глубине Kinect с помощью Pykinect

В настоящее время я работаю над проектом, в котором мне нужно получить доступ и обработать данные глубины, используя библиотеку PyKinect.

То, что я хочу сделать, это определить порог глубины, где я сделаю некоторую сегментацию изображения, но так как я новичок в PyKinect, и я все еще не очень хорошо знаю, где искать ресурсы, я не знаю, как получить доступ к этим данным и получить значения.

Я также пытался использовать библиотеку freenect, но не могу заставить ее работать.

Может кто-нибудь сказать мне, как это сделать или перенаправить меня к какой-то документации?

1 ответ

Решение

Я только что создал фрагмент в своей учетной записи 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 Kinect SDK (на котором основан 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 >>= 4
Другие вопросы по тегам