Python 如何从pyKinectV2 BodyGame示例获得的深度帧中获取z坐标
在使用pyKinect2 BodyGame示例玩了一段时间并进行了一些研究之后,我无法理解如何使用该关节的x和y坐标来接收关节z值 作者提到: 你们需要从深度框中得到z,使用从体关节到深度空间得到的x和y 因此,我获取深度空间中关节的x和y坐标: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[
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继承这个方法调用。