首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从pyKinectV2 BodyGame示例获得的深度框架中求出z坐标

如何从pyKinectV2 BodyGame示例获得的深度框架中求出z坐标
EN

Stack Overflow用户
提问于 2017-07-13 13:32:16
回答 2查看 2.1K关注 0票数 0

在使用了pyKinect2 BodyGame示例并做了一些研究之后,我想不出如何使用这个连接的x和y坐标来接收联合z值。

提交人提到:

您需要使用从body_joints_to_depth_space 关于github的原始帖子获得的x和y从深度框架中获取z。

因此,我在深度空间中获取关节的x和y坐标:

代码语言:javascript
运行
复制
depth_points = self._kinect.body_joints_to_depth_space(joints)
x = depth_points[PyKinectV2.JointType_Head].x
y = depth_points[PyKinectV2.JointType_Head].y

documentation 是一个指针数组(因为缺少库文档,所以我不知道它),它保存了由使用的kinect包装器传递的骨架连接的数据。但我还是不知道如何得到z坐标。

函数调用

代码语言:javascript
运行
复制
if self._kinect.has_new_depth_frame():
self._depth = self._kinect.get_last_depth_frame()

从设备中获取最后的深度帧。self._depth是一个深度值数组(不是矩阵),我尝试用x和y索引相关深度值。(x=水平位置,y=垂直位置)

第一个选择是典型的矩阵索引调用:

代码语言:javascript
运行
复制
z = self._depth[x,y]

但正如我前面提到的,self._depth是一个数组。因此,我尝试了第二个选项,这意味着使用原始图像矩阵的宽度来索引一个线性数组。

代码语言:javascript
运行
复制
z = self._depth[ y * self._frame_surface.get_width() + x ]

但我得到了一个超出界限的异常指数。

self._frame_surface.get_width()是图像矩阵的宽度,如果我正确解释它。(正如我前面提到的,没有pyKinectV2库的文档)。

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

EN

回答 2

Stack Overflow用户

发布于 2017-07-14 10:06:09

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

joints[PyKinectV2.JointType_Head].position应该返回一个CameraSpacePoint,它应该包含相机空间中关节的x,y,z坐标。

代码语言:javascript
运行
复制
joints[PyKinectV2.JointType_Head].position.X
joints[PyKinectV2.JointType_Head].position.Y
joints[PyKinectV2.JointType_Head].position.Z

从理论上讲,这个Z应该等于该特定点的深度值

如果要在深度帧中找到相应的深度像素,可以使用

代码语言:javascript
运行
复制
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分辨率。

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

代码语言:javascript
运行
复制
if (y * 512 + x) =< 512*424:
   z = self._depth[ y * 512 + x ]

记住一件事,没有任何保证,总是有一个对应的深度像素,其深度值是关节的深度。由于节点(骨架)框架是在BodyIndex框架经过一个复杂的算法后得到的。

票数 0
EN

Stack Overflow用户

发布于 2018-02-24 22:54:06

代码语言:javascript
运行
复制
   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会给你你和相机之间的距离

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45082176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档