1

我正在尝试使用 PyKinect2 模块从 Kinect v2 设备获取深度帧。我已按照此处提供的示例进行操作。我能够看到深度帧,但它们出现在 PyGame 窗口中被截断,尽管帧的大小应该是 512x424。

depth_frame

我使用get_last_depth_frame()PyKinect2 提供的方法,并使用以下代码将其绘制在表面上。

def draw_depth_frame(self, frame, target_surface):
    target_surface.lock()
    address = self._kinect.surface_as_array(target_surface.get_buffer())
    ctypes.memmove(address, frame.ctypes.data, frame.size)
    del address
    target_surface.unlock()
4

2 回答 2

1

我没有评论的声誉。所以我把它写在这里。我认为您需要 3 个通道来将内存填充到所需的长度。尝试这个

f8=np.uint8(frame.clip(1,4000)/16.)    
frame8bit=np.dstack((f8,f8,f8))

然后 memmove 从 frame8bit 而不是原始帧。

于 2018-08-02T01:46:52.043 回答
0

首先,您必须将Surface大小更改为 24 位:

__init__(self)功能上:

self._depth_frame_surface = pygame.Surface((self._kinect.depth_frame_desc.Width,
self._kinect.depth_frame_desc.Height),
0, 24)

然后你应该改变self._screen取深度框架的宽度和高度:

self._screen = pygame.display.set_mode((self._kinect.depth_frame_desc.Width,
self._kinect.depth_frame_desc.Height), pygame.HWSURFACE | pygame.DOUBLEBUF | pygame.RESIZABLE,
32)

最后像@Shuangjun一样画出深度框建议:

def draw_depth_frame(self, frame, target_surface):
    target_surface.lock()
    f8 = np.uint8(frame.clip(1, 4000) / 16.)
    frame8bit = np.dstack((f8, f8, f8))
    address = self._kinect.surface_as_array(target_surface.get_buffer())
    ctypes.memmove(address, frame8bit.ctypes.data, frame8bit.size)
    del address
    target_surface.unlock()
于 2018-09-01T12:07:43.467 回答