0

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

作者提到:

您需要使用从 body_joints_to_depth_space 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

关节是一个指针数组(由于缺少库文档,我不知道它到底是什么),它保存了使用的 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 值?

4

2 回答 2

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

于 2018-02-24T22:54:06.067 回答
0

首先,我想指出我不是 pyKinectV2 Library 的专家。但我在 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 内部使用的。

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

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

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

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

于 2017-07-14T10:06:09.110 回答