You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:42:10