使用Pykinect获取Kinect Xbox360骨骼关节数据报错,求解决方案
解决Kinect Xbox360骨骼数据获取的属性错误问题
你遇到的问题是因为适配Python3.6的这个pykinect版本中,frame.SkeletonData的返回结构和你预期的不一样,直接用enumerate拆分索引和数据的方式并不适配这个库的实现逻辑。
错误原因
这个版本的pykinect里,frame.SkeletonData返回的是一组骨骼对象的集合,每个对象本身就封装了追踪状态、关节位置等数据,不需要用enumerate来拆分索引和数据——直接遍历每个骨骼对象即可。
修正后的代码
首先确保导入必要的枚举类型:
import pykinect.nui as nui from pykinect.nui import JointId, TrackingState
然后修改你的skeleton_frame_ready函数:
def skeleton_frame_ready(frame): # 遍历所有骨骼数据 for skeleton in frame.SkeletonData: # 先判断当前骨骼是否被成功追踪 if skeleton.eTrackingState == TrackingState.Tracked: # 获取头部关节的位置对象 head_position = skeleton.SkeletonPositions[JointId.Head] # 打印头部的三维坐标(保留两位小数更易读) print(f"头部位置:X={head_position.x:.2f}, Y={head_position.y:.2f}, Z={head_position.z:.2f}") else: # 可选:打印未被追踪的骨骼状态,方便调试 print(f"骨骼追踪状态:{skeleton.eTrackingState}")
关键说明
- 追踪状态检查:必须先判断骨骼的
eTrackingState是否为Tracked,否则访问未被追踪的骨骼关节可能会返回无效数据,甚至引发额外错误。 - 关节位置访问:每个关节的位置是一个包含
x、y、z属性的对象,直接通过这些属性就能获取三维坐标值。 - 遍历方式:直接遍历
frame.SkeletonData中的每个骨骼对象即可,不需要额外的索引拆分操作。
你的初始化代码是正确的,保持原样即可:
kinect = nui.Runtime() kinect.video_stream.open(nui.ImageStreamType.Video,2,nui.ImageResolution.Resolution640x480,nui.ImageType.Color) kinect.depth_stream.open(nui.ImageStreamType.Depth, 2, nui.ImageResolution.Resolution640x480, nui.ImageType.Depth) kinect.skeleton_frame_ready += skeleton_frame_ready kinect.skeleton_engine.enabled=True
内容的提问来源于stack exchange,提问作者Ajai
相关产品推荐
相关产品推荐

