如何从pyKinectV2 BodyGame示例获得的深度帧中获取z坐标

时间:2017-07-13 13:32:16

标签: python depth kinect-v2 pykinect

在使用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

joint 是一个指针数组(由于缺少库文档,我完全不知道它),它包含由使用过的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 lib的文档。)

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

2 个答案:

答案 0 :(得分:0)

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

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在内部使用的内容。

您的假设是正确的,深度帧是1D 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框架经过复杂算法后获得的。

答案 1 :(得分:0)

   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将为您提供您与相机之间的距离