在使用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值?
答案 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将为您提供您与相机之间的距离