【问题标题】:How to get the z coordinate from the depth frame obtained by the pyKinectV2 BodyGame example如何从pyKinectV2 BodyGame例子得到的深度帧中获取z坐标
【发布时间】:2018-02-25 06:54:06
【问题描述】:

在使用 pyKinect2 BodyGame 示例并进行了一些研究之后,我无法弄清楚如何通过使用该关节的 x 和 y 坐标来接收关节 z 值。

作者提到:

您需要使用从 body_joints_to_depth_space original post on github 获得的 x 和 y 从深度帧中获取 z

所以我在深度空间中获取关节的 x 和 y 坐标:

depth_points = self._kinect.body_joints_to_depth_space(joints)
x = depth_points[PyKinectV2.JointType_Head].x
y = depth_points[PyKinectV2.JointType_Head].y

joints 是一个指针数组(由于缺少库文档,我不知道它究竟是什么),它保存了使用的 kinect 包装器提供的骨架关节的数据。 但我仍然不知道如何获得 z 坐标。

函数调用

if self._kinect.has_new_depth_frame():
self._depth = self._kinect.get_last_depth_frame()

从设备获取最后一个深度帧。 self._depth 是一个深度值数组(不是矩阵),我尝试使用 x 和 y 索引相关的深度值。 (x = 水平位置,y = 垂直位置)

第一个选项是经典的矩阵索引调用:

z = self._depth[x,y]

但正如我之前提到的 self._depth 是一个数组。 所以我尝试了第二个选项,这意味着通过使用原始图像矩阵的宽度来索引线性数组。

z = self._depth[ y * self._frame_surface.get_width() + x ]

但我得到了一个索引超出范围的异常。

self._frame_surface.get_width() 是图像矩阵的宽度,如果我正确解释的话。 (正如我之前提到的,没有 pyKinectV2 库的文档)。

所以,问题仍然存在。 如何获取骨骼关节的z值?

【问题讨论】:

    标签: python depth kinect-v2 pykinect


    【解决方案1】:

    首先,我想指出我不是 pyKinectV2 库方面的专家。但我在 Kinect V2 SDK 方面有很好的专业知识。在我浏览了 pyKinectV2 库源之后,我看到 pyKinectV2 只是 Kinect v2 Official SDK 的包装器,因此如果 pyKinectV2 已经实现了所有 SDK 功能,我的回答应该对它有效。

    joints[PyKinectV2.JointType_Head].position 应返回一个 CameraSpacePoint,其中应包含相机空间中关节的 x、y、z 坐标。

    joints[PyKinectV2.JointType_Head].position.X
    joints[PyKinectV2.JointType_Head].position.Y
    joints[PyKinectV2.JointType_Head].position.Z
    

    从戏剧上讲,这个Z应该等于该特定点的深度值

    如果要在深度帧中找到对应的深度像素,可以使用

    self._mapper.MapCameraPointToDepthSpace(joints[PyKinectV2.JointType_Head].position) 
    

    这将返回一个DepthSpacePoint。这是 Kinect SDK 使用的,pyKinectV2 内部使用的。

    您的假设是正确的,深度帧是一维 512 x 424 阵列。 首先,检查self._frame_surface.get_width() 的值,它应该返回512。我试图在pyKinectV2源中搜索_frame_surface对象,但我找不到它,所以请先验证它,因为Kinect v2输出不同的帧数据,_frame_surface可能会引用另一个帧分辨率不同于深度帧,例如彩色框架的分辨率为 1920 x 1080。

    最后,最好在从数组中访问索引之前验证索引,如下所示,

    if (y * 512 + x) =< 512*424:
       z = self._depth[ y * 512 + x ]
    

    记住一件事,没有任何保证总是有一个对应的深度像素,它的深度值就是关节的深度。因为关节(Skeleton)框架是在 BodyIndex 框架经过复杂算法后得到的。

    【讨论】:

    • 如果我尝试它,我会得到一个AttributeError: '_Joint' object has no attribute 'position',它对于“职位”也是一样的。我认为这意味着 pyKinect 没有从原始 Kinect v2 SDK 继承此方法调用。
    【解决方案2】:
       joint_points_depth = self._kinect.body_joints_to_depth_space(joints)
       x= self.round_int(int(joint_points_depth[PyKinectV2.JointType_SpineMid].x))
       y= self.round_int(int(joint_points_depth[PyKinectV2.JointType_SpineMid].y))
       z = int(self._depth[ y * 512 + x ] ) ## Its in Millimeters
    

    z 会告诉你你和相机之间的距离

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多