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

Python 如何从pyKinectV2 BodyGame示例获得的深度帧中获取z坐标,python,depth,kinect-v2,pykinect,Python,Depth,Kinect V2,Pykinect,在使用pyKinect2 BodyGame示例玩了一段时间并进行了一些研究之后,我无法理解如何使用该关节的x和y坐标来接收关节z值 作者提到: 你们需要从深度框中得到z,使用从体关节到深度空间得到的x和y 因此,我获取深度空间中关节的x和y坐标: depth_points = self._kinect.body_joints_to_depth_space(joints) x = depth_points[PyKinectV2.JointType_Head].x y = depth_points[

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

作者提到:

你们需要从深度框中得到z,使用从体关节到深度空间得到的x和y

因此,我获取深度空间中关节的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.\u depth是深度值的数组(不是矩阵),我尝试使用x和y索引相关的深度值。(x=水平位置,y=垂直位置)

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

z = self._depth[x,y]
但正如我在赛尔夫之前提到的,深度是一个数组。 因此,我尝试了第二种方法,即使用原始图像矩阵的宽度对线性阵列进行索引

z = self._depth[ y * self._frame_surface.get_width() + x ]
但我得到了一个索引越界异常

self.\u frame\u surface.get\u width()是图像矩阵的宽度,如果我正确解释了它。(正如我前面提到的,PyKineTv2库没有文档)

因此,这个问题仍然存在。
如何获得骨架关节的z值?

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

关节[PyKinectV2.JointType_Head]。位置
应返回一个
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) 
它将返回一个
深度空间点
。这就是Kinect SDK正在使用的内容,也是PyKinect V2在内部使用的内容

您的假设是正确的,深度帧是1D 512 x 424阵列。 首先,检查self.\u frame\u surface.get\u width()的值,它应该返回
512
。我试图在PyKinect v2源代码中搜索
\u frame\u surface
对象,但我找不到它,因此请先验证它,因为Kinect v2输出不同的帧数据,
\u frame\u surface
可能指的是分辨率不同于深度帧的另一帧,例如,彩色边框的分辨率为1920 x 1080

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

if (y * 512 + x) =< 512*424:
   z = self._depth[ y * 512 + x ]
如果(y*512+x)=<512*424:
z=自深度[y*512+x]
请记住一件事,不能保证始终存在相应的深度像素,其深度值是关节的深度。因为关节(骨架)帧是在BodyIndex帧经过复杂算法后获得的

   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将给出你和相机之间的距离

如果我尝试,我会得到一个
属性错误:''u Joint'对象没有属性'position'
,对于'positions'也是一样的。我认为这意味着pyKinect没有从原始的Kinect v2 SDK继承这个方法调用。