本公开的实施例总体涉及计算机处理,并且更具体地,涉及3d图像中的运动分析。
背景技术:
计算机视觉已被使用来针对各种各样的用途而分析来自现实世界的图像。一个示例是针对电子设备提供自然用户界面(“nui”)。在一种nui技术中,捕获并分析用户的3d图像以识别某些姿势(pose)或姿态(gesture)。因此,用户可以做出姿态来提供输入,以便控制诸如计算机游戏或多媒体应用这样的应用。在一种技术中,系统将用户建模为具有由“骨头”连接的关节的骨骼(skeleton),并寻找在关节、骨头位置等之间的某些角度以检测姿态。
这样的技术作为nui运作良好。然而,一些应用要求对用户运动的更精确理解和分析。
技术实现要素:
本文公开了针对用于分析3d图像中的用户运动的运行时间引擎(runtimeengine)的系统和方法。运行时间引擎能够依赖于运动是什么来使用不同的技术分析用户的运动。运行时间引擎可以挑选依赖于骨骼跟踪数据的技术和/或取而代之地使用图像分割(imagesegmentation)数据的技术来确定用户是否正在实施正确的运动。运行时间引擎可以基于正在实施什么运动来确定如何对用户的表现(performance)实施位置分析或时间/运动分析。
一个实施例包括一种方法,该方法包括以下内容。访问人的图像数据。将图像数据输入到在计算设备上执行的运行时间引擎。运行时间引擎具有用于实现不同技术来分析姿态的代码。确定使用哪些技术来分析具体姿态。执行运行时间引擎中的代码以实现所确定的技术来分析具体姿态。
一个实施例包括一种系统,所述系统包括:捕获设备,其捕获跟踪用户的3d图像数据;以及处理器,其与捕获设备通信。处理器被配置成访问人的3d图像数据以及将图像数据输入到运行时间引擎,所述运行时间引擎具有用于使用不同技术来分析姿态的代码。所述处理器确定使用哪些技术来分析具体姿态。所述处理器执行运行时间引擎中的代码以实现所确定的技术来分析具体姿态。
一个实施例包括一种计算机可读存储介质,所述计算机可读存储介质包括处理器可读代码,所述处理器可读代码用于将处理器编程为:访问实施运动的人的3d图像数据,从3d图像数据形成骨骼跟踪数据,以及从3d图像数据形成图像分割数据。所述处理器可读代码还用于将处理器编程为:确定是使用骨骼跟踪数据还是图像分割数据来确定人是否正在实施某项具体的体育锻炼。所述处理器可读代码还用于将处理器编程为:基于具体的体育锻炼而确定使用运行时间引擎的哪些技术来分析人的具体体育锻炼的表现。所述处理器可读代码还用于将处理器编程为:提供对人的具体体育锻炼的表现的评价。
本概要被提供来以简化的形式介绍概念的选择,这些概念还将在下面的详细说明中进行描述。本概要既不打算标识所要求保护的主题的关键特征或必要特征,也不用于帮助确定所要求保护的主题的范围。此外,所要求保护的主题不限于解决了在本公开内容的任何部分中提到的任何或所有缺点的实现。
附图说明
图1a和图1b图示了跟踪用户的跟踪系统的示例实施例。
图2图示了可以被用作跟踪系统的一部分的捕获设备的示例实施例。
图3a是分析用户运动的过程的一个实施例的流程图。
图3b是运行时间引擎的一个实施例的图。
图3c是基于正在分析什么运动而在运行时间引擎中选择代码的过程的一个实施例的流程图。
图3d是示出了运行时间引擎的深度识别器的一个实施例的另外细节的图。
图3e是示出了运行时间引擎的移动识别器的一个实施例的另外细节的图。
图3f是示出了运行时间引擎的位置分析的一个实施例的另外细节的图。
图3g是示出了运行时间引擎的时间/运动分析的一个实施例的另外细节的图。
图3h是示出了运行时间引擎的深度分析的一个实施例的另外细节的图。
图4a图示了示范性深度图像。
图4b描绘了示范性深度图像中的示范性数据。
图5a示出了由骨骼识别引擎生成的示例身体模型的非限制性视觉表示。
图5b示出了从前面来看的骨骼模型。
图5c示出了从斜的视角来看的骨骼模型。
图6a是运行时间引擎的一个实施例的图。
图6b是基于身体模型确定人的质心的过程的一个实施例的流程图。
图7a是基于身体模型确定惯性张量的过程的一个实施例的流程图。
图7b是确定身体部分质心状态矢量中的元素的过程的一个实施例的流程图。
图7c是确定整个身体部分质心状态矢量中的元素的过程的一个实施例的流程图。
图8a是确定会导致质心状态矢量改变所需要的力的一个实施例的流程图。
图8b是使用全身基于冲量(impulse-based)的约束求解的肌肉力/转矩计算的一个实施例的流程图。
图9a是对正被捕获系统跟踪的用户所实施的重复(repetition)进行分析的过程的一个实施例的流程图。
图9b示出了一个示例参数信号的表示。
图9c示出了一个示例导数信号。
图10a是用曲线拟合已界定(bracket)的重复以确定定时参数的过程的一个实施例的流程图。
图10b示出了与范围段(bracket)相对应的参数信号的一部分拟合的示例曲线。
图11a是使用信号处理来分析参数信号的过程的一个实施例的流程图。
图11b示出了自相关的一个实施例的示例。
图12图示了在图2中介绍的运行时间引擎的示例性实施例。
图13a和13b图示了用于概述根据特定实施例的方法的高级流程图,所述方法用于确定基于深度的质心位置、基于深度的惯性张量、基于深度的象限质心位置以及基于深度的象限惯性张量。
图14a示出了表示(深度图像的)与实施分腿跳的用户相对应的多个像素的轮廓,图14a用于图示示范性的基于深度的质心位置以及示范性的基于深度的象限质心位置。
图14b示出了表示(深度图像的)与实施俯卧撑的用户相对应的多个像素的轮廓,图14b用于图示示范性的基于深度的质心位置以及示范性的基于深度的象限质心位置。
图15图示了用于概述如何能够基于根据参考图13a-13b描述的实施例而确定的信息来更新应用的高级流程图。
图16图示了可以用于跟踪用户行为并基于用户行为来更新应用的计算系统的示例实施例。
图17图示了可以用于跟踪用户行为并基于所跟踪的用户行为来更新应用的计算系统的另一示例实施例。
图18图示了在图2中介绍的运行时间引擎的示例实施例。
图19图示了用于概述方法的高级流程图,所述方法用于基于深度图像来确定指示用户身体的角度和/或曲率的信息。
图20a-20c示出了表示(深度图像的)与实施不同瑜伽姿势或锻炼的用户相对应的多个像素的轮廓,图20a-20c用于说明如何能够基于深度图像来确定指示用户身体的角度和/或曲率的信息。
图21是根据实施例的用于提供图19中步骤之一的附加细节的高级流程图。
图22图示了用于概述如何能够基于根据参考图19-21描述的实施例而确定的信息来更新应用的高级流程图。
图23a-23f示出了表示(深度图像的)与实施瑜伽姿势或其他锻炼的用户相对应的多个像素的轮廓,图23a-23f用于说明如何能辨别用户的肢体端(extremity)以及如何能够确定平均肢体端位置(也称作肢体端圆块(extremityblob)的平均位置)。
图24图示了用于概述方法的高级流程图,所述方法用于基于深度图像来辨别用户的平均肢体端位置。
图25是根据实施例的用于提供图24中步骤中的一些步骤的附加细节的高级流程图。
图26示出了表示(深度图像的)与站立位置的用户相对应的多个像素的轮廓连同基于深度图像而确定的平均肢体端位置。
图27用于说明能够将深度图像中的用户分成象限,并且能够针对每个象限确定平均肢体端位置。
图28示出了表示(深度图像的)与向前弯曲的用户相对应的多个像素的轮廓,图28用于说明如何能够基于深度图像来确定平均前面肢体端(frontextremity)位置。
图29图示了用于概述如何能够基于根据参考图23a-28描述的实施例而确定的信息来更新应用的高级流程图。
图30图示了图2中介绍的深度图像处理和对象报告模块的示例实施例。
图31图示了根据某些实施例的用于概述方法的高级流程图,所述方法用于辨别深度图像内的孔和填充孔。
图32图示了根据实施例的用于提供图31中步骤3102的附加细节的流程图。
图33图示了根据实施例的用于提供图31中步骤3104的附加细节的流程图。
图34图示了根据实施例的用于提供图31中步骤3106的附加细节的流程图。
图35图示了根据实施例的用于提供图31中步骤3110的附加细节的流程图。
图36a用于图示两个示范性的像素岛,其被使用本文描述的实施例分类为孔。
图36b图示了对于图36a所图示的分类为孔的像素岛进行孔填充的结果。
图37是根据实施例的用于概述地面去除(floorremoval)方法的高级流程图。
具体实施方式
本文描述的实施例使用深度图像来分析用户运动。一个实施例包括用于分析3d图像中的用户运动的运行时间引擎。运行时间引擎能够依赖于运动是什么来使用不同的技术分析用户的运动。运行时间引擎可以挑选依赖于骨骼跟踪数据的技术和/或取而代之地使用图像分割数据的技术来确定用户是否在实施正确的运动。运行时间引擎可以基于正在实施什么运动来确定如何实施对用户表现的位置分析或时间/运动分析。
在一个实施例中,分析诸如用户锻炼这样的重复性运动。系统可以使用的一种跟踪技术是骨骼跟踪。然而系统不限于骨骼跟踪。
根据一个实施例,描述了一种系统和方法,其跟踪用户运动并提供关于用户运动的反馈。例如,可以请用户实施俯卧撑。系统可以跟踪用户的运动并分析俯卧撑以确定用户是否在正确地实施俯卧撑。系统可以通知用户:他们的臀部过高,他们的肘部在俯卧撑的顶部没有完全伸直,他们在一些俯卧撑中没有完全落下来,等等。系统还可以在评估了用户的表现之后为用户确定合适的锻炼例程。
跟踪正在实施诸如锻炼这样的运动(其可以是重复性的)的用户是具有挑战性的。一个挑战是:增进为了能够向正在实施诸如(但不限于)锻炼这样的运动的用户提供反馈而需要的准确度。根据一些实施例,期望跟踪系统能够识别用户运动的细微差别。作为一个示例,可能期望确定在用户深蹲时用户臀部的角度的细微差别,在用户举重时身体右侧和左侧之间的细微差别,重量分布的细微差别等等。作为一些另外的示例,可能期望确定用户是确实在实施俯卧撑还是仅仅将他们的肩部和上身抬离地面。对于常规的跟踪技术来说,识别这样的细微差别会是非常困难的。
另一挑战是:在一些情况下运行良好的跟踪技术在其他情况下却不再运行良好。例如,在用户站立时可以运行良好的跟踪技术当用户在地面上时可能遇到问题。当用户在地面上时可以运行良好的跟踪技术当被用来跟踪站立的用户时可能具有缺陷。此外,对于一些活动(例如,一些锻炼)来说,用户可能对于锻炼的一部分是站立的,而对于锻炼的另一部分至少是部分地在地面上的。
在一个实施例中,基于身体模型来确定一个或多个质心状态矢量。身体模型可以具有关节和几何形状。例如,可以使用一个圆柱体来表示用户手臂的上臂部分。可以使用另一圆柱体来表示用户手臂的下臂部分。可以使用其他几何形状。在一个实施例中,几何形状是关于中心轴对称的。
质心状态矢量可以包括例如质心位置、质心速度、质心加速度、角速度、身体部分或整个身体的取向、角加速度、惯性张量以及角动量。可以针对个别身体部分或针对整个身体来确定质心状态矢量。可以使用(一个或多个)质心状态矢量来分析用户的运动。例如,能够使用这样的信息来跟踪实施诸如深蹲、弓步、俯卧撑、跳跃或分腿跳这样的某些锻炼的用户,使得能够控制用户的化身、能够向用户奖励点数和/或能够向用户提供反馈。在应用指令用户实施某些体育锻炼的情况下,该应用能够确定用户是否以正确的形态实施了运动,并且在用户没有以正确的形态实施运动的情况下,能够就用户可以如何改善他们的形态而向用户提供反馈。
在一个实施例中,使用质心状态矢量来分析用户的活动。在一个实施例中,确定身体部分为了导致质心状态矢量改变而需要施加的力。例如,当用户正在锻炼时,用户的脚需要施加一些力以使他们跳、扭动等等。能够基于以下假设来计算脚部力量,即:脚受到大地的约束。
在一个实施例中,系统通过将身体当作布偶(ragdoll)来计算肌肉力量/转矩,其中布偶具有通过被惯性张量计算所使用的形状来指定的身体部分,以及由身体的构形(configuration)所指定的约束。例如,上臂是一个身体部分,下臂是另一个身体部分,并且两者由位于肘部的约束来连接。此外,如果发现脚与大地接触,就针对处于这样的接触中的每只脚添加约束。
在一个实施例中,使用信号分析来分析诸如锻炼这样的重复性运动的用户表现。在随时间来标绘与重复性运动相关联的参数(例如,质心)时,标绘图可以类似信号。在练习(比如身体健身练习)的情况下,这些信号中的许多信号有属于它们的特有的“脉冲”样子,其中值从一个位置移位,在某一方向上移动,然后在“重复”的结尾返回到原始位置。一个实施例包括察认(spot)这些序列的重复察认和粗略界定(bracket)系统。
在一个实施例中,系统形成“参数信号”,所述“参数信号”跟踪与用户的运动相关联的某种参数。系统可以用参数信号的衍生物来形成“衍生信号”。衍生信号可以帮助辨别参数信号中的重复。系统可以对参数信号施加各种信号处理技术(例如,曲线拟合、自相关等等)以分析重复。
在论述质心状态矢量的另外细节和使用信号分析之前,将论述示例系统。图1a和1b图示了关于实施健身训练的用户118的跟踪系统的示例性实施例。在示例性实施例中,跟踪系统100可以被使用来识别、分析和/或跟踪在跟踪系统100的范围内的诸如用户118这样的人类目标或其他对象。如图1a所示,跟踪系统100包括计算系统112和捕获设备120。如以下将进一步详细描述的,捕获设备120能够被使用来获得深度图像和彩色图像(也被称为rgb图像),所述深度图像和彩色图像能够被计算系统112使用来辨别一个或多个用户或其他对象以及跟踪运动和/或其他用户行为。所跟踪的运动和/或其他用户行为能够被使用来分析用户的身体活动并向用户提供反馈。例如,可以指令用户实施俯卧撑,其中系统跟踪用户的形态。系统能够向用户提供反馈以帮助他们纠正他们的形态。系统可以辨别用于改善的区域,并且为用户创建训练计划。
在一个实施例中,跟踪用户能够被用来提供自然用户界面(nui)。nui可被使用来允许用户更新应用。因此,用户能够通过使用用户身体和/或用户周围物体的活动而不使用控制器、遥控器、键盘或鼠标等等(或附加于使用控制器、遥控器、键盘或鼠标等等)来操纵游戏人物或应用的其他方面。例如,视频游戏系统能够基于对象的新位置来更新在视频游戏中显示的图像的位置,或基于用户的运动来更新化身。因此,化身可以跟踪用户的实际活动。系统可以在化身旁边呈现另一个人,比如健身教练、体育运动发动者(sportsstart)等等。因此,用户能够想象他们自己与某人一起或在某人指导下训练。
计算系统112可以是计算机、游戏系统或控制台等。根据示例性实施例,计算系统112可以包括硬件组件和/或软件组件,以使得计算系统112能够被使用来执行诸如游戏应用或非游戏应用等应用。在一个实施例中,计算系统112可以包括处理器,比如标准化处理器、专用处理器或微处理器等,其可以执行在处理器可读存储介质上存储的指令以实施本文描述的过程。
捕获设备120可以是例如摄像机,其可被使用来在视觉上监视诸如用户118这样的一个或多个用户,使得由所述一个或多个用户实施的姿态和/或活动可以被捕获、分析和跟踪。由此,能够生成质心状态矢量。
根据一个实施例,跟踪系统100可以连接到视听设备116,比如电视、监视器、高清电视(hdtv)等,视听设备116可以向诸如用户118这样的用户提供游戏或应用画面和/或音频。例如,计算系统112可以包括诸如图形卡这样的视频适配器和/或诸如声卡这样的音频适配器,其可以提供与游戏应用或非游戏应用等相关联的视听信号。视听设备116可以接收来自计算系统112的视听信号,然后可以把与视听信号相关联的游戏或应用画面和/或音频输出给用户118。根据一个实施例,视听设备116可以经由例如s-video线缆、同轴线缆、hdmi线缆、dvi线缆、vga线缆、分量视频线缆等连接到计算系统112。
如图1a和1b所示,跟踪系统100可以被使用来识别、分析和/或跟踪诸如用户118这样的人类目标。例如,跟踪系统100在用户例如实施锻炼例程的时候确定描述用户运动的各种参数。示例性参数包括但不限于质心状态矢量。在一个实施例中,可以基于身体模型来确定该状态矢量。
作为另一示例,可以使用捕获设备120来跟踪用户118,使得用户118的姿态和/或活动可以被捕获,以便操纵(animate)化身或屏幕上人物,和/或可以被解译为控制,所述控制能够被使用来影响正在由计算系统112执行的应用。因此,根据一个实施例,用户118可以移动他或她的身体来控制应用和/或操纵化身或屏幕上人物。
在图1a和1b描绘的示例中,在计算系统112上执行的应用可以是用户118实施的锻炼例程。例如,计算系统112可以使用视听设备116向用户118提供健身教练员138的视觉表示。计算系统112还可以使用视听设备116来提供运动者(player)化身的视觉表示,其中用户118可以用他或她的活动来控制所述运动者化身。例如,如图1b所示,用户118可以在物理空间移动他们的手臂以使运动者化身在游戏空间移动其手臂。因此,根据示例性实施例,计算机系统112和捕获设备120识别和分析用户118的手臂在物理空间中的活动,以使得可以分析用户的形态。系统可以向用户提供以下的反馈:他们有多好地实施了运动。
在示例性实施例中,诸如用户118这样的人类目标可以具有某物体。在这样的实施例中,电子游戏的用户可能正拿着该物体,使得运动者和物体的运动可以被分析。例如,可以跟踪并分析挥舞着网球拍的运动者的运动,以确定该用户的形态是否好。也可以跟踪没有被用户拿着的物体,比如被用户(或不同用户)投掷、推动或滚动的物体以及自推进的物体。除了网球之外,还可以实现其他游戏。
根据其他示例性实施例,跟踪系统100还可以被使用来将目标活动解译为在游戏领域之外的操作系统和/或应用控制。例如,事实上操作系统和/或应用的任何可控方面都可以由诸如用户118这样的目标的活动来控制。
图2图示了可以用在跟踪系统100中的捕获设备120的示例性实施例。根据示例性实施例,捕获设备120可以被配置成经由包括例如飞行时间、结构光或立体图像等的任何合适的技术来捕获具有深度信息的视频,包括深度图像,所述深度图像可以包括深度值。根据一个实施例,捕获设备120可以将深度信息组织到“z层”中或者组织到可能与z轴垂直的层中,所述z轴从深度摄像机沿着其视线延伸。
如图2所示,捕获设备120可以包括图像摄像机组件222。根据示例性实施例,图像摄像机组件222可以是可以捕获场景的深度图像的深度摄像机。深度图像可以包括所捕获的场景的二维(2d)像素区域,其中2d像素区域中的每个像素可以表示深度值,比如,所捕获的场景中的对象与摄像机的以例如厘米或毫米等计的距离。
如图2所示,根据示例性实施例,图像摄像机组件222可以包括红外(ir)光组件224、三维(3d)摄像机226以及rgb摄像机228,其可以被使用来捕获场景的深度图像。例如,在飞行时间分析中,捕获设备120的ir光组件224可以将红外光发射到场景上,然后可以通过使用例如3d摄像机226和/或rgb摄像机228,使用传感器(未被示出)来检测从该场景中的一个或多个目标或对象的表面反向散射的光。在一些实施例中,可以使用脉冲式红外光,使得可以测量外出光脉冲与对应的进入光脉冲之间的时间并且使用该时间来确定从捕获设备120到场景中目标或对象上具体位置的物理距离。此外,在其他示例性实施例中,可以将外出光波的相位与进入光波的相位相比较以确定相移。然后可以使用相移来确定从捕获设备到目标或对象上具体位置的物理距离。
根据另一示例性实施例,可以使用飞行时间分析,通过经由包括例如快门光脉冲成像的各种技术分析反射光束随时间的强度,来间接地确定从捕获设备120到目标或对象上具体位置的物理距离。
在另一示例性实施例中,捕获设备120可以使用结构光来捕获深度信息。在这样的分析中,可以经由例如ir光组件224将图案化的光(即,显示为诸如网格图案、条带图案或不同图案这样的已知图案的光)投影到场景上。在击打场景中一个或多个对象或目标的表面后,作为响应,图案可能变成变形的。图案的这样的变形可以被例如3d摄像机226和/或rgb摄像机228捕获,然后可以被分析以确定从捕获设备到目标或对象上具体位置的物理距离。在一些实现中,将ir光组件224从摄像机226和228移位,因而能够使用三角测量来确定与摄像机226和228的距离。在一些实现中,捕获设备120将包括专用ir传感器以感测ir光。
根据另一实施例,捕获设备120可以包括两个或更多个物理上分离的摄像机,其可以从不同角度观看场景以获得视觉立体数据,所述视觉立体数据可以被分解以生成深度信息。还能够使用其他类型的深度图像传感器来创建深度图像。
捕获设备120还可以包括麦克风230。麦克风230可以包括换能器或传感器,其可以接收声音并将声音转换成电信号。根据一个实施例,麦克风230可以被使用来在目标识别、分析和跟踪系统100中减小捕获设备120与计算系统112之间的反馈。此外,麦克风230可以被使用来接收音频信号,所述音频信号也可以由用户提供来控制可以由计算系统112执行的诸如游戏应用或非游戏应用等这样的应用。
在示例性实施例中,捕获设备120还可以包括可与图像摄像机组件222可操作地通信的处理器232。处理器232可以包括标准化处理器、专用处理器或微处理器等,其可以执行指令,所述指令包括例如用于接收深度图像、生成适当的数据格式(例如,帧)以及向计算系统112传输数据的指令。
捕获设备120还可以包括存储器组件234,所述存储器组件234可以存储可由处理器232执行的指令、由3d摄像机和/或rgb摄像机捕获的图像或图像帧、或者任何其他合适的信息或图像等。根据示例性实施例,存储器组件234可以包括随机存取存储器(ram)、只读存储器(rom)、高速缓存器、闪存存储器、硬盘或任何其他合适的存储组件。如图2所示,在一个实施例中,存储器组件234可以是与图像捕获组件222和处理器232通信的分离组件。根据另一实施例,存储器组件234可以集成到处理器232和/或图像捕获组件222中。
如图2所示,捕获设备120可以经由通信链路236与计算系统112通信。通信链路236可以是:有线连接,包括例如usb连接、firewire连接或以太网线缆连接等;和/或无线连接,比如无线802.11b、802.11g、802.11a或802.11n连接。根据一个实施例,计算系统112可以向捕获设备120提供时钟,所述时钟可以被用来确定例如何时经由通信链路236捕获场景。此外,捕获设备120经由通信链路236将由例如3d摄像机226和/或rgb摄像机228捕获的深度图像和彩色图像提供给计算系统112。在一个实施例中,以每秒30帧来传输深度图像和彩色图像。计算系统112然后可以使用模型、深度信息和捕获的图像来例如控制诸如游戏或文字处理器这样的应用和/或操纵化身或屏幕上人物。
计算系统112包括姿态库240、结构数据242、运行时间引擎244、骨骼识别引擎以及应用246。运行时间引擎244可以实施深度图像处理和对象报告。运行时间引擎244可以使用深度图像来跟踪诸如用户和其他对象这样的对象的运动。为了帮助对对象的跟踪,运行时间引擎244可以使用姿态库240、结构数据242和骨骼识别引擎192。在一个实施例中,运行时间引擎244分析正在被系统100跟踪的用户的运动。这可以是某些重复性运动,比如锻炼。
结构数据242包括与可以被跟踪的对象有关的结构信息。例如,可以存储人类的骨骼模型以帮助理解用户的活动并识别身体部分。还可以存储与无生命的对象有关的结构信息以帮助识别这些对象并帮助理解活动。
姿态库240可以包括姿态过滤器的聚集,每个姿态过滤器包括关于可以(在用户移动时)由骨骼模型实施的姿态的信息。可以将摄像机226、228和捕获设备120以骨骼模型以及与之关联的活动的形式捕获的数据与姿态库240中的姿态过滤器相比较,以辨别用户(如骨骼模型所表示的)何时实施了一个或多个姿态。这些姿态可以与跟锻炼相关的姿势相关联。
姿态库240可以与除了骨骼跟踪以外的其他技术一起使用。这样的其他技术的示例包括图像分割技术。图18-29提供了图像分割技术的实施例的细节。然而可以使用其他图像分割技术。
在一个实施例中,姿态可以与用户实施的各种锻炼相关联。例如,姿态可以是在锻炼期间实施的姿势或活动。例如,可以存在三个与俯卧撑相关联的姿势:俯卧(例如,脸朝下)位、手臂伸展的高位(upposition)以及低俯卧位。系统可以寻找该序列来确定用户是否实施了俯卧撑。
在一个实施例中,姿态可以与应用的各种控制相关联。因此,计算系统112可以使用姿态库240来解译骨骼模型的活动并基于该活动来控制应用246。这样,姿态库可以被运行时间引擎244和应用246使用。
应用246可以是健身程序、视频游戏、生产力应用等等。在一个实施例中,运行时间引擎244将会向应用246报告对于每一帧所检测到的每个对象的标识以及该对象的定位。应用246将使用该信息来更新显示器中化身或其他图像的位置或活动。
运行时间引擎
一些传统的跟踪技术依靠单一或很少几种技术来识别姿态和/或姿势。姿态的一个示例是用户出拳。例如,常规系统可查看肢体的位置和/或肢体之间的角度。系统可以寻找用户的手/拳略微从身体伸出的,然后是手/拳从身体完全伸直,以检测该用户出了拳。只要关节角度在角度范围内,这就可以指示举起了左臂。常规的姿势匹配系统可以将多个姿势串在一起。例如,如果系统确定用户的手靠近身体然后用户的手从身体伸展出来,则系统将假定用户实施了拳击。
然而,这样的常规技术可能不适合于跟踪和评估针对应用的用户运动,包括但不限于监视和评估正在锻炼的用户。这样的系统可以跟踪和评估各式各样的用户运动。在一些情况下,所跟踪的各种各样的运动可能导致需要应用不同的技术。例如,对于跟踪和评估直线弓步的系统,该系统可能需要跟踪形态以及跟踪用户如何移动通过空间。对于跟踪和评估俯卧撑的系统,系统可能需要跟踪形态以及跟踪节奏。然而,用户移动通过空间的方式对于跟踪和评估俯卧撑来说可能并不那么重要。在一个实施例中,系统实施的分析的类型依赖于用户正在实施什么运动(例如锻炼)。
一种评估用户的运动表现的方式是跟踪参数,比如用户的质心。系统可以跟踪质心如何移动通过空间以便评估用户如何实施给定的运动。
图3a是分析用户运动的过程300的一个实施例的流程图。过程300可以在诸如图1a、图1b和/或图2这样的系统中被实践。在一个实施例中,过程300的步骤由运行时间引擎244实施。在一个实施例中,过程300分析包括一连串姿势的姿态。该姿态可以是体育锻炼,比如仰卧起坐、俯卧撑等等。然而姿态不限于体育锻炼。
在一个实施例中,过程300被使用来向正在锻炼或实施某种其他姿态的用户提供反馈。系统100可以执行应用,该应用在健身例程上自始至终引导用户。应用可以指令用户实施锻炼,比如实施“俯卧撑”、“仰卧起坐”、“深蹲”等等。
在步骤302,接收(一个或多个)深度图像。在一个实施例中,捕获设备120向计算系统112提供深度图像。深度图像可以被处理来生成骨骼跟踪数据以及图像分割数据。
在步骤304,确定移动。该移动可以由一系列姿势限定。例如,俯卧撑是移动的一个示例。移动可以包括一系列姿势。移动还可以被称作姿态。在一个实施例中,运行时间引擎244通过分析所述(一个或多个)深度图像来确定用户做出了什么移动。术语“分析深度图像”的意思是包括分析从深度图像导出的数据,比如但不限于骨骼跟踪数据和图像分割数据。在步骤306,对用户是否做出了正确的移动进行确定。作为一个示例,系统100确定用户是否实施了俯卧撑。如果否,则系统100可以在步骤310为用户提供没有检测到正确移动的反馈。在一个实施例中,使用深度识别器(图3b,358)和/或移动识别器(图3b,360)来分析用户是否做出了正确的移动。以下论述了深度识别器358和移动识别器360。
假定作出了正确的移动,则在步骤308分析该移动。作为一个示例,系统100确定在实施“俯卧撑”或某种其他锻炼时用户的形态有多好。在一个实施例中,系统100将锻炼的一个重复与其他重复相比较以确定变化。因此,系统100能够确定用户的形态是否在改变,这可以指示疲劳。
在一个实施例中,运行时间引擎244具有位置分析(图3b,364)、时间/运动分析(图3b,366)和深度分析(图3b,368),用来分析用户的表现。以下论述了位置分析364、时间/运动分析366和深度分析368。
在步骤310,系统100基于对移动的分析来提供反馈。例如,系统100可以通知用户在实施锻炼时该用户的位置/活动不对称。作为具体示例,跟踪系统100可以通知用户:他们的重量过多压在他们脚的前面部分上。
图3b是运行时间引擎244的一个实施例的图示。运行时间引擎244可以被用来实现过程300。运行时间引擎244可以输入实况图像数据354以及重播图像数据352。实况图像数据354以及重播图像数据352可以各自包括rgb数据、深度数据和骨骼跟踪(st)数据。在一个实施例中,st数据由骨骼识别引擎192生成。
可以使骨骼跟踪(st)数据经受st滤波、st归一化和/或st约束356。st滤波可以平滑有噪的(例如,抖动的)关节位置。滤波的示例包括但不限于时间滤波、指数滤波和卡尔曼滤波。st归一化可以使诸如肢体长度这样的参数随时间保持一致。这可以被称作骨头长度归一化。st约束可以对骨骼数据进行调整以纠正在解剖学上不可能的位置。例如,系统100可以具有针对具体关节而准许的角度范围,使得如果角度在该范围之外就把该角度调节成落入准许的角度之内。滤波能够帮助改善稍后在运行时间引擎中的准确度。在一个实施例中,骨骼识别引擎192包含st滤波、st归一化和/或st约束356。
方框356还包括深度数据和图像分割数据。在一个实施例中,深度数据由针对深度图像中每个像素的z值来表征。每个像素可以与x位置和y位置相关联。图像分割数据可以从深度数据中被导出。
在分割过程之后,深度图像中的每个像素可以具有与之关联的分割值。像素定位可以由x位置值(即,水平值)和y位置值(即,垂直值)来指示。像素深度可以由z位置值(也被称作深度值)来指示,所述z位置值指示在用于获得深度图像的捕获设备(例如120)与由该像素表示的用户(或运动者)的部分之间的距离。分割值被使用来指示像素是对应于特定的用户还是不对应于用户。结合图4a进一步论述分割。还结合图18论述了深度图像分割。在一个实施例中,方框356是部分地用图18的深度图像分割1852来实现的。
深度识别器358和移动识别器360可以各自实施姿态和姿势识别。深度识别器358和移动识别器360是“姿势识别器”的两个示例。深度识别器358和移动识别器360可以各自被使用来通过例如识别一系列姿势而确定用户是否实施了正确的移动。例如,深度识别器358和移动识别器360可以被使用来确定用户是否实施了俯卧撑、仰卧起坐等。深度识别器358和移动识别器360不一定评估用户有多好地实施了运动。然而,深度识别器358和/或移动识别器360可以对于用户有多好地实施了该运动来实施某种分析。例如,深度识别器358和/或移动识别器360可以对于哪些身体部分不在适当位置来实施某种分析。
在用户站立时对于实施姿态和姿势识别可以运行良好的技术可能当用户在地面上时运行得不那么好。在一个实施例中,系统100依赖于用户相对于地面的定位来确定是否使用深度识别器358和/或移动识别器360。例如,系统100可以在人站立和出拳时使用移动识别器360,但是在用户实施俯卧撑时使用深度识别器358。
当用户没有在地面上时,移动识别器360可以主要实施姿态和姿势识别。相比于纯深度图像数据,移动识别器360可以更多地依靠骨骼数据。在一个实施例中,移动识别器360检查st关节相对于彼此和身体的角度、位置和旋转。在一个实施例中,移动识别器360检查用户脊柱的角度和旋转。这可以包括侧屈。
如注意到的,移动识别器360和/或深度识别器358可以被使用来确定用户是否实施了正确的移动(由测试362表示)。在一个实施例中,系统100确定用户是否实施了一组姿势。例如,对于俯卧撑,系统100寻找与俯卧撑的不同位置相对应的姿势。俯卧撑的三个姿势的示例是与以下相对应的姿势:在俯卧(例如,脸朝下)位中用户开始靠近大地,接着伸直他们的手臂到高位,然后返回到低位。在该示例中,深度识别器可能被使用来确定用户是否做了俯卧撑,因为用户在地面上(或附近)。
系统100可能针对一些姿势使用深度识别器358或移动识别器360。系统100可能使用深度识别器358和移动识别器360两者来确定用户是否实施了其他姿势。这在识别姿势中提供了极大的灵活性和准确度。
假定系统100确定该用户实施了正确的运动,则位置分析364、时间/运动分析366和/或深度分析368可以被使用来评估用户的形态。
位置分析364可以基于在一个时间点上身体部分的位置来评估用户的形态。在一个实施例中,位置分析364将相对于彼此和/或相对于地面来比较身体部分的位置和/或关节位置。作为一个示例,位置分析364可以被使用来确定对于当前的锻炼来说用户的臀部是否相对于脚处在正确的定位(location)。
时间/运动分析366可以基于随时间的身体部分位置来评估用户的形态。在一个实施例中,时间/运动分析366查看多个帧上的位置分析以确保用户的形态正确。这可以被使用来确定用户如何随时间移动通过空间。作为一个示例,时间/运动分析366可以被使用来确定在深蹲过程中用户的膝盖是否发软。
时间/运动分析366可以寻找节奏,比如用户正在多快地移动。例如,一些运动可以具有特性2-1-2节奏,其指的是实施运动的不同片段的相对时间长度。例如,俯卧撑可能趋向于被表征为:2个时间单位向上,1个时间单位稳定在最高,以及再另外2个时间单位降低回来。
时间/运动分析366还可以检查用户如何随时间移动的曲线。在一个实施例中,系统确定诸如用户的质心这样的参数。可以随时间跟踪该参数的这种位置。系统100然后通过分析曲线的形状来评价用户的形态。可以跟踪许多其他参数。
当骨骼跟踪数据不可用或可能不合适时,深度分析368可以依靠深度图像数据。作为一个示例,当针对锻炼的至少一部分而言用户在地面上时,可以使用深度分析368。当用户在地面上时,可能难以生成st数据。
评价372向用户提供关于他们的运动表现的反馈。例如,反馈可以是在实施俯卧撑时该用户的背部和腿部没有形成直线,或者在实施直线弓步时用户的右膝没有沿着恰当的线移动,这可以指示内转(pronation)问题。可以为用户给出如何纠正问题的进一步反馈,比如保持他们的核心肌肉更加绷紧(tighter)。进一步的反馈可以是一个警告:该用户可能在他们的右膝或右腿等具有弱点。
还描绘了训练计划374、服务器/db376和附加反馈378。训练计划374可以考虑到对用户表现的评价以及诸如用户的目的、年龄等其他因素为用户提供被推荐来遵从的详细的训练。
服务器/db376被使用于存储运动者反馈、表现和结果。该数据然后能够被使用来分析和报告随时间的进展(或缺乏进展)并且被反馈到训练计划374中,或者甚至对于向用户给出的反馈提供更多细微差别(nuance)。例如,如果运行时间引擎244知道用户在多个课程期间上对弓步有困难但是现在正在体现大的进步,则反馈可以是大约类似(alongthelinesof):“做得好,我确实看到了随时间的进步”。应用开发者可以使用这同样的数据/遥测来确定哪些运动太难、或者是否姿态过于严格并且人们没有被正确地检测。
附加反馈378可以被使用来对于成绩或挑战、对于与其他运动者的排行榜比较等等随时间生成反馈。
在不必改变分析其他运动的方式的情况下,可以向运行时间引擎中添加新模块,所述新模块实现新技术以用于实施对用户运动的分析。例如,比方说在运行时间引擎244已被配置成评估100个不同的锻炼之后,期望再多几个锻炼来用于分析。可能的情况是,可能期望新的工具来分析新的锻炼。能够容易地将新工具添加达到运行时间引擎的模块设计中,而不影响其他锻炼是如何被分析的。这极大地简化了运行时间引擎的设计、测试和开发。
图3c是基于正在分析什么姿态(例如,什么体育锻炼)而在运行时间引擎244中选择代码的过程311的一个实施例的流程图。在步骤312,确定应当使用什么技术来分析姿态。在一个实施例中,运行时间引擎244能访问存储的信息,所述信息限定了:在给定了要求用户实施的锻炼的情况下,应当执行什么代码(例如,应当在处理器上执行什么指令)。注意,步骤312可以基于姿态内的特定姿势来进行这种确定。因此,可以使用不同的技术来分析给定姿态的不同姿势。
在一个实施例中,运行时间引擎244访问来自姿态数据库240的对姿态的描述,以确定应当使用什么技术。对姿态的描述可以包括针对该姿态的一系列姿势。每个姿势可以声明应当使用什么识别器358、360或计算来识别或分析该姿势。计算可以是位置分析364、时间/运动分析366和深度分析368内的不同计算。计算还可以是深度识别器358和移动识别器360内的不同计算。因此,可以针对具体姿态而调整被用来识别和/或分析姿态的技术。
在一个实施例中,步骤312包括确定使用什么技术来确定用户是否在实施正确的移动。这可以包括确定是使用运行时间引擎244中基于骨骼跟踪数据来检测移动的第一姿势识别器(例如,深度识别器358)还是运行时间引擎244中基于图像分割数据来检测移动的第二姿势识别器(例如,移动识别器360)。可以基于人相对于地面的定位来进行这种确定。例如,如果主要地站立着的人实施了具体体育锻炼,则使用骨骼跟踪数据的技术可以被使用。然而,如果主要地在地面上的人实施了具体体育锻炼,则使用图像分割数据的技术可以被使用。
在一个实施例中,步骤312包括基于正在被运行时间引擎分析的具体锻炼来确定使用哪些计算在运行时间引擎244中实施时间/运动分析。例如,可以选择位置分析模块364内的代码,使得基于正在实施什么体育锻炼来采用期望的用于分析用户运动的技术。
在一个实施例中,步骤312包括基于正在被运行时间引擎分析的具体锻炼来确定使用哪些计算在运行时间引擎244中实施时间/运动分析。例如,可以选择时间/运动分析模块366内的代码,使得基于正在实施什么体育锻炼来采用期望的用于分析用户运动的技术。
在一个实施例中,步骤312包括基于正在被运行时间引擎分析的具体锻炼来确定使用哪些计算在运行时间引擎244中实施深度分析。例如,可以选择深度分析模块368内的代码,使得基于正在实施什么体育锻炼来采用期望的用于分析用户运动的技术。
在一个实施例中,步骤312包括确定使用利用骨骼跟踪数据的计算还是利用图像分割数据的计算来实施对姿态的分析。例如,相比于/相对于使用利用骨骼跟踪数据的技术,系统可能选择使用深度分析368来实施位置和/或时间/运动分析的技术。
在步骤314,深度图像数据被输入到运行时间引擎244。深度图像数据可以包括针对深度图像中每个像素的深度值。深度图像数据可以被处理来生成骨骼跟踪数据以及图像分割数据。
在步骤316,运行时间引擎244执行实现了所选择的技术的代码。在一个实施例中,运行时间引擎244具有用于实现不同的用于分析姿态的技术的代码。可以选择不同的代码来实现不同的用于分析用户运动的技术。作为一个示例,如果锻炼是用户在(或接近)地面上的诸如俯卧撑或仰卧起坐这样的锻炼,则运行时间引擎244可使用深度识别器358。然而,如果锻炼是离开地面的诸如直线弓步这样的锻炼,则运行时间引擎244可使用移动识别器360。因此,步骤316可以包括在运行时间引擎244内执行代码的不同部分来分析不同的锻炼。
注意,能够混合各种技术。例如,当分析用户的表现时,可以将使用骨骼跟踪数据的计算技术与使用图像分割数据的计算技术一起使用。图3d-3h提供了深度识别器358、移动识别器360、位置分析364、时间/运动分析366和深度分析368的实施例的另外的细节。在步骤316中,系统100可以基于正在被分析的姿态(例如,体育锻炼)来选择使用这些模块中的哪些和/或在这些模块内使用什么计算。
图3d是示出了运行时间引擎244的深度识别器358的一个实施例的另外细节的图示。深度识别器358具有深度/图像分割作为输入。结合图3b的方框356论述了深度/图像分割。在一个实施例中,从图18的运行时间引擎中的模块中的一个或多个获得深度图像分割信息。作为一个示例,深度图像分割1852可以向深度识别器358提供输入。图18中的其他模块也可以向深度识别器358提供输入。
深度识别器358还能访问姿态数据库240。这是全部现用或可用姿态的数据库。在一个实施例中,姿态由多个状态组成,所述多个状态包括开始姿势、结束姿势以及多个中间姿势。每个状态具有关联的姿势。对于每个状态,除了姿势之外,状态节点还包含用于识别和分析姿势的识别器(例如,358,360)、分析模块(例如,364,366,368)和/或计算(358,360,364,366,368内的代码)的列表。状态节点还可以包含反馈过滤器类型(和关联的数据)。以下相对于图3f-3h来论述反馈过滤器。姿势并非必然地必须是静态的。
深度识别器358具有深度识别器模块402,其使用深度/图像分割作为输入来运行(步骤404)。这些是用于识别姿势以确定用户位置或活动是否与姿态姿势节点中存储的数据匹配的算法、库和计算。
深度识别器模块402能够使用各种各样的不同技术。这些技术包括但不限于:基于深度的质心(例如,图12,254)、基于深度的惯性张量(图12,256)、基于深度缓冲的象限质心计算(例如,图13b)、经由轮廓顶部曲线拟合的基于深度缓冲的身体角度弯曲(例如,图18,1854,1856,1858)、侧/前圆块确定、用于从深度缓冲器去除靠近地面点以消除漏出到(bleed-out)大地中的轮廓的地面去除技术。在一个实施例中,运行时间引擎244基于正在分析什么姿态来确定使用这些技术中的哪些。这是基于正在分析的姿态来选择要实施的计算的一个示例。因此,图3c的步骤312可以包括基于正在分析的姿态来选择这些计算之一。
深度识别器358在步骤404执行深度识别器模块402以确定是否识别了各种移动。以下论述将针对移动是具体体育锻炼(例如,仰卧起坐、俯卧撑、弓步等等)的实施例。然而,深度识别器358可以被使用来识别除了体育锻炼之外的移动。
如果识别了姿势(步骤414),则控制传递到步骤422以确定这是不是体育锻炼的最后一个姿势。如果它是,则姿态通过了识别准则(步骤420)。如果这不是最后一个姿势(步骤422=否),则控制传递到步骤412以获取要识别/检测的下一个姿势。这可以在步骤410中从姿态数据库240获得。然后控制传递到步骤404以再次执行识别器模块402。
如果姿势没有被识别(步骤414=否),则确定该姿势是否关键(步骤416)。如果该姿势不关键,则控制传递到步骤412以获得要针对该体育锻炼的识别的下一个姿势。如果姿势关键(步骤416=是),则控制传递到步骤418以记录该姿态未能通过识别准则。
深度识别器358的输出是是否检测到了正确的移动,由判定方框362来表示。
图3e是示出了运行时间引擎244的移动识别器360的一个实施例的另外细节的图示。移动识别器360具有作为输入的st滤波、st归一化和st约束。这也可以被称作骨骼跟踪信息。如以下论述的,图5a-5c提供了生成骨骼跟踪信息的一个实施例的另外的细节。移动识别器360还能访问姿态数据库240。
移动识别器360包括移动识别器模块442。这些是用于识别姿势以确定用户位置或活动是否与姿态姿势节点中存储的数据匹配的算法、库和计算。移动识别器模块442能够使用各种各样的不同技术。这些技术包括但不限于:st关节位置和旋转同阈值范围的比较、基于身体模型的质心和惯性张量计算(例如,图6a,650)、使用质心状态矢量的基于身体模型的脚部力量计算(例如,图8a)、使用全身基于冲量的约束求解的肌肉力量/转矩计算(例如,图8b)、锻炼重复察认和粗略界定(例如,图9a)、对重复的曲线拟合以确定重复定时(例如,图10a)、dsp自相关和信号减法以辨别重复到重复的节奏以及重复与重复的相似度(例如,图11a)。在一个实施例中,运行时间引擎244基于正在分析什么姿态来确定使用这些技术中的哪些。这是基于正在分析的姿态来选择要实施的计算的一个示例。因此,图3c的步骤312可以包括基于正在分析的姿态来选择这些计算之一。
移动识别器360在步骤444执行移动识别器模块442以确定是否识别了各种移动。以下论述将针对移动是具体体育锻炼(例如,仰卧起坐、俯卧撑、弓步等等)的实施例。然而,移动识别器360可以被使用来识别除了体育锻炼之外的移动。
如果识别了姿势(步骤414),则控制传递到步骤422以确定这是不是体育锻炼的最后一个姿势。如果它是,则姿态通过了识别准则(步骤420)。如果这不是最后一个姿势(步骤422=否),则控制传递到步骤412以获取要识别/检测的下一个姿势。这可以在步骤410中从姿态数据库240获得。然后控制传递到步骤404以再次执行识别器。
如果姿势没有被识别(步骤414=否),则确定该姿势是否关键(步骤416)。如果该姿势不关键,则控制传递到步骤412以获得要针对该体育锻炼的识别的下一个姿势。如果该姿势关键(步骤416=是),则控制传递到步骤418以记录该姿态未能通过识别准则。
移动识别器360的输出是是否检测到了正确的移动,由判定方框362来表示。
图3f是示出了运行时间引擎244的位置分析364的一个实施例的另外细节的图示。位置分析364具有作为输入的st滤波、st归一化、st约束和深度/图像分割356,其结合图3b的方框356被论述。
输入也是当前的姿态姿势452。当前的姿态姿势452指的是姿态姿态或姿势之一,其可以从姿态数据库240获得。姿态可以提供要被检测的反馈情况的列表,连同标识将哪些计算用于分析的列表以及要馈送给这些计算以触发这些计算的参数的列表。如以上提到的,姿态可以由多个状态组成,所述多个状态包括开始姿势、结束姿势和多个中间姿势。每个状态可以具有关联的姿势。对于每个状态,除了姿势之外,状态节点还包含反馈过滤器类型(和关联的数据)以及反馈分析类型的列表。
在获得姿势数据之后(步骤454),访问过滤器数据(步骤456)。如提到的,可以在姿态数据中指定这种过滤器数据。在步骤458,确定要实施的分析的类型以及相关参数。再次地,姿态数据可以指定反馈分析类型。
在步骤460,实施位置分析。位置分析的示例包括但不限于:肢体和身体在某一位置处在某一阈值内、手在臀部上、手在臀部的某一距离内、关节在某一角度范围内等等。
可以用在步骤460中的技术包括但不限于:st关节位置和旋转同阈值范围的比较、基于身体模型的质心和惯性张量计算(例如,图6a,650)、使用质心状态矢量的基于身体模型的脚部力量计算(例如,图6a,660;图8a)、锻炼重复察认和粗略界定(例如,图9a)、以及对重复的曲线拟合以确定重复定时(例如,图10a)。在一个实施例中,运行时间引擎244基于正在分析什么姿态来确定使用这些技术中的哪些。这是基于正在分析的姿态来选择要实施的计算的一个示例。因此,图3c的步骤312可以包括基于正在分析的姿态来选择这些计算之一。
步骤460确定是否满足条件(步骤462)。如果满足针对反馈情况的条件,则存在进一步过滤(步骤464)的选项以淘汰可能由误报(falsepositive)生成的、要求更高准确程度的或简单地被认为是仅仅应当在非常特定的情况下才触发的某事的反馈。过滤器的一些示例是:只有在系统100从<y>个姿态中看到反馈情况触发<x>次的情况下、在系统100接连看到相同的反馈情况触发<x>次的情况下等等,才向用户给出反馈。
如果步骤466确定在施加反馈之后要生成反馈,则生成反馈(步骤468)。向用户反馈是检测姿态的重要部分。可以针对任何类型的体验(例如,身体健身、体育运动、动作游戏等)提供反馈。除了确定用户是否成功实施了姿态之外,系统还向用户提供反馈。这可能如正面鼓励(“做得好!”、“完美挥动!”)一样简单,或者是更复杂形式的纠正反馈(“手放在你的臀部”、“你前倾太远了”、“尝试更高地挥动你的手臂来击球”或者“你需要蹲得更低”)。还能够生成负面反馈(“你没有完成俯卧撑”、“你的节奏太慢”、“短打力量过大”等等)。
可以使用深度识别器358和/或移动识别器360的结果来帮助生成反馈。注意,这些结果不限于用户是否实施了正确的移动。相反,深度识别器358和/或移动识别器360可以提供帮助通知反馈的结果,包括但不限于先前段落的示例。
图3g是示出了运行时间引擎244的时间/运动分析366的一个实施例的另外细节的图示。时间/运动分析366具有作为输入的st滤波、st归一化、st约束和深度/图像分割356。由于时间/运动分析366的一些单元类似于位置分析364的单元,所以它们不会被详细论述。
至时间/运动分析366的输入也是当前姿态姿势452。在获得姿势数据之后(步骤454),访问过滤器数据(步骤456)。
在步骤470,实施时间/运动分析。分析可以是基于节奏的(例如,用户是否以某种韵律击打或足够长时间地保持一个姿势?)、基于活动的(例如,理解在具体姿态期间臀部和膝盖移动的方式可能指示在不被期望时的内转)。可以实施其他类型的时间/运动分析。
可以用在步骤470中的技术包括但不限于:使用质心状态矢量的基于身体模型的脚部力量计算(例如,图8a)、使用全身基于冲量的约束求解的肌肉力量/转矩计算(例如,图8b)、dsp自相关和信号减法以辨别重复到重复的节奏以及重复与重复的相似度(例如,图11a)。在一个实施例中,运行时间引擎244基于正在分析什么姿态来确定使用这些技术中的哪些。这是基于正在分析的姿态来选择要实施的计算的一个示例。
步骤470确定是否满足条件(步骤462)。如果满足针对反馈情况的条件,则存在进一步过滤(步骤464)的选项,以淘汰如下的反馈,即:可能由误报生成的、要求更高准确程度的或简单地被认为是仅仅应当在非常特定的情况下才触发的某事的反馈。
如果步骤466确定在施加反馈之后要生成反馈,则生成反馈(步骤468)。可以使用深度识别器358和/或移动识别器360的结果来帮助生成反馈。
图3h是示出了运行时间引擎244的深度分析368的一个实施例的另外细节的图示。深度分析368具有作为输入的st滤波、st归一化、st约束、深度/图像分割356。由于深度分析368的一些单元类似于位置分析364的单元,所以它们不会被详细论述。
至深度分析368的输入也是当前姿态姿势452。在获得姿势数据之后(步骤454),访问过滤器数据(步骤456)。
在步骤480,实施深度分析。分析可以是基于节奏的、基于位置的、基于活动的等等。结合位置分析364和时间/运动分析366论述了这样的分析的示例。
可以用在步骤480中的技术包括但不限于:基于深度的质心(例如,图12,254)、基于深度的惯性张量(图12,256)、基于深度缓冲器的象限质心计算(例如,图13b)、经由轮廓顶部曲线拟合的基于深度缓冲器的身体角度弯曲(例如,图18,1854,1856,1858)以及侧/前圆块确定。在一个实施例中,运行时间引擎244基于正在分析什么姿态来确定使用这些技术中的哪些。这是基于正在分析的姿态来选择要实施的计算的一个示例。因此,图3c的步骤312可以包括基于正在分析的姿态来选择这些计算之一。
步骤480确定是否满足条件(步骤462)。如果满足针对反馈情况的条件,则存在进一步过滤(步骤464)的选项以淘汰可能由误报生成的、要求更高准确程度的或简单地被认为是仅仅应当在非常特定的情况下才触发的某事的反馈。
如果步骤466确定在施加反馈之后要生成反馈,则生成反馈(步骤468)。可以使用深度识别器358和/或移动识别器360的结果来帮助生成反馈。
图4a图示了可以在计算系统112处从捕获设备120接收的深度图像的示例性实施例。根据示例性实施例,深度图像可以是由例如以上关于图18描述的捕获设备120的3d摄像机226和/或rgb摄像机228捕获的场景的图像和/或帧。如图4a所示,深度图像可以包括与例如以上关于图1a和图1b描述的诸如用户118这样的用户相对应的人类目标以及一个或多个非人类目标,比如所捕获的场景中的墙壁、桌子或监视器等。如上所述,深度图像可以包括多个所观测的像素,每个所观测的像素具有与之相关联的所观测的深度值。例如,深度图像可以包括所捕获的场景的二维(2d)像素区域,其中2d像素区域中具体x值和y值处的每个像素可以具有深度值,比如所捕获的场景中的目标或对象与捕获设备的以例如厘米或毫米等计的长度或距离。换言之,深度图像可以针对深度图像中的每个像素指定像素定位和像素深度。在例如由运行时间引擎244实施的分割过程之后,深度图像中的每个像素还可以具有与之关联的分割值。像素定位可由x位置值(即,水平值)和y位置值(即,垂直值)指示。像素深度可由z位置值(也被称作深度值)指示,其指示了在被用来获得深度图像的捕获设备(例如,120)与用户的由像素表示的部分之间的距离。分割值被用来指示像素是与特定的用户相对应还是不与用户相对应。
在一个实施例中,深度图像可以是彩色的或灰度的,使得深度图像的像素的不同颜色或深浅对应于和/或在视觉上描绘了目标与捕获设备120的不同距离。在接收到图像后,可以从深度图像去除和/或平滑一个或多个高方差和/或有噪的深度值;可以填充和/或重构丢失和/或去除的深度信息的一些部分;和/或可以对接收到的深度图像实施任何其他合适的处理。
图4b提供了深度图像的另一视图/表示(不对应于与图4a相同的示例)。图4b的视图将针对每个像素的深度数据示为针对该像素的、表示目标到捕获设备120的距离的整数。图4b的示例性深度图像示出了24x24个像素;然而有可能会使用更高分辨率的深度图像。
图5a示出了由骨骼识别引擎192生成的示例性身体模型70的非限制性视觉表示。身体模型70是所建模的目标(例如,来自图1a和图1b的用户118)的机器表示。身体模型70可以包括一个或多个数据结构,所述一个或多个数据结构包括以游戏或其他应用/操作系统的语言共同定义所建模的目标的一组变量。
在不脱离本公开内容的范围的情况下,可以以各种不同方式配置目标的模型。在一些示例中,身体模型可以包括将目标表示为三维模型的一个或多个数据结构,所述三维模型包括刚性的和/或可变形的形状或身体部分。每个身体部分可以被表征为数学本原,其示例包括但不限于球体、各向异性缩放的球体、圆柱体、各向异性圆柱体、光滑圆柱体、箱、斜面箱(beveledbox)和棱柱等。在一个实施例中,身体部分是关于身体部分的轴对称的。
例如,图5a的身体模型70包括身体部分bp1至bp14,其中每个身体部分表示所建模的目标的不同部分。每个身体部分是三维形状的。例如,bp3是表示所建模的目标的左手的矩形棱柱,并且bp5是表示所建模的目标的左上臂的八边棱柱。身体模型70是示范性的,因为身体模型70可以包含任何数目的身体部分,每个身体部分可以是所建模的目标的对应部分的任何机器可理解的表示。在一个实施例中,身体部分是圆柱体。
包括两个或更多个身体部分的身体模型70还可以包括一个或多个关节。每个关节可以允许一个或多个身体部分相对于一个或多个其他身体部分而移动。例如,表示人类目标的模型可以包括多个刚性的和/或可变形的身体部分,其中一些身体部分可以表示人类目标的对应解剖学身体部分。此外,模型的每个身体部分可以包括一个或多个结构构件(即,“骨头”或骨骼部分),其中关节位于相邻骨头的相交处。要理解的是,一些骨头可以对应于人类目标中的解剖学骨头,和/或一些骨头可以在人类目标中没有对应的解剖学骨头。
骨头和关节可以共同组成骨骼模型,其可以是身体模型的组成元件。在一些实施例中,可以使用骨骼模型来取代另一类型的模型,比如图5a的模型70。骨骼模型可以包括针对每个身体部分的一个或多个骨骼构件以及相邻骨骼构件之间的关节。图5b和图5c分别示出了示例性骨骼模型80和示例性骨骼模型82。图5b示出了从前面来看的骨骼模型80,具有关节j1至j33。图5c示出了从斜的视角来看的骨骼模型82,也具有关节j1至j33。在不脱离本公开内容的精神的情况下,骨骼模型可以包括更多或更少的关节。下文说明的本系统的另外的实施例使用具有31个关节的骨骼模型来操作。
在一个实施例中,系统100向骨骼模型添加表示身体部分的几何形状,以形成身体模型。注意,不是所有的关节都需要被表示在身体模型中。例如,对于手臂来说,可以存在针对上臂的添加在关节j2和j18之间的圆柱体,以及针对下臂的添加在关节j18和j20之间的另一圆柱体。在一个实施例中,圆柱体的中心轴链接了两个关节。然而,可能并没有任何形状被添加在关节j20和j22之间。换言之,手可能不被表示在身体模型中。
在一个实施例中,针对以下身体部分向骨骼模型添加几何形状:头部、上部躯干、下部躯干、左上臂、左下臂、右上臂、右下臂、左大腿、左小腿、右大腿、右小腿。在一个实施例中,这些各自是圆柱体,然而可以使用另外的形状。在一个实施例中,形状是关于该形状的轴对称的。
身体部分的形状可以与多于两个关节相关联。例如,上部躯干身体部分的形状可以与j1、j2、j5、j6等相关联。
上述身体部分模型和骨骼模型是可以被用作所建模的目标的机器表示的模型类型的非限制性示例。其他模型也在本公开内容的范围内。例如,一些模型可以包括多边形网格、贴片、非均匀有理b样条、细分表面或其他高阶表面。模型还可以包括表面纹理和/或其他信息,以便更准确地表示所建模的目标的衣服、头发和/或其他方面。模型可以可选地包括关于当前姿势、一个或多个过去姿势和/或模型物理学的信息。要理解的是,能够提出的各种各样的不同模型是与本文描述的目标识别、分析和跟踪系统兼容的。
已知用于在捕获设备120的视场(fov)内生成一个或多个用户的骨骼模型的软件管道。例如在2010年9月7日提交的题为“systemforfast,probabilisticskeletaltracking”的美国专利公开2012/0056800中公开了一个这样的系统。
基于身体模型的质心状态矢量
图6a是运行时间引擎244的一个实施例的图。运行时间引擎244包括基于身体模型的质心状态矢量计算650、约束建模和求解660以及信号分析670。在一个实施例中,基于身体模型的质心状态矢量计算650计算身体部分质心状态矢量和整个身体质心状态矢量。可以将这些状态矢量的一个或多个元素提供给约束建模和求解660以及提供给信号分析670。以下将更详细描述这些元素中的每一个。
依赖于正在跟踪什么用户行为,有时候有用的是能够确定和跟踪用户的质心。可以针对个别身体部分以及针对整个身体跟踪质心。在一个实施例中,基于个别身体部分的质心来确定用户的整个身体质心。在一个实施例中,将身体部分建模为几何形状。在一个实施例中,几何形状关于该几何形状的轴对称。例如,几何形状可以是圆柱体、椭圆体、球体等等。
还可以有用的是跟踪惯性张量。可以针对个别身体部分以及针对整个身体跟踪惯性张量。在一个实施例中,基于个别身体部分的惯性张量来确定用户的整个身体惯性张量。
在一个实施例中,确定身体部分质心状态矢量。身体部分质心状态矢量可以包括但不限于:身体部分的质心位置、身体部分的质心速度、身体部分的质心加速度、身体部分的取向、身体部分的角速度、身体部分的角加速度、身体部分的惯性张量以及身体部分的角动量。质心状态矢量可以包括前述或附加元素的任何子集。注意,出于论述的目的,质心状态矢量可以包含其值不随时间改变的元素。例如,身体部分的惯性张量可以随时间保持恒定(尽管身体部分的取向可以改变)。
在一个实施例中,确定整个身体质心状态矢量。整个身体质心状态矢量可以包括但不限于:整个身体的质心位置、整个身体的质心速度、整个身体的质心加速度、整个身体的取向、整个身体的角速度、整个身体的角加速度、整个身体的惯性张量以及整个身体的角动量。整个身体质心状态矢量可以包括前述或附加元素的任何子集。在一个实施例中,至少部分地基于个别身体部分的质心状态矢量的一个或多个元素来确定整个身体质心状态矢量。
这样的个别身体部分和整个身体质心状态矢量可被使用来跟踪和评估实施诸如深蹲、弓步、俯卧撑、跳跃或分腿跳这样的某些锻炼的用户,以使得能够控制用户的化身,能够向用户奖励点数,和/或能够向用户提供反馈。作为一个具体示例,当用户实施深蹲时,他们的整个身体质心应当上下移动而没有横向运动。
还可以有用的是知道身体部分如何相对于彼此移动。例如,在一个实施例中,当用户在举重时弯举(curl)他们的手臂时,系统100确定下臂如何相对于上臂移动。这种分析可以考虑身体部分的运动而不考虑运动的原因。这有时被称作运动学(kinematics)。前述个别身体部分质心状态矢量信息的至少一些能够被使用。
还可以有用的是知道要求用户身体内的什么力和/或转矩来导致系统100观测到的用户的运动。在一个实施例中,使用逆动力学来确定施加什么力和/或转矩来导致所观测到的运动。这可以是在身体模型中关节处的力和/或转矩。作为一个示例,系统100可以确定在用户实施某种运动时(例如,当出拳、实施弓步或深蹲等时)要求什么样的脚部力量。在某种程度上,可以将身体模型中关节处的力和/或转矩与用户肌肉所施加的力相关。前述个别身体部分和整个身体部分质心状态矢量信息的至少一些能够被使用。
在一个实施例中,通过分析身体模型来确定人的质心。这可以是诸如图5a、5b和/或5c的示例这样的身体模型、或从中导出的身体模型。因此,这可以基于骨骼跟踪。图6b是基于身体模型来确定人的质心的过程600的一个实施例的流程图。在一个实施例中,过程600经由加权平均方法来计算质心。过程600可以通过基于身体模型的质心状态矢量计算650来实施。
在步骤602,接收深度图像。图4a和4b是深度图像的一个示例,但是步骤602不限于该示例。
在步骤604,从深度图像形成身体模型。在一个实施例中,这包括形成具有关节的骨骼模型。在一个实施例中,在形成身体模型时使用骨骼识别引擎192。此外,可以在两个关节之间添加一些几何形状。在一个实施例中,几何形状关于该几何形状的轴对称。例如,几何形状可以是圆柱体、椭圆体、球体等。作为一个示例,在关节j2和j18之间添加圆柱体(参见图5a)以表示用户的上臂。在3d空间中为每个身体部分指派一个位置。
不要求为每个身体部分给出相同的形状。还可以为每个身体部分指派尺寸参数。因此,对于圆柱体,可以为身体部分指派高度和半径。可以使用其他形状,比如但不限于椭圆体、圆锥体和块。
还可以为每个身体部分给出质量(mi)。对于一个示例,以下是身体部分及其相应质量的示例性列表。
表1
可以存在更多或更少的身体部分。不要求到不同身体部分的相对质量分布对每个用户都相同。例如,男性用户可以具有与女性用户不同的质量分布。可以使用各种技术来确定用户的总质量(m)。在一个实施例中,系统请求用户输入他们的质量以及也许还有其他信息,比如年龄、性别等。在一个实施例中,系统基于例如对用户的总体积的分析以及关于密度的假设来估计总质量。可以从深度图像确定总体积。关于密度的假设可以基于各种各样的因素,比如体积的相对分布(例如,用户是否具有大的腰围)。
在步骤606,针对每个身体部分计算质心(pi)。可以基于用来对身体部分建模的形状来计算质心。用于针对各种形状确定质心的公式是本领域中已知的。步骤606可以确定质心的3d位置。在一个实施例中,这是(x,y,z)坐标。然而,也可能使用另一坐标系(例如,圆柱坐标系、球坐标系)。
在步骤608,基于个别身体部分的质心来计算整个人的质心。可以使用等式1来确定整个人的质心。
在等式1中,p是最终质心位置,m是质量之和
根据一个实施例,除了基于身体模型确定质心之外,还能够基于身体模型确定惯性张量。局部惯性张量的计算可以依赖于身体部分的形状和该形状的取向两者。可以经由身体部分的方向来确定取向(例如,上臂的方向是从肩部到肘部),并且通过使用对称的身体部分(例如,圆柱体)来使之更容易。
图7a是基于身体模型来确定惯性张量的过程700的一个实施例的流程图。过程700可以被使用来针对每个身体部分以及针对整个人确定惯性张量。过程700可以由图6a的运行时间引擎244的基于身体模型的质心状态矢量计算650来实施。
在步骤702,针对每个身体部分确定惯性张量ib。这在本文中被称作“基本惯性张量”。在一个实施例中,身体部分具有圆柱体形状。具有半径r和高度h的实心圆柱体的惯性张量可以被确定为:
在该示例中,利用具有沿着圆柱体长度的z轴的参照系来计算惯性张量。这仅仅是一个示例,可以使用许多其他形状。
在步骤704,确定每个身体部分的取向。在一个实施例中,这是基于骨骼跟踪数据来确定的。例如,可以基于关节j2和j18的3d坐标(参见图5b)来限定上臂的身体部分取向。在身体部分被建模为圆柱体的示例中,这可以是圆柱体的中心轴。各种身体部分的中心轴(或取向)将很有可能彼此不平行。
在一个实施例中,使用平行轴定理从个别身体部分惯性张量计算整个身体惯性张量。平行轴定理能够被使用来在整个身体的参照系中重新用公式表示身体部分的惯性张量。换言之,平行轴定理可以被使用来依照整个身体的参照系表示身体部分的惯性张量。如公知的,平行轴定理涉及使用两个平行轴。第一轴针对整个身体,其在目标参照系中。第一轴经过整个身体的质心。第二轴是经过身体部分的质心并且与第一轴平行的轴。轴的挑选是任意的,只要两个轴平行即可。也就是说,能够对第一轴和第二轴进行许多不同的挑选。在使用良好地挑选的身体部分时,惯性张量的表示非常简单。如以上指示的,当在所选择的参照系中测量时,身体部分惯性张量可以是对角矩阵。然而,身体部分参照系很少与整个身体参照系相同。因此,可以实施旋转以把身体部分惯性张量旋转成使得它在整个身体的参照系中。在步骤706,将每个身体部分的惯性张量旋转到目标(整个身体)参照系。注意,挑选导致对角矩阵的、针对身体部分的局部参照系简化了计算,但并不要求如此。可以如等式2中那样实现旋转技术:
ii=oibot(等式2)。
在等式2中,o是从局部空间到目标惯性参照系的旋转矩阵,ib是基本惯性张量,并且ot是旋转矩阵o的转置。旋转矩阵将惯性张量从一个参照系“旋转”到另一个参照系。这种旋转矩阵的示例能够在动画中找到,其中旋转矩阵是用来基于下层的(underlying)骨骼正在做什么来安置顶点的旋转-缩放-平移系统的一部分。利用等式2,可以使用类似种类的3x3旋转矩阵将惯性张量从一个参照系旋转到另一个参照系。
在步骤708,确定整个人的惯性张量。可以将步骤708看作是在针对所有身体部分完成步骤706之后对所有身体部分惯性张量的总计。在一个实施例中,这是每元素(per-element)求和,其针对整个身体产生最终3x3惯性张量。这可以使用等式3来计算。
在等式3中,i是总体惯性张量,ii是针对身体部分的局部惯性张量(在与i相同的参照系中),mi是身体部分的质量,n是身体部分的数目,ri是从身体部分质心到整个身体质心(p)的矢量,并且e是单位矩阵。“.”运算符是点运算符(ritri),并且“t”上标是矢量的转置。
在一个实施例中,使用惯性张量来分析用户如何实施运动。例如,用户可以实施两次跳跃,其中它们的质心达到相同的高度。然而,在一种情况下用户可能伸长,而在另一种情况下用户可能或多或少紧缩在一起更像球样形状。系统100能够基于整个身体惯性张量容易地察认这两种情况之间的甚至细微的差别。惯性张量的许多其他用途是可能的。
在一个实施例中,除了针对身体部分的质心和惯性张量之外,还计算针对身体部分的其他质心状态矢量元素。针对身体部分的质心状态矢量可以包括以下之中的一个或多个:身体部分的质心位置、身体部分的质心速度、身体部分的质心加速度、身体部分的角速度、身体部分的角加速度、身体部分的惯性张量以及身体部分的角动量。
图7b是用于确定身体部分质心状态矢量中的元素的过程的一个实施例的流程图。该过程可以由基于身体模型的质心状态矢量计算650来实施。在步骤722,访问对于不同时间点的身体模型。这可以针对两个连续帧。
在步骤724,确定每个身体部分的质心的速度。在一个实施例中,通过比较两个时间点的质心的位置来确定质心的速度。这可以针对图像数据的两个连续帧。然而,质心的速度可以基于质心位置的多于两个的数据点。在一个实施例中,步骤724使用来自两个不同时间点的来自步骤606的数据。
在步骤726,确定每个身体部分的质心的加速度。在一个实施例中,通过比较两个时间点的质心的速度来确定质心的加速度。这可以针对图像数据的两个连续帧。然而,质心的加速度可以基于质心速度的多于两个的数据点。在一个实施例中,在步骤726中使用来自步骤724的(针对两个不同时间点的)速度数据。
在步骤728,确定每个身体部分的角速度(ωi)。在一个实施例中,将每个身体部分建模为具有轴的形状。该形状可以关于该轴对称。例如,身体部分可以是具有轴的圆柱体,该轴是由圆柱体的两个底的中心形成的直线。基于两个时间点的身体部分的位置之间的差,可以用公知的公式来计算角速度。可以相对于不同于轴的基准点来确定角速度。此外,不要求形状关于充当确定角速度的基准的轴对称。步骤728可以使用针对两个不同时间点的来自身体模型的数据。
在步骤730,确定每个身体模型的角加速度(αi)。在一个实施例中,基于针对两个时间点的身体部分的角速度(ωi)之间的差来确定身体部分的角加速度(αi)。步骤730可以使用针对两个不同时间点的来自步骤728的数据。然而,可以使用其他技术。在实施例中,根据等式4来确定每个身体部分的角加速度(αi)。
αi=dωi/dt等式4。
在步骤732,确定每个身体部分的角动量(li)。在一个实施例中,基于在步骤702中确定的身体部分的惯性张量(ii)和在步骤726中确定的角速度ωi来确定身体部分的角动量。可以根据等式5来确定个别身体部分的角动量(li)。
li=iiωi等式5。
在一个实施例中,除了整个身体的质心和惯性张量之外,还计算整个身体的其他质心状态矢量元素。整个身体的质心状态矢量可以包括以下中的一个或多个:整个身体的质心位置、整个身体的质心速度、整个身体的质心加速度、整个身体的取向、整个身体的角速度、整个身体的角加速度、整个身体的惯性张量以及整个身体的角动量。整个身体的质心状态矢量可以包括前述或附加元素的任何子集。
图7c是用于确定整个身体部分质心状态矢量中的元素的过程的一个实施例的流程图。该过程可以由图6a的运行时间引擎244的基于身体模型的质心状态矢量计算650来实施。在步骤744,确定整个身体的质心的速度。在一个实施例中,通过比较针对两个时间点的质心的位置来确定质心的速度。在一个实施例中,在步骤744中,可以使用在步骤608中(针对两个时间点)确定的整个身体的质心位置。如公知的,可以利用距离差比时间差来计算速度。
在步骤746,确定整个身体的质心的加速度。在一个实施例中,通过比较针对两个时间点的质心的速度来确定质心的加速度。在一个实施例中,在步骤746中使用(针对两个不同时间点的)来自步骤744的速度数据。
在步骤748,确定整个身体的角动量(l)。在一个实施例中,基于在图7b的步骤732中确定的每个身体部分的角动量(li)和每个身体部分的角动量对总体角动量的非旋转贡献(lnri)来确定整个身体的角动量。在图7b的步骤732论述了每个身体部分的角动量(li)的计算。
在一个实施例中,通过将身体部分看作具有该身体部分的质量并且以其质心的加速度移动的质点,来计算该身体部分对总体角动量的非旋转贡献(lnri)。可以使用用于计算围绕某点(在这种情况下,该点是整个身体的质心)的一组质点的角动量的标准公式(参见等式6a)。
在等式6a中,lnr是所有身体部分对整个身体角动量的非旋转贡献之和,ri是相对于整个身体质心位置的身体部分质心位置,mi是身体部分的质量,vi是相对于整个身体质心的线性速度的身体部分的线性速度,并且“x”是叉积(crossproduct)运算符。可以从步骤744获得整个身体的质心的速度。可以从图7b的步骤724获得身体部分的质心的速度。
对每个身体部分的个别角动量(li)求和并与在等式6a中确定的所有身体部分的对整个身体角动量的非旋转贡献之和(lnr)相加,以产生总体角动量。
在步骤750,确定整个身体的角速度(ω)。在一个实施例中,从在步骤748中确定的整个身体的角动量和整个身体的惯性张量的倒数(inverse)来计算整个身体的角速度(ω)。在图7a的步骤708确定了整个身体的惯性张量。
在步骤752,确定整个身体的角加速度(α)。在一个实施例中,根据等式7来确定整个身体的角加速度(α),其中可以根据步骤750来确定ω。在一个实施例中,使用针对不同时间点的来自步骤750的数据。
α=dω/dt等式7。
可以使用质心和惯性张量以及质心状态矢量中的其他元素来分析用户的活动。在一个实施例中,确定为了导致质心状态矢量改变而需要身体部分施加的力。例如,当用户锻炼时,他们的脚需要施加一些力以便使他们跳跃、扭动等等。这些力把重心转移和转动/扭转身体所要求的脚部力量(例如,你出拳多猛以及需要多大的脚部力量来防止脚滑动?)的因素都包括进来。
可以基于脚受到大地约束的假设来计算脚部力量。换言之,系统100确定要求什么样的脚部力量来以所观测的方式改变质心状态矢量。在一个实施例中,做出身体是刚性体的假设。
图8a是确定导致质心状态矢量改变所需要的力的一个实施例的流程图。在一个实施例中,质心状态矢量是整个身体质心状态矢量。在一个实施例中,力是脚部力量。
在步骤802,确定针对一个时间点的整个身体质心状态矢量。这可以是针对图像信号的单一帧。在一个实施例中,该过程使用位置、取向、速度和角速度来计算力(比如脚部力量)。位置可以是如在图6b的步骤608中确定的整个身体质心位置。整个身体的取向可以在确定整个身体的惯性张量时在图7a中已被确定。速度可以是如在图7c的步骤744中确定的整个身体质心速度。角速度可以是如在图7c的步骤748中确定的整个身体角速度。整个身体质心状态矢量可以包括前述或附加元素的任何子集。
在步骤804,确定针对稍后时间点的整个身体质心状态矢量。这可以是针对图像数据的下一帧。在步骤806,确定在两个整个身体部分质心状态矢量之间的差。
在步骤808,确定改变整个身体质心状态矢量所要求的脚部力量。步骤808可以由图6a中描绘的运行时间引擎中的约束建模和求解660来实施。
在一个实施例中,将身体看作是刚性体,其中脚作为大地上的约束点。脚可以是刚性体与大地之间的约束点。可以从身体模型确定脚的定位。例如,脚位置可以是角接点(anglejoint)或某一其他点的3d坐标。
在一个实施例中,做出脚不滑移的假设。然而除了脚以外的其他元素可以被用于约束。许多技术有可能用于求解具有一个或多个约束的刚性体问题。用于求解具有一个或多个约束的刚性体问题的技术在本领域是已知的。作为一个示例,可以使用高斯-赛德尔方法。
图8a的过程提供用于准确的脚部(或其他元素)力量生成,连同跟踪瞬时效应的能力。例如,如果用户深蹲,则脚部力量随着用户开始“下落”而变得更轻,然后更重以“中断”下落,从而用户的质心停住。将角速度并入计算中以及从帧到帧(例如两个时间点之间)的角速度改变操纵了系统的旋转部分。在一个实施例中,这是整个身体角速度。该技术可以比仅示出“静”力——其如同在用户没有处于运动中的情况下支撑用户所要求的力中一样——的脚部力量生成技术更准确。
在一个实施例中,系统100通过将身体看作是布偶来计算肌肉力量/转矩,所述布偶具有通过惯性张量计算所使用的形状来指定的身体部分以及由身体的构形指定的约束。例如,上臂是一个身体部分,下臂是另一个身体部分,并且二者由位于肘部的约束来连接。此外,如果发现脚与大地接触,就针对处于这样的接触中的每只脚添加约束。
图8b是使用全身基于冲量的约束求解的肌肉力量/转矩计算的一个实施例的流程图。在步骤852,针对时间点确定身体部分质心状态矢量。这可以是针对图像数据的单一帧。在一个实施例中,身体部分质心状态矢量包括位置、取向、速度和角速度。可以针对每个身体部分确定该矢量。
身体部分质心位置可以在图6b的步骤606中确定。取向可以从身体部分的轴的取向确定。例如,如果将身体部分建模为圆柱体,则所述取向可以基于圆柱体的中心轴。速度可以是如在图7b的步骤724中确定的身体部分质心速度。角速度可以是如在图7b的步骤728中确定的身体部分角速度。身体部分质心状态矢量可以包括前述或附加元素的任何子集。
在步骤854,针对另一时间点重复步骤852。在步骤856,确定两个身体部分质心状态矢量之间的差。
在步骤858,将身体部分建模为一组关节约束。在步骤860,系统100计算用来移动身体部分以导致在两个最新近的帧之间的身体部分质心状态矢量的改变的力和/或转矩。实际上,步骤860确定要求什么伪肌肉(pseudo-muscles)来实现整个身体运动。步骤858和860可以由约束建模和求解660来实施。
步骤860可以包括计算全身求解,使得在身体一侧进行的运动能够影响另一侧。这可以被称作“一般文献中的逆动力学”。逆动力学产生的是在运动发生时在身体各处跟踪瞬时力/转矩的能力。例如,如果你伸臂出拳,由于关于大小相等和方向相反的力的牛顿定律,你的身体必须反转矩(counter-torque)以使它保持在适当位置。如果你弯曲你的手臂,这要求转矩。但是你的肩部必须抵抗该肘部转矩而反转矩,并且你的躯干,一直到脚,必须调整以适应肩部。然后,力去往另一方向,意味着最终的肘部转矩必须将肩部在做什么的因素包括进来。这最终成为全系统的求解。
在一个实施例中,使用高斯-赛德尔(gauss-seidel)方法来求解约束。例如,能够一次求解一个约束。然后能够将结果施加到整个系统。然后,求解下一个约束并将结果施加到整个系统。在求解所有约束之后,能够重复该过程直到结果收敛。
在一个实施例中,使用基于冲量的技术来求解约束。再次地,每个约束可以独自地被孤立地求解。能够基于惯性张量、质心来计算使两个身体部分合成一体或阻止扯开它们所需要的冲量。
步骤860的结果是在约束下的一组力/转矩,其可以代表“肌肉”和“关节力”。
用于重复检测和分析的信号分析
当随时间来标绘与重复性运动相关联的参数(例如,质心、左肘部速度等等)时,标绘图可以类似信号。在练习(比如身体健身练习)的情况下,这些信号中的许多信号有属于它们的特有的“脉冲”样子,其中值从一个位置移位,在某一方向上移动,然后在“重复”的结尾返回到原始位置。一个实施例包括对这些序列进行察认的重复察认和粗略界定系统。
在一个实施例中,系统100实施对信号的重的(heavy)平滑,然后切换到导数域(例如,位置变成速度等)。进行“重的平滑”是要消除信号中的较高频率数据(例如,噪声),并且使导数平滑,该导数在别的情况下可能由于这样的高频数据而胡乱地摆动。存在许多用于施加这种平滑的标准技术,比如低通滤波、移动平均等。
导数域中的信号可以是正弦曲线。系统100接着分析伪正弦信号。根据一个实施例,通过确保正弦曲线的“向上”部分(“up”part)对于该正弦信号的“向下”部分(“down”part)是相当大的部分,并且通过确保重复足够长且具有足够的位移,系统100能够鲁棒地察认“重复”并界定每个重复的开始/结束时间。
图9a是分析由正在被捕获系统跟踪的用户实施的重复的过程900的一个实施例的流程图。过程900可以由图6a的运行时间引擎244的信号分析670实施。
在步骤902,捕获深度图像的帧。深度图像数据可以跟踪实施某种重复性运动,比如实施体育锻炼的用户。出于论述的目的,将论述实施多个深蹲的用户的示例。
在步骤904,分析图像数据以确定用于参数的数据点。能够跟踪许多不同类型的参数。可以跟踪质心状态矢量分量中的任何一个。在一个实施例中,随时间跟踪质心的位置。这可能是整个人的质心或身体部分之一的质心。在一个实施例中,质心状态矢量是基于对身体部分的分析。在一个实施例中,质心状态矢量是基于对深度图像的分析(以下要论述的)。因此,图12的基于深度的质心254和/或基于深度的惯性张量256可以提供能够随时间被跟踪的参数。
然而,参数不限于本文描述的质心状态矢量分量。作为另一示例,可以跟踪用户的身体模型上的位置。例如,可以跟踪关节之一。作为另一示例,可以跟踪用户的轮廓上的位置。对于跟踪哪个参数的选择可以依赖于被分析的姿态(例如,体育锻炼)。可以在姿态数据库240中指定针对具体姿态而言要跟踪的参数。
在步骤906,形成随时间跟踪数据点的参数信号。参数信号可以跟踪由用户实施的重复性运动。图9b示出了示例参数信号930的表示。图9b中的信号图示出了针对感兴趣的参数的位置与时间。在这种情况下,参数可以是整个身体质心的位置。在该示例中,位置可以是z坐标。换言之,这可以跟踪相对于地面的用户质心。这可能是针对:基于对身体部分的分析的质心状态矢量、基于对深度图像的分析的(例如基于像素的)质心状态矢量或某种其他质心状态矢量。
参数信号930覆盖了例如深蹲移动的两个重复,所述深蹲移动由以下动作构成:在弯曲腿部的同时降低身体,然后起立返回。在一个实施例中,做出基于重复的练习由以下动作构成的假设:以一个姿势开始,做某事,然后返回到开始姿势。该序列可以被称作重复。
在图9b的示例中,参数信号930随时间跟踪参数的一个维度。然而,参数信号930可能随时间跟踪参数的两个或三个维度。例如,针对质心位置的参数可以具有三个维度。在这种情况下,可以随时间跟踪维度中的一个、两个或三个。在一个实施例中,参数信号930跟踪用于该参数的位置与时间。
参数信号930可以跟踪除了位置与时间以外的某事。例如,参数信号930可能跟踪速度与时间、加速度与时间、角速度与时间、角加速度与时间以及角动量与时间。
在步骤908,将参数信号930分成重复性运动的重复。在一个实施例中,将参数信号930分成各自包含重复的范围段。范围段可以将重复性运动的一次重复区别于重复性运动的其他重复而被描绘出来。
在一个实施例中,步骤908包括对来自步骤906的参数信号930求导。图9c示出了一个示例性导数信号940。在该示例中,导数信号940具有中/下/上/下/中波型。另一可能的波型是中/上/下/上/中。还有其他波型是可能的。在这两个示例中,导数信号940去到零线的一侧,然后到另一侧,然后倒退回零点位置(neutralposition)。在该示例中,导数信号940的与重复相对应的部分可以类似正弦函数;然而不要求导数信号940(或其部分)类似正弦函数。
如以上提到的,在一个实施例中,参数信号930跟踪用于参数的位置与时间。在这种情况下,导数信号940可以跟踪用于参数的速度与时间。在一个实施例中,系统100跟踪质心的位置与时间以及质心的速度与时间。因此,参数信号930可以从位置数据形成,并且导数信号940可以从速度数据形成。
在一个实施例中,速度数据从位置数据形成。例如,可以从针对两个(或更多个)时间点的位置数据确定针对一个时间点的速度数据。在一个实施例中,通过跟踪针对两个时间点的位置数据之间的差并除以时间差,来确定速度数据。然而,可以使用多于两个的时间点。因此,可以基于参数信号930中的两个数据点之间的差来实施对参数信号930的“求导”。
在图9c中标记了时间点t0、t1和t2以示出可以如何界定导数信号940。在一个实施例中,每个范围段包含一个重复。从t0-t1的第一范围段对应于包含第一重复的第一范围段。从t1-t2的第二范围段对应于包含第二重复的第二范围段。然后可以将时间与参数信号930相关,以按照类似的方式界定参数信号930。
返回参考参数信号930,出于各种原因,(例如总体用户活动、数据不准确性),脉冲的结束点(例如,在t1附近)可能不在开始附近(例如,在t0附近)。例如,在实施第一深蹲之后的z位置可能比实施第一深蹲之前的z位置低。这可能使得难以准确地确定每个重复是何时进行的,以及难以分析用户的形态。
一个实施例的导数方法绕开了这个问题,因为在参数稳定时导数信号940将返回零(或接近零)。例如,当用户停止向上或向下移动时,(质心、骨骼关节、轮廓上的点等等的)z位置暂时地稳定。在该示例中,导数信号940在返回零(或接近零)之前,变为负,然后为正。当导数信号940这么表现时,系统100能够精确地界定重复。
系统100还可以具有一些合理性检查。例如,系统100可以确保重复具有最大/最小时间。系统100还可以确保导数信号940距零的偏移对两侧均是足够的(例如,确保正侧对于负侧是相当大的部分)。
在步骤910,系统100使用信号处理技术来分析参数信号930中的重复。在一个实施例中,步骤910包括进一步细化重复的开始或结束的定位。在一个实施例中,进一步细化重复的开始或结束的定位包括:用曲线来拟合参数信号930的与重复相对应的部分。在一个实施例中,进一步细化重复的开始或结束的定位包括:将参数信号930的与重复相对应的部分与参数信号930自相关。
在一个实施例中,步骤910包括评估在参数信号930中捕获的重复的用户表现。在一个实施例中,评估用户的表现是基于在所拟合的曲线与参数信号930之间的差异。在一个实施例中,评估用户的表现包括将参数信号930的限定了一个重复的部分从参数信号930的限定了另一个重复的另一部分中减去。
对重复进行曲线拟合以确定重复定时
一旦系统100已界定重复,系统100就可以用曲线拟合被界定的重复的开始/结束之间的参数信号930。利用曲线拟合的结果,系统100能够提取关于重复的另外的有用信息,比如重复时间(例如,深蹲用了多长时间)。示例性曲线包括但不限于余弦、余弦脉冲、在脉冲的中间具有平坦部分的余弦脉冲以及样条拟合(线性的和三次的)。
对于紧密拟合系统100所适合的曲线类型的重复而言,使用曲线拟合优化技术提供了非常准确的重复定时信息。系统100还可以经由曲线与参数信号930多紧密地拟合来确定运动者有多好地完成了重复。
图10a是用曲线拟合已界定的重复以确定定时参数的过程1000的一个实施例的流程图。过程1000可以由图6a的运行时间引擎244的信号分析来实施。在步骤1002中,用曲线拟合参数信号930的与范围段相对应的部分。图10b示出了拟合参数信号930的与范围段相对应的部分的示例性曲线1030。在该示例中,曲线1030具有五个部分。存在直到重复开始的第一平坦部分、在重复开始时起始的第一余弦部分、在重复的底部的第二平坦部分、在重复返回时起始的第二余弦部分、以及在重复结束之后的第三平坦部分。可以使用不同类型的曲线1030。曲线1030的类型可以依赖于用户运动的类型(例如,锻炼的类型)。
步骤1004用于确定针对重复的定时参数。曲线拟合便利了从拟合的曲线提取有用数据,因为分析数学函数常常比分析参数信号930容易得多。例如,如果系统100用半个余弦波拟合参数信号930,则系统100能够使用余弦开始/结束时间来确定重复何时开始/结束。因此,在一个实施例中,系统100查看曲线1030上特定的点来确定针对重复的定时参数。在一个实施例中,系统100寻找在曲线1030的平坦部分与曲线1030的升高/降低部分之间的接合点,以确定针对重复的定时参数(比如重复开始/结束时间)。然而,可以将开始/结束时间限定在除了这样的接合点以外的点。
可以经由俯卧撑练习来示出这有多有用的示例。在俯卧撑练习中,存在三个部分。人向下降低,保持较低位,然后向上升回。通过跟踪用户的位置(例如,肩部的高度),系统100能够使用拟合的曲线来确定重复的定时。在这种情况下曲线可以是平坦底部余弦曲线。这简单地是半个余弦波,其中余弦的底部(在这种情况下)具有任意长度的平坦区。当进行曲线拟合例程时,系统100能够分析性地测量向下移动所用的时间(半余弦波的第一半部),确定运动者在底部有多久(平坦部分)以及运动者用了多久升回来(半余弦波的第二半部)。
在一个实施例中,确定在拟合的曲线与参数信号930之间的差异以便确定用户有多好地实施了重复。在可选的步骤1006中,确定在拟合的曲线1030与参数信号930之间的差异。在可选的步骤1008中,系统100基于这些差异来评估重复的用户表现。
dsp自相关和信号减法
在一个实施例中,使用信号处理(例如,数字信号处理(dsp))技术来分析在一系列重复上的参数信号930。在一个实施例中,使用快速傅立叶变换(fft)自相关技术,通过获得参数信号930的包含一个重复的部分并使它沿着参数信号930相关,来确定两个重复何时出现。结果自相关的峰值可能是在参数信号930中与重复最匹配的地方(通常是序列中的下一个重复)。结果可以是非常准确的重复到重复定时值,其在定时方面指示了重复a何时最佳地与重复b一致。
在一个实施例中,系统100将参数信号930的限定了一个重复的部分从参数信号930的限定了另一个重复的另一部分中减去,从而使用该增量(delta)时间来看重复有多么不同。这提供了附加的工具来分析人从重复到重复是如何实施的。
图11a是用于使用信号处理来分析参数信号930的过程1100的一个实施例的流程图。过程1100可以由图6a的运行时间引擎244的信号分析来实施。在步骤1102,对参数信号930的一个部分实施与参数信号930的自相关。在一个实施例中,将参数信号930的已界定的部分与参数信号930的某个部分自相关,参数信号930的该部分的长度可以是几个范围段、许多范围段、某种其他单位等等。例如,系统110可以拾取时间帧,比如10秒,并将一个范围段(具有一个重复)相对于该整个范围自相关。在一个实施例中,系统100使用基于快速傅立叶变换(fft)的自相关技术来找到参数信号930哪里与它自己相似。
在步骤1104,系统100基于自相关的一个实施例的结果来限定参数信号930中重复的定位。例如,可以使用峰值来定位重复。图11b示出了自相关的示例。示出了示例性参数信号930,连同参数信号930的已界定的部分1120。可以直接从参数信号930取已界定的部分1120。可以通过图9a的过程来限定已界定的部分1120的范围。可以将已界定的部分1120与参数信号930的任何部分(例如过去的、目前的和/或未来的)自相关。
示例性自相关信号1130具有多个峰值1140a-1140e。可以使用这些峰值1140来精确地确定重复之间的时间间隙。还可以使用这些峰值1140来限定重复的精确定位。最高峰值1140将典型地对应于已界定的部分与它自己相比的部分。
在可选的步骤1106中,将参数信号930的与一个重复相对应的一个部分从参数信号930的与另一个重复相对应的另一个部分中减去。该步骤的准确度可以借助于在步骤1104中确定的重复的精确定位。
步骤1106中的两个部分不是必须包括整个范围段,尽管这是一种可能性。在一个实施例中,确定重复的开始和/或结束的精确定位(例如通过使用图10a的步骤1004)以确定应当使用什么部分。
在可选的步骤1108中,系统100基于两个重复之间的差异来确定用户有多好地实施了重复。例如,如果用户累了,则重复的形状可能从一个重复到下一个重复发生改变。如果参数信号930对于两个重复是相同的,则结果将是平坦的线。能够分析与平坦的线的偏差。
在一个实施例中,不是将参数信号930的已界定的部分与参数信号930的其他部分自相关,而是将已界定的部分与保存的参数信号930相关。保存的参数信号930可以针对具体运动的理想形态。
基于深度图像的质心和惯性张量
图12图示了在图2中介绍的运行时间引擎244的示例性实施例。参考图12,运行时间引擎244被示为包括深度图像分割模块252、基于深度的质心模块254、基于深度的惯性张量模块256和缩放器258。在实施例中,深度图像分割模块252被配置成检测深度图像内的一个或多个用户(例如,人类目标),并将分割值与每个像素相关联。这样的分割值被用来指示哪些像素与用户相对应。例如,分割值1可以被指派给对应于第一用户的所有像素,分割值2可以被指派给对应于第二用户的所有像素,并且可以把任意的预定值(例如255)指派给不对应于用户的像素。也可能的是,分割值可以被指派给在深度图像中被辨别的除了用户以外的对象,比如但不限于网球拍、跳绳、球或地面等。在实施例中,作为由深度图像分割模块252实施的分割过程的结果,深度图像中的每个像素将具有与该像素相关联的四个值,包括:x位置值(即,水平值);y位置值(即,垂直值);z位置值(即,深度值);以及以上刚说明的分割值。换言之,在分割之后,深度图像能够指定多个像素与用户相对应,其中这样的像素也可以被称作用户的基于深度的轮廓。此外,深度图像能够为与用户相对应的每个像素指定像素定位和像素深度。像素定位能够由x位置值(即,水平值)和y位置值(即,垂直值)指示。像素深度可以由z位置值(也被称作深度值)指示,其指示在用来获得深度图像的捕获设备(例如,120)与由该像素表示的用户部分之间的距离。
仍然参考图12,在实施例中,基于深度的质心模块254被使用来确定对于与用户相对应的多个像素的基于深度的质心位置,其计及了由所述像素表示的用户部分与用于获得深度图像的捕获设备之间的距离。以下参考图7a-8b描述与确定基于深度的质心位置有关的附加细节。在实施例中,基于深度的惯性张量模块256被使用来基于针对与用户相对应的多个像素而确定的基于深度的质心位置,而确定针对与用户相对应的所述多个像素的基于深度的惯性张量。以下参考图7a-8b描述与确定基于深度的惯性张量有关的附加细节。如在附加细节中描述的,参考图13a-14b,缩放器258能够被使用来利用以下假设而缩放所确定的基于深度的惯性张量:与用户相对应的多个像素具有预定的质量(例如,75kg)。
如以上说明的,捕获设备120向计算系统112提供rgb图像(也称为彩色图像)和深度图像。深度图像可以是多个所观测的像素,其中每个所观测的像素具有所观测的深度值。例如,深度图像可以包括所捕获的场景的二维(2d)像素区域,其中2d像素区域中的每个像素可以具有深度值,比如所捕获的场景中的对象与捕获设备的例如以厘米或毫米等计的长度或距离。
如以上提到的,常常使用骨骼跟踪(st)技术来检测用户的运动或其他用户行为。本文描述的某些实施例依靠深度图像来检测用户行为。基于深度基本图像检测到的这样的用户行为能够被用来取代或补充用于检测用户行为的st技术。因此,在以附加细节论述这样的实施例之前,首先有用的是提供深度图像的附加细节。在一个实施例中,移动识别器360使用st技术。在一个实施例中,深度识别器358使用深度图像来检测用户行为。
依赖于正在跟踪什么用户行为,有时候有用的是能够确定和跟踪用户的质心位置。例如,能够使用这样的信息来跟踪实施诸如深蹲、弓步、俯卧撑、跳跃或分腿跳这样的某些锻炼的用户,使得能够控制用户的化身、能够向用户奖励点数和/或能够向用户提供反馈。以下论述的某些实施例涉及用于基于深度图像来确定质心位置的技术,且因此这样的位置在下文中应被称作基于深度的质心位置。
在一个实施例中,在基于身体部分确定质心位置时使用等式1。根据实施例,在基于深度图像计算质心而不是将身体部分插入等式1时,使用像素。每个像素对应于三维空间中的定位,能够使用标准自然用户界面(nui)坐标变换来计算该定位。每个像素的“质量”或“重量”是与深度有关的。在实施例中,为了确定像素的质量,使像素的深度值平方,如以下所示:
m=d*d(等式8)
其中“m”是像素的质量,并且“d”是像素的深度值。最终效果是增大较远处像素的“重量”,并且减小较近处像素的“重量”。这么做的原因是因为摄像机(例如,226)经由视锥观看世界,所以相比于近处的像素,较远处相同数目的像素覆盖更大的现实世界“面积”,并且它们覆盖的面积与距离平方成正比。以另一种方式来说,深度图像的像素取决于距离而具有不同的有效表面积。在本文描述的某些实施例中,以补偿这种距离的方式来计算基于深度的质心位置。在没有这种对距离的补偿的情况下,如果用户的手举在摄像机(例如,226)附近,则从摄像机的角度来看用户的手具有与用户身体的其余部分同样大或比之更大的可视面积。这会导致不准确的质心位置。利用距离补偿,与用户的手相对应的每个像素会比与用户身体的更远离摄像机的部分相对应的像素重量小,从而使得能确定准确得多的基于深度的质心位置。
根据实施例,在确定基于深度的质心位置时,仍然使用以上在等式1中示出的常规质心等式,区别仅在于n是与用户相对应的像素的数目(而非身体部分的数目),并且质量mi是使用以上等式8针对每个像素来计算的(而非针对每个身体部分来确定质量)。r是使用标准nui坐标变换技术来计算的像素的位置(三维的)。m是mi之和,即,
完全基于深度图像来确定基于深度的质心位置的优点是,甚至在st技术失败时也能够确定基于深度的质心位置。另一优点是,一旦深度图像在处理管道中可用,就能够确定基于深度的质心位置,从而减小等待时间,因为不需要执行st技术。
现在将使用图13a的高级流程图来概述根据实施例的用于确定基于深度的质心位置的方法。更具体地,图13a是描述了用于针对与用户相对应的多个像素来确定基于深度的质心位置的过程的一个实施例的流程图,其计及了在用户的由像素表示的部分与用来获得深度图像的捕获设备之间的距离。在步骤1302,接收深度图像,其中深度图像指定了多个像素与用户相对应。能够使用位于距用户(例如,118)一段距离处的捕获设备(例如,120)来获得深度图像。更一般地,深度图像和彩色图像可以由本文描述的捕获设备120中的任何传感器或其它在本领域已知的合适的传感器来捕获。在一个实施例中,深度图像与彩色图像分开地被捕获。在一些实现中,深度图像和彩色图像同时被捕获,而在其他实现中,深度图像和彩色图像被顺序地或在不同时间被捕获。在其他实施例中,深度图像与彩色图像一起被捕获或与彩色图像结合为一个图像文件,使得每个像素具有r值、g值、b值和z值(距离)。这样的深度图像和彩色图像能够被传输至计算系统112。在一个实施例中,以每秒30帧来传输深度图像和彩色图像。在一些示例中,深度图像与彩色图像分开地被传输。在其他实施例中,深度图像和彩色图像可以一起被传输。由于本文描述的实施例主要(或仅仅)依靠深度图像的使用,所以其余的论述主要集中于对深度图像的使用,并且因此不论述彩色图像。
在步骤1302接收到的深度图像还能够为与用户相对应的每个像素指定像素定位和像素深度。如以上提到的,像素定位能够由x位置值(即,水平值)和y位置值(即,垂直值)指示。像素深度能够由z位置值(也被称作深度值)指示,其指示在用来获得深度图像的捕获设备(例如,120)与用户的由该像素表示的部分之间的距离。出于本描述的目的,假定在步骤1302接收到的深度图像已经历了分割过程,所述分割过程确定了哪些像素对应于用户以及哪些像素不对应于用户。可替换地,如果在步骤1302接收到的深度图像尚未经过分割过程,则分割过程能够出现在步骤1302和1304之间。
在步骤1304,访问深度图像的像素。在步骤1306,存在对以下的确定:所访问的像素是否对应于要为其确定基于深度的质心的用户。如果步骤1306的确定的答案为否,则流程进行到步骤1312。如果步骤1306的确定的答案为是,则流程进行到步骤1308。在步骤1308,计算像素的质量。如以上参考等式9论述的,能够通过使像素的深度值平方来计算该像素的质量。用于确定像素质量的可替换技术也是可能的并且是在实施例的范围内的,比如查找表的使用或可替换等式的使用,所述可替换等式计入了在用于获得深度图像的捕获设备(例如,120)与用户的由像素表示的部分之间的距离。在步骤1310,(例如在存储器中)存储所计算的或以别的方式确定的像素质量。
在步骤1312,存在对以下的确定:是否还有需要考虑的深度图像的更多像素(即,至少一个像素)。如果步骤1312的确定的答案为否,则流程进行到步骤1314。如果步骤1312的确定的答案为是,则流程返回到步骤1304并且访问深度图像的另一像素。
在考虑了深度图像的所有像素之后,在步骤1314针对与用户相对应的多个像素确定基于深度的质心位置。更具体地,在步骤1314存在基于针对与用户相对应的每个像素所确定的像素质量的、针对与用户相对应的所述多个像素的基于深度的质心位置的确定,其计及了在用户的由像素表示的部分与用于获得深度图像的捕获设备之间的距离。上文描述过用于计算基于深度的质心位置的等式,且因此需要再次描述。在步骤1314,在步骤1310的实例处存储的像素质量能够被访问并被应用到前述等式。
根据某些实施例,除了确定基于深度的质心之外,还能够基于深度图像来确定基于深度的惯性张量。在确定基于深度的惯性张量时,将每个像素看作是质点,并且相对于所确定的基于深度的质心位置来构建基于深度的惯性张量。更具体地,在一个实施例中,使用以下的等式来计算基于深度的惯性张量:
其中i是总体3x3基于深度的惯性张量,n是与用户相对应的像素的数目,mi是与用户相对应的具体像素的质量(例如使用以上等式9来计算的),ri是从所述像素到基于深度的质心位置的三维矢量,e是3x3单位矩阵,“·”是点积运算符,并且
根据某些实施例,然后在假定运动者轮廓的质量是标准质量(例如,75kg)的情况下缩放基于深度的惯性张量。在特定实施例中,通过对mi进行合计并将标准质量除以总和来计算缩放器(scaler),如以下等式所示:
其中ms是标准质量(例如,75kg)。然后通过缩放器来缩放基于深度的惯性张量,如以下等式所示:
iscaled=缩放比例*i(等式11)。
缩放基于深度的惯性张量的原因是:使得缩放后的基于深度的惯性张量正被报告给其的应用的更新不受用户的尺寸的影响。换言之,缩放使应用(例如,246)能够与该应用如何解译相对瘦小的用户的活动或其他行为相类似地解译相对高大的用户的活动或其他行为。缩放基于深度的惯性张量的另一原因是:使得缩放后的基于深度的惯性张量正被报告给其的应用的更新不受用户相对于捕获设备被安置的靠近程度的影响。换言之,缩放使应用(例如,246)能够与该应用如何解译位于相对远离捕获设备处的用户的活动或其他行为相类似地解译位于相对靠近捕获设备处的用户的活动或其他行为。缩放后的基于深度的惯性张量也可以被称作基于深度的惯性张量的缩放版本。
当在深度图像中表示了多于一个用户的情况下,可以针对每个用户实施图13a(以及如下论述的图13b)的方法的单独实例。例如,假定深度图像中的第一像素组对应于第一用户,并且相同深度图像中的第二像素组对应于第二用户。这将导致的是针对与第一用户相对应的多个像素的第一基于深度的质心位置,其计及了在由第一像素组表示的第一用户的部分与用于获得深度图像的捕获设备之间的距离。这还将导致的是针对与第二用户相对应的多个像素的第二基于深度的质心位置,其计及了在由第二像素组表示的第二用户的部分与用于获得深度图像的捕获设备之间的距离。此外,这能够导致与第一用户相对应的多个像素的第一基于深度的惯性张量以及与第二用户相对应的多个像素的第二基于深度的惯性张量。
能够针对附加的深度图像重复参考图13a描述的方法,从而导致针对多个深度图像中的每一个而确定的基于深度的质心位置以及基于深度的惯性张量。当在深度图像中表示了多于一个用户的情况下,每当重复该方法时,能够针对在深度图像中表示的每个用户确定单独的基于深度的质心位置和基于深度的惯性张量。所确定的基于深度的质心位置和基于深度的惯性张量和/或其中的改变可以被使用来跟踪用户行为以及用户行为的改变。例如,可以将所确定的基于深度的质心位置和/或基于深度的惯性张量报告给应用(例如,246),如在步骤1316和1320指示的,并且可以基于被报告给应用的基于深度的质心位置和/或基于深度的惯性张量来更新应用。如在步骤1319指示的,可以在将基于深度的惯性张量报告给应用之前缩放所述基于深度的惯性张量,如以上在等式11的论述中描述的。
在实施例中,基于深度的惯性张量的主轴能够被确定并被使用来在用户伸展(例如,站立、在俯卧撑位置或在平板位置)时辨别用户的“长轴”。更具体地,可以将基于深度的惯性张量分解成特征向量和特征值。然后可以通过辨别最短特征值的特征向量来辨别用户的“长轴”。例如,当用户站立时,与最小特征值相关联的特征向量将是笔直向上的。对于另一示例,当用户在俯卧撑或平板位置时,与最小特征值相关联的特征向量将是沿着用户身体线的。
对于某些应用,基于深度的质心位置和/或基于深度的惯性张量可能为应用提供足够的信息来更新应用。对于某些应用,基于深度的质心位置和/或基于深度的惯性张量可能为应用提供不足以更新应用的信息。例如,在应用正在尝试确定用户是否在恰当地实施分腿跳型锻炼的情况下,对于应用而言单单留意基于深度的质心位置和/或基于深度的惯性张量可能并不足够。
现在参考图13b,如在步骤1322和1324指示的,根据某些实施例,为了从深度图像收集附加的有用信息,将与用户相对应的多个像素分成象限,并且针对每个象限确定单独的基于深度的象限质心位置。此外,可以针对每个象限确定单独的基于深度的象限惯性张量,如在步骤1328指示的。可以使用所确定的基于深度的象限质心位置和基于深度的象限惯性张量和/或其中的改变来跟踪用户行为以及用户行为的改变。更具体地,可以将所确定的基于深度的象限质心位置和/或基于深度的象限惯性张量报告给应用(例如,246),如在步骤1326和1330指示的,并且可以基于报告给应用的所述基于深度的象限质心位置和/或基于深度的象限惯性张量来更新应用。跟踪基于深度的象限质心位置和/或基于深度的象限惯性张量的改变使得能跟踪特定身体部分的位置的(以及因此是运动的)改变和/或用户的质量分布的改变,如从以下论述的图14a和14b能够认识到的。
在实施例中,当在步骤1324将(深度图像的)与用户相对应的多个像素分成象限时,在步骤1314所确定的基于深度的质心位置被用作所有四个象限的角彼此相汇的点。以另一种方式来说明,在步骤1324,可以使用相交于在步骤1314确定的基于深度的质心位置处的两条线将(深度图像的)与用户相对应的多个像素分成象限。在实施例中,一条这样的线可以是垂直线,其是上下笔直的并且与在步骤1314确定的基于深度的质心位置相交;而另一条线可以是水平线,其垂直于所述垂直线并且在基于深度的质心位置处与所述垂直线相交。然而使用这样的任意绘制的线将(深度图像的)与用户相对应的多个像素分成象限并没有考虑用户的实际位置。根据可替换的实施例,另一技术是辨别基于深度的惯性张量的主轴,并选择主轴之一来用作纵向划分(深度图像的)与用户相对应的所述多个像素的线。然后可以将与主轴中被选择的那个(被用作前述划分线的)垂直的、与基于深度的质心位置(在步骤1314确定的)相交的线用作横向划分(深度图像的)与用户相对应的所述多个像素的线。从图14a和14b的以下论述中能够进一步认识到这些技术。
参考图14a,其中示出的轮廓表示深度图像的与用户相对应的多个像素。在轮廓中间的白色“x”表示针对与用户相对应的多个像素而确定的基于深度的质心位置。在白色“x”处与轮廓相交的水平和垂直白线图示了可以被用来将与用户相对应的多个像素分成象限的线。四个白色“+”表示针对各个象限而确定的基于深度的象限质心位置。深度图像中表示的用户正在实施分腿跳型锻炼。如果针对多个连续的深度图像仅跟踪基于深度的质心位置(由白色“x”表示的),则基于深度的质心位置可能随时间而上下移动。然而仅仅基于上下移动的基于深度的质心位置难以确定用户是简单地在上下跳跃(而没有像恰当的分腿跳中应当的那样移动他们的手臂和腿)还是在实施恰当的分腿跳。在针对每个象限确定基于深度的象限质心位置的情况下,能够收集附加的有用信息,如从图14a能够认识到的。例如,在用户实施恰当的分腿跳时,预期每个基于深度的象限质心位置将沿着可预测的路径来回移动。通过针对每个象限确定基于深度的象限惯性张量,甚至能够收集另外的有用信息。例如,可以使用基于深度的象限惯性张量来确定用户是在朝着捕获设备还是远离捕获设备地移动特定的肢体。这些只是通过分析基于深度的象限质心位置和/或基于深度的象限惯性张量可被破译的用户行为类型的几个示例。阅读本说明书的本领域普通技术人员将能够认识到:还可以根据基于深度的象限质心位置和/或基于深度的象限惯性张量来辨别无数其他行为。
图14b被使用来图示为什么使用在步骤1318确定的基于深度的惯性张量的主轴之一作为纵向划分(深度图像的)与用户相对应的多个像素的线是有益的。参考图14b,其中所示的轮廓表示深度图像的与用户相对应的多个像素,其中用户正在实施俯卧撑型锻炼。在图14b中,从轮廓的头延伸到脚的白线与根据基于深度的惯性张量而确定的主轴之一相对应。图14b所示的与前述主轴垂直并且与基于深度的质心位置(在步骤1314确定的)相交的另一白线被用作横向划分(深度图像的)与用户相对应的多个像素的线。针对每个象限而确定的示范性基于深度的象限质心位置被图示为白色“+”。在图14b中,由像素表示的用户正在做俯卧撑,如上面提到的。从图14b能够认识到,如果使用任意的水平线和垂直线将与用户相对应的多个像素分成象限,则至少一个象限可以包括相对少量的像素,从所述少量的像素将难以搜集有用的信息。
仍然参考图14b,使用将(对应于用户的)多个像素分成象限的两条线之一将两个上部象限与两个下部象限分离。依赖于实现,以及依赖于用户的位置,(将两个上部象限与两个下部象限分开的)这条线可以是主轴或与主轴垂直的线。
如以上提到的,可以使用捕获设备120获得深度图像和rgb图像,并以每秒30帧的速率或以某种其他速率传输至计算系统112。深度图像可以与rgb图像分开地被传输,或者两种图像可一起被传输。继续以上示例,可以针对每个深度图像帧确定上述基于深度的质心位置以及上述基于深度的惯性张量,并且因此能够每秒确定三十个基于深度的质心位置以及三十个基于深度的惯性张量。此外,对于每个深度图像帧,可以确定基于深度的象限质心位置以及基于深度的象限惯性张量。这样的确定可以由以上参考于图12论述的运行时间引擎244来实施。甚至更具体地,参考于图12论述的基于深度的质心模块254和基于深度的惯性张量模块256可以被用来实施这样的确定。
返回来参考图2,运行时间引擎244可以将它的确定报告给应用246。以上参考图13a和13b中的步骤1316、1320、1326和730也论述了这样的报告。现在参考图15,在步骤1502,应用接收指示以下项的信息:基于深度的质心位置、基于深度的惯性张量、基于深度的象限质心位置和/或基于深度的象限惯性张量。如在步骤1504所示的,基于这样的信息来更新应用。例如,如以上提到的,能够使用这样的信息来跟踪实施诸如深蹲、弓步、俯卧撑、跳跃或分腿跳这样的某些锻炼的用户,使得能够控制用户的化身、能够向用户奖励点数和/或能够向用户提供反馈。对于更特定的示例,在应用246是指令用户实施某些锻炼的游戏的情况下,应用246能够确定用户是否以正确形态实施了锻炼,以及在用户没有以正确形态实施锻炼的情况下能够向用户提供关于该用户可以如何改善他们的形态的反馈。
还可能的是,运行时间引擎244与姿态库240交互以将基于深度图像而跟踪的运动或其他行为与基于深度的姿态过滤器相比较,以确定(如由深度图像的像素表示的)用户是否实施了一个或多个姿态。这些姿态可以与应用246的各种控制相关联。因此,计算系统112可以使用姿态库240来解译基于深度图像检测到的活动并基于所述活动来控制应用246。这样,姿态库可以被运行时间引擎244和应用246使用。
被用来获得深度图像的摄像机(例如,226)可能相对于用户所站立的或以别的方式支撑用户的地面倾斜。为了解决这样的摄像机倾斜,可以从传感器(例如,加速度计)或以某种其他方式获得重力矢量,并在计算基于深度的质心位置、基于深度的惯性张量、基于深度的象限质心位置和/或基于深度的象限惯性张量时将所述重力矢量的因素包括进来。在使用与用户相对应的像素以上述方式来确定基于深度的质心位置、基于深度的惯性张量、基于深度的象限质心位置和/或基于深度的象限惯性张量之前,可以对这样的像素实施这样的对摄像机倾斜的解决(accountfor)(也被称作倾斜校正)。在某些实施例中,通过计算将重力矢量旋转到单位y矢量的旋转矩阵来实施倾斜校正,并且在使用像素来确定基于深度的质心位置、基于深度的惯性张量、基于深度的象限质心位置和/或基于深度的象限惯性张量之前,将计算的旋转矩阵施加到所述像素。例如,如果x,y,z重力矩阵为(0.11,0.97,0.22),则所计算的旋转矩阵会将该重力矩阵旋转成(0.0,1.0,0.0)。在可替换实施例中,在没有倾斜校正的情况下计算基于深度的质心位置、基于深度的惯性张量、基于深度的象限质心位置和/或基于深度的象限惯性张量,然后在它们已被确定之后对基于深度的确定施加所计算的旋转矩阵,以便使结果去除倾斜(de-tilt)。在另外的实施例中,取代于使用旋转矩阵来实施倾斜校正,可以使用四元数(quaternion)来实施倾斜校正。正如阅读本说明书的本领域普通技术人员将认识到的,可以使用公知的标准技术来实施旋转矩阵或四元数的计算。因此,能够认识到,用于更新应用的任何基于深度的质心位置、基于深度的惯性张量、基于深度的象限质心位置和/或基于深度的象限惯性张量都可以是已经进行过倾斜校正的。
示例性计算系统
图16图示了计算系统的示例性实施例,所述计算系统可以是图1a-2所示的用于跟踪运动和/或操纵(或以别的方式更新)由应用显示的化身或其它屏幕上对象的计算系统112。以上相对于图1a-2描述的诸如计算系统112这样的计算系统可以是多媒体控制台,比如游戏控制台。如图16所示,多媒体控制台1600具有中央处理单元(cpu)1601,其具有一级高速缓存器102、二级高速缓存器1604和闪存rom(只读存储器)1606。一级高速缓存器1602和二级高速缓存器1604临时存储数据,并因此减少了存储器存取周期的数目,从而改善了处理速度和吞吐量。可以提供具有多于一个核以及因此具有附加的一级高速缓存器1602和二级高速缓存器1604的cpu1601。闪存rom1606可以存储当多媒体控制台1600被加电时在引导过程的初始阶段期间加载的可执行代码。
图形处理单元(gpu)1608和视频编码器/视频编解码器(编码器/解码器)1614形成用于高速和高分辨率图形处理的视频处理管道。经由总线从图形处理单元1608向视频编码器/视频编解码器1614运送数据。视频处理管道向a/v(音频/视频)端口1640输出数据以便传输到电视或其他显示器。存储器控制器1610连接到gpu1608以使处理器容易访问各种类型的存储器1612,比如但不限于ram(随机存取存储器)。
多媒体控制台1600包括优选地实现在模块1618上的i/o控制器1620、系统管理控制器1622、音频处理单元1623、网络接口1624、第一usb主控器1626、第二usb控器1628和前面板i/o子配件1630。usb控制器1626和1628充当外围控制器1642(1)-1642(2)、无线适配器1648和外部存储器设备1646(例如,闪存存储器、外部cd/dvdrom驱动机、可拆卸介质等)的主机。网络接口1624和/或无线适配器1648提供对网络(例如,互联网、家庭网络等等)的访问并且可以是包括以太网卡、调制解调器、蓝牙模块和线缆调制解调器等的广泛的多种多样的有线或无线适配器组件中的任何一种。
提供系统存储器1643来存储在引导过程中加载的应用数据。提供媒体驱动机1644,并且所述媒体驱动机1644可以包括dvd/cd驱动机、蓝光驱动机、硬盘驱动机或其他可拆卸媒体驱动机等。媒体驱动机1644可以在多媒体控制台1600内部或外部。可以经由媒体驱动机1644访问应用数据以供多媒体控制台1600执行、回放等。媒体驱动机1644经由诸如串行ata总线这样的总线或其他高速连接(例如,ieee1394)连接到i/o控制器1620。
系统管理控制器1622提供与保证多媒体控制台1600的可用性有关的各种各样的服务功能。音频处理单元1623和音频编解码器1632形成具有高保真度和立体声处理的对应的音频处理管线。经由通信链路在音频处理单元1623与音频编解码器1632之间运送音频数据。音频处理管道向a/v端口1640输出数据以供具有音频能力的外部音频播放器或设备再现。
前面板i/o子配件1630支持在多媒体控制台1600的外表面上显露的电源按钮1650和弹出按钮1652以及任何led(发光二极管)或其他指示器的功能性。系统电源模块1636向多媒体控制台1600的组件提供电力。风扇1638冷却多媒体控制台1600内的电路装置。
多媒体控制台1600内的cpu1601、gpu1608、存储器控制器1610和各种其他组件经由一条或多条总线互连,所述总线包括串行和并行总线、存储器总线、外围总线以及使用各种各样总线架构中的任一种总线架构的处理器或局部总线。作为示例,这样的架构可以包括外围组件互连(pci)总线、pci-express总线等等。
当多媒体控制台1600被加电时,可以将应用数据从系统存储器1643加载到存储器1612和/或高速缓存器1602、1604中,并在cpu1601上执行。应用可以展现图形用户界面,所述图形用户界面在导航到多媒体控制台1600上可用的不同媒体类型时提供一致的用户体验。在操作中,可以从媒体驱动机1644启动或播放媒体驱动机1644内包含的应用和/或其他媒体,以向多媒体控制台1600提供附加的功能性。
多媒体控制台1600可以通过简单地将该系统连接到电视或其他显示器而作为单机系统被操作。在这种单机模式下,多媒体控制台1600允许一个或多个用户与系统交互、看电影或听音乐。然而,在集成了通过网络接口1624或无线适配器1648而可用的宽带连接性的情况下,多媒体控制台1600还可以进一步作为更大的网络社区的参与者而被操作。
当多媒体控制台1600被加电时,保留一组硬件资源量以供多媒体控制台操作系统的系统使用。这些资源可以包括存储器(例如,16mb)、cpu和gpu周期(例如,5%)、联网带宽(例如,8kbps)等的保留。由于这些资源是在系统引导时间被保留的,所以这些资源从应用的角度来看并不存在。
具体地,存储器保留优选地大到足以包含启动内核(launchkernel)、并发的系统应用和驱动程序。cpu保留优选地是恒定的,使得如果保留的cpu使用(cpuusage)没有被系统应用使用,则空闲线程将消耗任何未使用的周期。
关于gpu保留,通过使用gpu中断来调度代码以将弹出窗口呈递到覆盖图(overlay)中,来显示由系统应用生成的轻量消息(例如,弹出窗口)。覆盖图所要求的存储器的量依赖于覆盖区域尺寸,并且覆盖图优选地随屏幕分辨率缩放。在当前系统应用使用全用户界面的情况下,优选的是使用某个独立于应用分辨率的分辨率。可以使用缩放器来设置这种分辨率,使得去除对改变频率和引起tv再同步(resynch)的需要。
在多媒体控制台1600引导并且保留了系统资源之后,并发的系统应用执行来提供系统功能性。所述系统功能性被封装在一组在上述保留的系统资源内执行的系统应用中。操作系统内核识别线程,所述线程是系统应用线程与(versus)游戏应用线程。优选地调度系统应用来以预定的时间和间隔在cpu1601上运行,以便向应用提供一致的系统资源视图。所述调度最小化了对于运行在控制台上的游戏应用的高速缓存中断。
当并发的系统应用要求音频时,由于时间敏感性,所以与游戏应用异步地调度音频处理。多媒体控制台应用管理器(以下描述的)在系统应用活跃时控制游戏应用音频级别(例如,静音、减弱)。
输入设备(例如,控制器1642(1)和1642(2))被游戏应用和系统应用共享。输入设备不是保留的资源,而是将在系统应用和游戏应用之间切换,使得每个应用都将得到该设备的关注。应用管理器优选地控制输入流的切换,而不知道游戏应用的知识,并且驱动器维护关于关注切换的状态信息。摄像机226、228和捕获设备120可以经由usb控制器1626或其他接口来限定针对控制台1600的附加输入设备。
图17图示了计算系统1720的另一个示例性实施例,所述计算系统1720可以是图1a-2所示的用来跟踪运动和/或操纵(或以别的方式更新)由应用显示的化身或其它屏幕上对象的计算系统112。计算系统1720仅仅是合适的计算系统的一个示例,并且不打算就当前公开的主题的使用或功能性的范围来建议任何限制。计算系统1720也不应被解释为对于示范性计算系统1720中图示的任一组件或组件组合具有任何依赖性或要求。在一些实施例中,各种所描绘的计算元件可以包括被配置成将本公开内容的特定方面实例化的电路装置。例如,在本公开内容中使用的术语电路装置可以包括被配置成通过固件或开关来实施(一个或多个)功能的专用硬件组件。在其他示例性实施例中,术语电路装置可以包括例如通过软件指令被配置的通用处理单元、存储器等等,其中所述软件指令体现了可操作来实施(一个或多个)功能的逻辑。在电路装置包括硬件和软件的组合的示例性实施例中,实现者可以写入体现了逻辑的源代码,并且源代码可被编译成能够被通用处理单元处理的机器可读代码。由于本领域技术人员能够认识到技术发展水平已演进到在硬件、软件或硬件/软件的组合之间几乎没有差别的点,所以为了实行特定的功能而对硬件相比软件的选择是留给实现者的设计选择权。更具体地,本领域技术人员能够认识到软件过程能够被变换成等同的硬件结构,并且硬件结构自身能够被变换成等同的软件过程。因此,硬件实现相比软件实现的选择是留给实现者的设计选择权之一。
计算系统1720包括计算机1741,所述计算机1741典型地包括各种各样的计算机可读介质。计算机可读介质可以是计算机可读信号介质或计算机可读存储介质。计算机可读存储介质例如可以是但不限于:电子、磁、光学、电磁或半导体系统、装置或设备或前述各项的任何合适组合。计算机可读存储介质的更特定示例(非排他性列表)包括以下项:便携式计算机磁盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦可编程只读存储器(eprom或闪存存储器)、具有中继器的合适光纤、便携式压缩盘只读存储器(cd-rom)、光学存储设备、磁存储设备或前述各项的任何合适组合。在本文献的上下文中,计算机可读存储介质可以是任何有形的介质,其能够包含或存储用于由指令执行系统、装置或设备使用或与指令执行系统、装置或设备相结合地使用的程序。
计算机可读信号介质可以包括例如在载波的基带中或作为载波的一部分传播的数据信号,在所述传播的数据信号中体现了计算机可读程序代码。这样的传播的信号可以采取各种各样形式中的任何形式,包括但不限于电磁、光学或其任何合适的组合。计算机可读信号介质可以是任何计算机可读介质,其并非计算机可读存储介质并且其能够传送、传播或运输用于由指令执行系统、装置或设备使用或与指令执行系统、装置或设备相结合地使用的程序。可以使用任何适当的介质来传输体现在计算机可读信号介质上的程序代码,所述介质包括但不限于无线、有线、光纤线缆、rf等或前述各项的任何合适组合。
计算机可读介质能够是任何可用的介质,其能够被计算机1741访问并且包括易失性和非易失性介质、可拆卸和不可拆卸介质两者。系统存储器1722包括易失性和/或非易失性存储器形式的计算机可读存储介质,比如,只读存储器(rom)1723和随机存取存储器(ram)1760。典型地在rom1723中存储基本输入/输出系统1724(bios),其包含帮助比如在引导期间在计算机1741内的元件之间传递信息的基本例程。ram1760典型地包含可被处理单元1759立即访问和/或当前正由处理单元1759对其操作的数据和/或程序模块。作为示例而非限制,图17图示了操作系统1725、应用程序1726、其他程序模块1727和程序数据1728。
计算机1741还可以包括其他可拆卸/不可拆卸、易失性/非易失性计算机可读存储介质。仅作为示例,图17图示了:硬盘驱动机1738,其从不可拆卸非易失性磁介质读取或向其写入;磁盘驱动机1739,其从可拆卸非易失性磁盘1754读取或向其写入;以及光盘驱动机1740,其从诸如cdrom或其他光学介质那样的可拆卸非易失性光盘1753读取或向其写入。能够在示范性操作环境中被使用的其他可拆卸/不可拆卸、易失性/非易失性计算机存储介质包括但不限于磁带盒、闪存存储卡、数字通用盘、数字视频磁带、固态ram和固态rom等。硬盘驱动机1738典型地通过诸如接口1734这样的不可拆卸存储器接口连接到系统总线1721,并且磁盘驱动机1739和光盘驱动机1740典型地通过诸如接口1735这样的可拆卸存储器接口连接到系统总线1721。
以上论述的并且在图17中图示的驱动机及其关联的计算机存储介质提供了对用于计算机1741的计算机可读指令、数据结构、程序模块和其他数据的存储。在图17中,例如,将硬盘驱动机1738图示为存储操作系统1758、应用程序1757、其他程序模块1756和程序数据1755。注意,这些组件可以与操作系统1725、应用程序1726、其他程序模块1727和程序数据1728相同或不同。这里为操作系统1758、应用程序1757、其他程序模块1756和程序数据1755给出不同的标号以说明在最小限度上它们是不同的拷贝。用户可以通过诸如键盘1751和指示设备1752这样的输入设备向计算机1741中输入命令和信息,所述指示设备1752通常被称作鼠标、轨迹球或触摸板。其他输入设备(未被示出)可以包括麦克风、操纵杆、游戏板、卫星天线或扫描仪等。这些或其他输入设备常常通过耦合到系统总线的用户输入接口1736连接到处理单元1759,但是也可以通过其他接口和总线结构来连接,比如并行端口、游戏端口或通用串行总线(usb)。摄像机226、228和捕获设备120可以限定经由用户输入接口1736连接的用于计算系统1720的附加输入设备。还可以经由诸如视频接口1732这样的接口将监视器1742或其他类型的显示设备连接到系统总线1721。除了监视器以外,计算机还可以包括可通过输出外围接口1733来连接的其他外围输出设备,比如扬声器1744和打印机1743。捕获设备120可以经由输出外围接口1733、网络接口1737或其他接口连接到计算系统1720。
计算机1741可以使用到诸如远程计算机1746这样的一个或多个远程计算机的逻辑连接在联网环境下操作。远程计算机1746可以是个人计算机、服务器、路由器、网络pc、对等设备或其他常见网络节点,并且典型地包括以上相对于计算机1741描述的元件中的许多或全部,尽管图17中仅图示了存储器存储设备1747。所描绘的逻辑连接包括局域网(lan)1745和广域网(wan)1749,但是也可以包括其他网络。这样的联网环境常见于办公室、企业范围计算机网络、内联网和互联网。
当用在lan联网环境中时,计算机1741通过网络接口1737连接到lan1745。当用在wan联网环境中时,计算机1741典型地包括用于在诸如互联网这样的wan1749上建立通信的调制解调器1750或其他装置。可能是内部或外部的调制解调器1750可以经由用户输入接口1736或其他适当的机制连接到系统总线1721。在联网环境中,相对于计算机1741描述的程序模块或其部分可以被存储在远程存储器存储设备中。作为示例而非限制,图17将应用程序1748图示为驻留在存储器设备1747上。将认识到,所示的网络连接是示范性的,可以使用在计算机之间建立通信链路的其他手段。
图18图示了在图2中介绍的运行时间引擎244的示例性实施例。参考图18,运行时间引擎244被示为包括深度图像分割模块1852、基于深度的曲线拟合模块1854、基于深度的身体角度模块1856、基于深度的身体曲率模块1858和基于深度的平均肢体端位置模块1860。在实施例中,深度图像分割模块1852被配置成检测深度图像内的一个或多个用户(例如,人类目标),并将分割值与每个像素相关联。这样的分割值被使用来指示哪些像素与用户相对应。例如,分割值1可以被指派给对应于第一用户的所有像素,分割值2可以被指派给对应于第二用户的所有像素,并且任意的预定值(例如255)可以被指派给不对应于用户的像素。还可能的是,分割值可以被指派给在深度图像中辨别出来的除了用户以外的对象,比如但不限于网球拍、跳绳、球或地面等。在实施例中,作为由深度图像分割模块1852实施的分割过程的结果,深度图像中的每个像素将具有与该像素相关联的四个值,包括:x位置值(即,水平值);y位置值(即,垂直值);z位置值(即,深度值);以及以上刚说明的分割值。换言之,在分割之后,深度图像能够指定多个像素与用户相对应,其中这样的像素也可以被称作用户的基于深度的轮廓或深度图像轮廓。此外,深度图像能够为与用户相对应的每个像素指定像素定位和像素深度。像素定位能够由x位置值(即,水平值)和y位置值(即,垂直值)指示。像素深度能够由z位置值(也被称作深度值)指示,其指示在用来获得深度图像的捕获设备(例如,120)与用户的由像素表示的部分之间的距离。
仍然参考图18,在实施例中,基于深度的曲线拟合模块1854被使用来用曲线拟合与用户相对应的所述多个像素的部分。基于深度的身体角度模块1856被使用来确定指示用户身体的角度的信息,并且基于深度的身体曲率模块1858被使用来确定指示用户身体的曲率的信息。以下参考于图19-22描述了与确定指示用户身体的角度的信息以及确定指示用户身体的曲率的信息有关的附加细节。基于深度的平均肢体端位置模块1860被使用来确定指示用户身体的肢体端的信息,以下参考于图23a-29描述了其附加细节。运行时间引擎244还可以包括本文未描述的附加模块。
依赖于正在跟踪什么用户行为,有时候有用的是能够确定指示用户身体的角度的信息和/或指示用户身体的曲率的信息。例如,这样的信息能够被使用来分析当实施某些锻炼时用户的形态,使得能够控制用户的化身、能够向用户奖励点数和/或能够向用户提供反馈。当在本文中使用时,术语锻炼可以指的是诸如俯卧撑这样的健美体操锻炼以及常常涉及到姿势的锻炼类型,比如瑜伽和普拉提,但不限于此。例如,在某些锻炼中,比如在俯卧撑和各种平板锻炼(例如,传统平板,也称为肘部平板、侧平板、侧平板抬腿和升降平板)中,用户的身体或其一部分(例如用户的背部)应该笔直。在其他锻炼中,比如在下犬式瑜伽锻炼、上犬式瑜伽锻炼中,用户的身体或其一部分应该以特定的方式弯曲。骨骼跟踪(st)技术典型地对于跟踪实施这样类型的锻炼的用户来说是不可靠的,特别是在锻炼涉及用户在地面上或地面附近躺或坐的情况下。以下描述的某些实施例依靠深度图像来确定指示用户身体的角度的信息和/或指示用户身体的曲率的信息。这样的实施例可以被用来取代或补充常常用来基于rgb图像检测用户行为的骨骼跟踪(st)技术。
现在将使用图19的高级流程图来概述用于基于深度图像而确定指示用户身体的角度的信息和/或指示用户身体的曲率的信息的方法。在步骤1902,接收深度图像,其中深度图像指定了多个像素与用户相对应。可以使用位于距用户(例如,118)一段距离处的捕获设备(例如,120)来获得深度图像。更一般地,深度图像和彩色图像可以由本文描述的捕获设备120中的传感器中的任何传感器或其它在本领域已知的任何合适的传感器来捕获。在一个实施例中,深度图像与彩色图像分开地被捕获。在一些实现中,深度图像和彩色图像同时被捕获,而在其他实现中,深度图像和彩色图像被顺序地或在不同时间被捕获。在其他实施例中,深度图像与彩色图像一起被捕获或与彩色图像结合为一个图像文件,使得每个像素具有r值、g值、b值和z值(距离)。这样的深度图像和彩色图像可以被传输至计算系统112。在一个实施例中,以每秒30帧来传输深度图像和彩色图像。在一些示例中,深度图像与彩色图像分开地被传输。在其他实施例中,深度图像和彩色图像可以一起被传输。由于本文描述的实施例主要(或仅仅)依靠深度图像的使用,所以其余的论述主要集中于对深度图像的使用,并且因此不论述彩色图像。
在步骤1902接收到的深度图像还可以为与用户相对应的每个像素指定像素定位和像素深度。如以上在对图18的论述中提到的,像素定位可以由x位置值(即,水平值)和y位置值(即,垂直值)指示。像素深度可以由z位置值(也被称作深度值)指示,其指示在用来获得深度图像的捕获设备(例如,120)与用户的由该像素表示的部分之间的距离。出于本描述的目的,假定在步骤1902接收到的深度图像已经历了分割过程,所述分割过程确定了哪些像素对应于用户以及哪些像素不对应于用户。可替换地,如果在步骤1902接收到的深度图像尚未经过分割过程,则分割过程可以出现在步骤1902和1904之间。
在步骤1904,辨别感兴趣的像素的子集,其中,在下面论述的步骤1906中将用曲线拟合所辨别的子集。如上所述,深度图像的与用户相对应的多个像素还可以被称作用户的深度图像轮廓或简单地称作深度图像轮廓。因此,在步骤1904,辨别深度图像轮廓的感兴趣部分,其中在步骤1906将用曲线拟合所辨别的部分。在一个实施例中,感兴趣的像素(即,深度图像轮廓的感兴趣部分)是与用户的躯干相对应的像素。在另一实施例中,感兴趣的像素是与用户的腿、躯干和头相对应的像素。在另外的实施例中,感兴趣的像素是与对应于用户的多个像素的相对于平面(例如,支撑用户的地面)的上部外围部分(upperperipheralportion)相对应的像素。在又一实施例中,感兴趣的像素是与对应于用户的多个像素的相对于平面(例如,支撑用户的地面)的下部外围部分(lowerperipheralportion)对应的像素。
在步骤1906,用曲线拟合在步骤1904辨别的像素子集,以由此制成拟合曲线。在某些实施例中,在步骤1906制成的拟合曲线包括多个直线分段。在一个实施例中,拟合曲线包括正好三个直线分段(以及因此包括两个端点和两个中点),可以例如使用三次多项式方程来确定所述三个直线分段。图20a-20c中示出了包括刚好三个直线分段的拟合曲线的示例,下面将参考图20a-20c来论述该示例。还可能的是,拟合曲线具有少到两个直线分段。可替换地,拟合曲线能够具有四个或更多个直线分段。在又一实施例中,拟合曲线能够是平滑曲线,即,不是由直线分段构成的曲线。可以使用无数公知的曲线拟合技术来实施步骤1906,并且因此不需要描述如何用曲线拟合一组像素的附加细节。在步骤1908,辨别拟合曲线的端点。
对于其余描述中的许多,将假定在步骤1904中辨别的感兴趣的像素(即,深度图像轮廓的感兴趣部分)是对应于用户的多个像素中与相对于平面(例如,支撑用户的地面)的上部外围部分相对应的像素。这种实施例的益处是,基于所辨别的像素的确定不受用户的松散地下垂着的衣服的影响。还将假设在步骤1906制成的拟合曲线包括刚好三个直线分段。其优点将从以下对步骤1914的论述中被认识到。
在继续描述图19中的流程图之前,将简要地对图20a-20c进行参考。参考于图20a,其中示出的暗轮廓表示与实施四肢支撑式瑜伽姿势(其也称为chaturangadandasana姿势)的用户相对应的(深度图像的)多个像素。图20a中还示出了对对应于用户的所述多个像素中与相对于平面2012(例如,支撑用户的地面)的上部外围部分相对应的像素进行拟合的曲线2002。以另一种方式来说明,曲线2002拟合于用户的深度图像轮廓的顶部。拟合曲线2002包括三个直线分段2004a、2004b和2004c,它们可以被统称为直线分段2004。拟合曲线的端点被标记为2006a和2006b,并且可统称为端点2006。拟合曲线的中点被标记为2008a和2008b,并且可统称为中点2008。在两个端点之间延伸的直线被标记为2010。
类似于图20a的图20b对应于在用户自己重新摆出另一瑜伽姿势之后的时间点。更具体地,在图20b中,其中示出的暗轮廓表示与实施上犬式瑜伽姿势的用户相对应的(深度图像的)多个像素,上犬式瑜伽姿势也被称为urdhvamukhasvanasana姿势。为了一致,在图20b中按照与图20a中相同的方式来标记拟合曲线2002、直线分段2004、端点2006、中点2008以及在端点2006之间的直线2010。
在图20c中,其中示出的暗轮廓表示与实施平板位置瑜伽姿势或实施俯卧撑锻炼的用户相对应的(深度图像的)多个像素。再次地,在图20c中按照与图20a和20b中相同的方式来标记拟合曲线2002、直线分段2004、端点2006、中点2008以及在端点2006之间的直线2010。
再次参考图19的流程图,在步骤1910-714,确定指示用户身体的角度的信息以及指示用户身体的曲率的信息。将这样的信息报告给应用,如在步骤1916指示的,这使得能基于所报告的信息来更新应用。以下提供了步骤1910-1914的附加细节。当论述这些步骤时,频繁对图20a-20c进行参考,以提供所论述的步骤的示例。
在步骤1910,存在对在拟合曲线的端点之间的直线相对于平面(例如,支撑用户的地面)的角度的确定。在图20a中,角度2020是这样的角度的示例。更具体地,角度2020是在拟合曲线2002的端点2006之间的直线2010相对于平面2012的角度。图20b和20c示出了角度2020的另外的示例。应用可以使用角度2020——其指示了用户身体相对于平面(例如,地面)的总角度——来确定用户的可能位置或姿势,以基于用户的位置或姿势来更新正在显示的化身,和/或向用户提供关于该用户是否处于恰当位置或姿势的反馈,但不限于此。对于更特定的示例,这样的信息在以下情况下能够向应用提供有用的信息:指令用户保持一个姿势,在该姿势中用户的背和腿应该尽可能笔直或者应该具有特定的曲率。
图20a中的角度2020类似于图20b中的角度2020,尽管由像素表示的用户处于非常不同的姿势。出现这种情况是因为,尽管用户身体的主干的位置和曲率显著改变,但是用户的头和脚处于相对类似的位置。这提供了对以下情况的某种了解,即:为什么如在以下论述的步骤1912和1914中所进行的那样去获得指示用户身体的曲率的信息也是有用的。
在步骤1912,存在对在拟合曲线的端点之间的直线相对于拟合曲线的直线分段之一的角度的确定。在图20a中,角度2030是这样的角度的示例。更具体地,角度2030是在拟合曲线2002的端点2006之间的直线2010相对于(拟合曲线2002的)直线分段2004a的角度。图20b和20c示出了角度2030的另外的示例。图20a的角度2030是正角。相比之下,图20b中的角度2030是负角。因此能够理解应用能够如何使用角度2030来区分用户的不同姿势。更一般地,从以上论述能够理解角度2030如何指示用户身体的曲率。在以上示例中,角度2030是(在拟合曲线2002的端点2006之间的)直线2010和(拟合曲线2002的)直线分段2004a之间的角度。可替换地或附加地,能够确定(在拟合曲线2002的端点2006之间的)直线2010和(拟合曲线2002的)另一直线分段2004,比如直线分段2004c,之间的角度。
在步骤1914,存在对于与拟合曲线相对应的曲率比值的确定。根据实施例,曲率比值是在拟合曲线的端点之间延伸的第一直线的长度与从第一直线向拟合曲线的离第一直线最远(即,偏离最远)的点正交地延伸的第二线的长度的比值。例如,参考图20a,曲率比值是在拟合曲线2002的端点2006之间延伸的第一直线2010的长度与从第一直线2010向拟合曲线2002的离第一直线2010最远的点正交地延伸的第二线2040的长度的比值。实现其中拟合曲线(例如,2002)包括正好三个直线分段的实施例的益处是,非常容易并且快速地确定第二线的长度,如将参考图21以附加的细节描述的。
现在将使用图21的高级流程图来描述用于确定曲率比值的方法,其中拟合曲线的直线分段包括完全直的线分段。参考图21,在步骤2102,存在对从(在拟合曲线的端点之间延伸的)直线向拟合曲线的第一中点正交地延伸的线的长度的确定。在步骤2104,存在对从(在拟合曲线的端点之间延伸的)直线向拟合曲线的第二中点正交地延伸的线的长度的确定。暂时返回来参考图20a,可以通过确定从直线2019向拟合曲线2002的中点2008a正交地延伸的线2041的长度来实施步骤2102。类似地,可以通过确定从直线2019向拟合曲线2002的另一中点2008b正交地延伸的线2040的长度来实施步骤2104。返回图21的流程图,在步骤2106,存在对于在步骤2102和2104中确定的长度哪个更长的确定。如在步骤2108指示的,当在步骤1914确定与拟合曲线相对应的曲率比值时,选择长度中较长的那个用作从(在拟合曲线的端点之间延伸的)直线向拟合曲线的离(在拟合曲线的端点之间延伸的)该直线最远(即偏离最远)的点正交地延伸的线的长度。例如,返回来参考图20a,使用参考于图21描述的方法的结果,于是可以通过确定直线2040的长度与在拟合曲线2002的端点2006a和2006b之间延伸的直线2010的长度的比值来确定曲率比值。
返回来参考图18,运行时间引擎244可以将它的确定报告给应用246。以上参考于图19中的步骤1916也论述了这样的报告。更具体地,如图19所示,可以将指示在步骤1910确定的角度、在步骤1912确定的角度和/或在步骤1914确定的曲率比值的信息报告给应用。
现在参考图22,在步骤2202,应用接收指示在步骤1910确定的角度、在步骤1912确定的角度和/或在步骤1914确定的曲率比值的信息。如在步骤2204所示的,基于这样的信息来更新应用。例如,如以上提到的,这样的信息能够被使用来跟踪实施某些锻炼和/或姿势的用户,使得能够控制用户的化身、能够向用户奖励点数和/或能够向用户提供反馈。对于更特定的示例,在应用246是指令用户实施某些锻炼和/或姿势的游戏的情况下,应用246能够确定用户是否以正确的形态实施了锻炼或姿势,并且在用户没有以正确的形态实施锻炼或姿势的情况下能够向用户提供关于用户可以如何改善他们的形态的反馈。
当在深度图像中表示了多于一个用户的情况下,可以针对每个用户实施图19的方法的单独实例。例如,假定深度图像中的第一像素组对应于第一用户,并且相同深度图像中的第二像素组对应于第二用户。这会导致指示与第一用户相对应的角度和/或曲率的第一信息以及指示与第二用户相对应的角度和/或曲率的第二信息。
可以针对附加的深度图像重复以上参考于图19描述的方法,从而导致指示针对多个深度图像中的每一个而确定的用户身体的角度和/或曲率的信息。这使得能跟踪用户身体的角度和/或曲率的改变。当在深度图像中表示了多于一个用户的情况下,每当重复该方法时,可以针对深度图像中表示的每个用户确定指示用户身体的角度和/或曲率的单独信息。
完全基于深度图像来确定指示用户身体的角度和/或曲率的信息的优点是,即使在st技术失败时,也能够确定指示用户身体的角度和/或曲率的信息。另一优点是,一旦深度图像在处理管道中可用,就能够确定指示用户身体的角度和/或曲率的信息,从而减小等待时间,因为不需要执行st技术。尽管如此,如果期望的话,也可以使用st技术来确定指示用户身体的角度和/或曲率的信息。
依赖于正在跟踪什么用户行为,有时候有用的是能够确定指示用户身体的肢体端的信息。st技术对于检测用户身体肢体端来说常常是不可靠的,特别是在用户在地面上或地面附近躺或坐的情况下(例如,当用户坐着,其脚向前朝着捕获设备伸展时)。以下描述的某些实施例依靠深度图像来确定指示用户身体的肢体端的信息。这样的实施例能够被用来取代或补充常常用于基于rgb图像检测用户行为的骨骼跟踪(st)技术。
参考图23a,其中示出的暗轮廓表示与用户相对应的(深度图像的)多个像素,所述用户处于在标准平板位置的变形中但是一只手臂和一条腿按相反的方向伸展。图23a中还示出了点2302、2312、2322和2332,其分别对应于与用户相对应的(深度图像的)最左、最右、最上和最下像素。尽管基于点2302、2312、2322和/或2332在多个深度图像帧上跟踪用户的一个或多个肢体端是可能的,然而这样的点被显示成从帧到帧显著地改变,导致这些点成为相对有噪的数据点。例如,这样的噪声可以是由于用户的手、脚、头和/或其它部位的轻微活动而造成的。以下描述的某些实施例可以被使用来通过跟踪肢体端圆块的平均位置来克服这种噪声问题,其中本文使用术语圆块来指代深度图像的像素组,所述像素组与用户相对应并且处在被辨别为与用户的肢体端相对应的像素的指定距离内。
现在将使用图24的高级流程图来描述用于确定肢体端圆块的平均位置的方法。参考图24,在步骤2402,接收深度图像,其中深度图像指定了多个像素与用户相对应。由于步骤2402与以上参考图19描述的步骤1902基本相同,所以从以上对步骤1902的论述能够理解步骤1902的附加细节。在步骤2404,辨别深度图像中与用户的肢体端相对应的像素。依赖于正在考虑哪个肢体端,步骤2404可以牵涉到辨别深度图像中与用户的最左、最右、最上或最下像素相对应的像素。以上参考于图23a描述了这样的像素的示例。如以下将更详细描述的,步骤2404可以可替换地牵涉到辨别与对应于用户的深度图像中最前面像素相对应的深度图像中像素。在步骤2406,存在对于与用户相对应并且处于在步骤2404中被辨别为与用户的肢体端相对应的像素的指定距离内(例如,在指定方向上5个像素内)的深度图像中像素的辨别。在步骤2408,通过确定在步骤2406被辨别为与用户相对应并且处在与用户的肢体端相对应的像素的指定距离内的像素的平均位置来确定平均肢体端位置,其也可被称作肢体端圆块的平均位置。在步骤2410,存在对于是否存在要确定其平均肢体端位置(即,肢体端圆块的平均位置)的任何感兴趣的附加肢体端的确定。感兴趣的特定肢体端可以依赖于将要使用(一个或多个)平均肢体端位置的应用。例如,其中仅对左面肢体端和右面肢体端感兴趣,可以针对感兴趣的这两个肢体端中的每一个实施步骤2404-2408。如在步骤2412指示的,将一个或多个平均肢体端位置(例如,左面肢体端圆块和右面肢体端圆块的平均位置)报告给应用,从而使得能基于这样的位置信息来更新应用。
根据实施例,现在将使用图25连同图23a-23f来提供图24的步骤2404-2408的附加细节。对于这个论述,将假定感兴趣的初始肢体端是左面肢体端。参考图25,根据实施例,步骤2502-2508提供了关于如何在步骤2404辨别与用户的最左点相对应的(深度图像的)像素的附加细节。在步骤2502,初始化各种值,这牵涉到设置x=1,设置xsum=0以及设置ysum=0。在步骤2504,通过检查深度图像中具有x值=x的所有像素以确定是否这些像素中的至少一个对应于用户,来搜索用户的最左面肢体端点。这样的确定可以基于与像素相对应的分割值。暂时参考图23b,这可以牵涉到检查深度图像中沿着虚线2340的所有像素以确定是否这些像素中的至少一个对应于用户。返回图25,在步骤2506,存在对于是否在步骤2504检查的像素中的至少一个对应于用户的确定。如果步骤2506的答案为否,则在步骤2508将x递增,并且因此x现在等于2。然后重复步骤2504和2506以确定是否深度图像中具有x值=2的任何像素对应于用户。换言之,返回来参考图23b,虚线2340将右移一个像素,并且检查深度图像中沿着移动过的线2340的所有像素以确定是否这些像素中的至少一个对应于用户。重复步骤2504-2508,直到辨别出与用户相对应的像素,其中所辨别出的像素将对应于用户的最左面肢体端,其是图23a所示的点2302a。参考图23c,其中的虚线2340示出了在该处辨别出用户的最左面肢体端的点。
图25中的步骤2510提供了用于在步骤2406辨别深度图像的像素的实施例的附加细节,所述深度图像的像素与用户相对应并且处在被辨别为与用户的最左面肢体端相对应的像素的指定距离内(例如,在x方向上5个像素内)。此外,将使用图25中的步骤2512-2520来提供与在步骤2408辨别平均左面肢体端位置的实施例有关的附加细节。在步骤2510,指定圆块边界,这牵涉到设置第一圆块边界(bb1)=x,以及设置第二圆块边界(bb2)=x+v,其中v是指定的整数。对于以下示例将假定v=5,然而v能够可替换地小于或大于5。与用户相对应并且处在bb1和bb2(不含bb1和bb2)之间的深度图像中像素是与用户相对应并且处在被辨别为与用户的肢体端相对应的像素的指定距离内的深度图像中像素的示例。在图23d中,标记为bb1和bb2的两条虚垂直线是第一圆块边界和第二圆块边界的示例。在图23e中被虚线2306包围的像素是被辨别为与用户相对应并且处在与用户的最左面肢体端相对应的像素2302的指定距离内(例如在x方向上5个像素内)的深度图像中像素。这样的被虚线2306包围的像素也可以被称作左面肢体端圆块,或更一般地被称作侧面圆块。
在步骤2512,更新xsum,使得xsum=xsum+x。在步骤2514,通过将深度图像中与用户相对应并且具有x值=x的像素的所有y值添加到ysum,来更新ysum。在步骤2516,存在对于x是否大于第二圆块边界bb2的确定。只要步骤2516的答案为否,就每当更新xsum和ysum的值时重复步骤2512和2514。在步骤2518,将平均x圆块值(axbv)确定为等于xsum除以被求和的x值的总数目。在步骤2520,将平均y圆块值(aybv)确定为等于ysum除以被求和的y值的总数目。在该实施例中,axbv和aybv共同地提供了左面肢体端的平均x,y位置,其也可以被称作左面肢体端圆块的平均位置。图23f中标记为2308的“x”是侧面圆块的被辨别的平均位置的示例。
可以实施与以上参考图25描述的步骤类似的步骤来确定右面肢体端圆块的平均位置。然而,对于这种确定,x将在步骤2502被设置成其最大值,x将在步骤2508被递减1,在步骤2510指定的第二圆块边界(bb2)将等于x-v,并且在步骤2516将存在对于是否x<bb2的确定。
可以实施与以上参考图25描述的步骤类似的步骤来确定顶部或上部肢体端圆块的平均位置。然而,对于这种确定:y将在步骤2502被设置成0;y将在步骤2508被递增;在步骤2510,bb1将被指定为等于y并且bb2将被指定为等于y+v;在步骤2512,将通过把深度图像中与用户相对应并且具有y值=y的像素的所有x值添加到xsum,来更新xsum;并且在步骤2514将通过把y添加到ysum来更新ysum。
可以实施与以上参考图25描述的步骤类似的步骤来确定底部肢体端圆块的平均位置。然而,对于这种确定:y将在步骤2502被设置成其最大值;y将在步骤2508被递减1;在步骤2510,bb1将被指定为等于y并且bb2将被指定为等于y-v;在步骤2512,将通过把深度图像中与用户相对应并且具有y值=y的像素的所有x值添加到xsum,来更新xsum;并且在步骤2514将通过把y添加到ysum来更新ysum。术语左和右是相对的术语,其依赖于位置是从图像内所表示的用户的角度来看的,还是从被用于捕获深度图像的捕获设备的角度来看的。因此,术语侧能够更一般地用于指代左面或右面肢体端或圆块。
参考图26,其中示出的暗轮廓表示与用户相对应的(深度图像的)多个像素,所述用户处于站立位置,一只脚位于另一只脚前面。图26中示出的四个“x”指示能够使用本文描述的实施例来辨别的圆块的各种平均位置。更具体地,标记为2508的“x”对应于第一侧面圆块的平均位置,其还可以被称作平均侧面肢体端位置。标记为2518的“x”对应于第二侧面圆块的平均位置,其还可以被称作平均侧面肢体端位置。标记为2528的“x”对应于顶部圆块的平均位置,其还可以被称作平均顶部或上部肢体端位置。标记为2538的“x”对应于底部圆块的平均位置,其还可以被称作平均底部或下部肢体端位置。
根据某些实施例,与用户相对应的(深度图像的)像素能够被分成象限,并且能够按照与以上论述的类似的方式,针对每个象限来确定一个或多个肢体端圆块的平均位置。从图27能够认识到这样的实施例,其中水平和垂直白线将与用户相对应的像素分成象限,并且“x”对应于各种肢体端圆块的平均位置。
如在图28中能够看出的,本文描述的实施例还能够被使用来确定前面圆块的平均位置,其在图28中由“x”指示。在该图28中,前面圆块对应于弯腰的用户的一部分,其中所述用户的头部是用户身体中最靠近捕获设备的部分。当辨别前面圆块的平均位置时,在例如实施参考图25描述的步骤时,使用深度图像的像素的z值来代替x值或y值。换言之,相比于在由x轴和y轴限定的平面之中来搜索,变成在由z轴和x轴或者由z轴和y轴限定的平面之中来搜索z肢体端。
被用来获得深度图像的摄像机(例如,226)可能相对于用户站立的或以别的方式支撑用户的地面倾斜。根据特定的实施例,在确定肢体端圆块的平均位置之前解决(也被称作校正)摄像机倾斜。这样的对摄像机倾斜的校正在确定前面圆块的平均位置时是最有益的,因为这样的位置依赖于深度图像的像素的z值。为了解决这样的摄像机倾斜,可以从传感器(例如,加速度计)或以某种其他方式获得重力矢量,并将重力矢量的因素包括进来。例如,可以在使用与用户相对应的像素来辨别前面圆块的平均位置之前,对这样的像素实施这样的对摄像机倾斜的解决(也被称作倾斜校正)。在某些实施例中,通过选择搜索轴(还可以被称作归一化搜索方向)并将所有像素投影到搜索轴来实施倾斜校正。这可以经由以归一化搜索方向用点标记(dot)每个像素的位置来完成。通过寻找具有最大z值的像素,这产生了沿着搜索方向的距离,其能够用于搜索与最前面肢体端相对应的像素。可以使用最大z值和最大z值-v来辨别圆块边界bb1和bb2以及因此辨别其中的某个区域,以便对像素值求和来确定平均。
当在深度图像中表示了多于一个用户的情况下,可以针对每个用户实施图24的方法的单独实例。例如,假定深度图像中的第一像素组对应于第一用户,并且相同深度图像中的第二像素组对应于第二用户。这将导致针对每个用户辨别肢体端圆块的平均位置。
可以针对附加的深度图像重复以上参考图24描述的方法,从而导致指示针对多个深度图像中的每一个而确定肢体端圆块的平均位置。这使得能跟踪平均肢体端位置的改变。当在深度图像中表示了多于一个用户的情况下,每当重复该方法时,可以针对每个用户辨别肢体端圆块的平均位置。
返回来参考图18,运行时间引擎244可以将它的确定报告给应用246。以上参考图24中的步骤2412也论述了这样的报告。更具体地,如图24所示,可以将指示所辨别的(一个或多个)平均肢体端位置的信息报告给应用。
现在参考图29,在步骤2902,应用接收指示所辨别的(一个或多个)平均肢体端位置的信息。如在步骤2904所示的,基于这样的信息来更新应用。例如,如以上提到的,这样的信息能够被使用来跟踪实施某些锻炼和/或姿势的用户,使得能够控制用户的化身、能够向用户奖励点数和/或能够向用户提供反馈。对于更特定的示例,在应用246是指令用户实施某些锻炼和/或姿势的游戏的情况下,应用246能够确定用户是否以正确的形态实施了锻炼或姿势,并且在用户没有以正确的形态实施锻炼或姿势的情况下能够向用户提供关于用户可以如何改善他们的形态的反馈。
完全基于深度图像来辨别肢体端圆块的平均位置的优点是,即使在st技术失败时,也能够确定指示用户身体的肢体端的信息。另一优点是,一旦深度图像在处理管道中可用,就能够确定指示用户身体的肢体端的信息,从而减小等待时间,因为不需要执行st技术。尽管如此,如果期望的话,也可以使用st技术来确定指示用户身体的肢体端的信息。
图30图示了在图2中介绍的运行时间引擎244的示例性实施例。参考图30,运行时间引擎244被示为包括深度图像分割模块3052、分辨率减小模块3054、孔检测模块3056、孔填充模块3058和地面去除模块3060。在实施例中,深度图像分割模块252被配置成检测深度图像内的一个或多个用户(例如人类目标),并将分割值与每个像素相关联。这样的分割值被用来指示哪些像素与用户相对应。例如,分割值1可以被指派给对应于第一用户的所有像素,分割值2可以被指派给对应于第二用户的所有像素,并且任意的预定值(例如255)可以被指派给不对应于用户的像素。还可能的是,分割值可以被指派给在深度图像中辨别出的除了用户以外的对象,比如但不限于网球拍、跳绳、球或地面等。在实施例中,作为由深度图像分割模块252实施的分割过程的结果,深度图像中的每个像素将具有与该像素相关联的四个值,包括:x位置值(即,水平值);y位置值(即,垂直值);z位置值(即,深度值);以及以上刚说明的分割值。换言之,在分割之后,深度图像可以指定多个像素与用户相对应,其中这样的像素也可以被称作指定为与用户相对应的像素子集,或者被称作用户的深度图像轮廓。此外,深度图像可以为与用户相对应的像素子集中的每个像素指定像素定位和像素深度。像素定位可以由x位置值(即,水平值)和y位置值(即,垂直值)指示。像素深度可以由z位置值(也被称作深度值)指示,其指示在用来获得深度图像的捕获设备(例如,120)与用户的由该像素表示的部分之间的距离。
深度图像处理
图30图示了在图2中介绍的运行时间引擎244的示例性实施例。参考图30,运行时间引擎244被示为包括深度图像分割模块3052、分辨率减小模块3054、孔检测模块3056、孔填充模块3058和地面去除模块3060。在实施例中,深度图像分割模块3052被配置成检测深度图像内的一个或多个用户(例如人类目标),并将分割值与每个像素相关联。这样的分割值被用来指示哪些像素与用户相对应。例如,分割值1可以被指派给对应于第一用户的所有像素,分割值2可以被指派给对应于第二用户的所有像素,并且任意的预定值(例如255)可以被指派给不对应于用户的像素。还可能的是,分割值可以被指派给在深度图像中辨别出的除了用户以外的对象,比如但不限于网球拍、跳绳、球或地面等。在实施例中,由于深度图像分割模块3052实施的分割过程,深度图像中的每个像素将具有与该像素相关联的四个值,包括:x位置值(即,水平值);y位置值(即,垂直值);z位置值(即,深度值);以及以上刚说明的分割值。换言之,在分割之后,深度图像可以指定多个像素与用户相对应,其中这样的像素也可以被称作指定为与用户相对应的像素子集,或者被称作用户的深度图像轮廓。此外,深度图像可以为与用户相对应的像素子集中的每个像素指定像素定位和像素深度。像素定位可以由x位置值(即,水平值)和y位置值(即,垂直值)指示。像素深度可以由z位置值(也被称作深度值)指示,其指示在用来获得深度图像的捕获设备(例如,120)与用户的由该像素表示的部分之间的距离。
仍然参考图30,在实施例中,分辨率减小模块3054被用来产生深度图像中包括的用户的较低分辨率表示,其遵从用户的形状且不平滑用户的相异的(distinct)身体部分,然而其不是用户的镜像图像。孔检测模块3056被用来检测深度图像的像素中由于在使用捕获设备(例如,120)获得深度图像时用户的一部分遮蔽了用户的另一部分而造成的孔。孔填充模块3058被用于对检测到的孔进行孔填充。地面去除模块3060被用来从指定为与用户相对应的像素子集中去除很可能与支撑用户的地面相对应的那些像素。以下参考于图31和32描述了与产生深度图像中包括的用户的较低分辨率表示有关的附加细节。以下参考于图31以及图33-36b描述了与辨别和填充与用户相对应的深度图像的像素子集中的孔有关的附加细节。以下参考图37描述了与地面去除技术有关的附加细节。运行时间引擎244还可以包括本文没有具体描述的附加模块。
现在将使用图31的高级流程图来概述根据某些实施例的用于在深度图像内辨别孔和填充孔的方法。在特定实施例中,这样的方法用于辨别和填充仅在与用户相对应的(深度图像内的)像素子集内的孔。通过将孔的辨别局限于与用户相对应的像素子集,对所辨别的孔的填充不太可能会漏出深度图像中表示的用户的轮廓,所述漏出会是不期望的。
参考图31,在步骤3102,获得深度图像以及指定了深度图像内的像素子集与用户相对应的信息。如以上提到的,这样的信息(其指定了深度图像内的像素子集与用户相对应的)——也可以被称作分割信息——可以包括在深度图像中,或者可以从与深度图像分离的分割图像或缓冲器获得。在步骤3102获得的深度图像可以是使用位于离用户一定距离处的捕获设备(例如,120)获得的原始深度图像。可替换地,在步骤3102获得的深度图像可能已经进行了某种预处理。例如,在某些实施例中,将(使用捕获设备获得的)原始深度图像的分辨率减小到较低分辨率深度图像,并且较低分辨率深度图像(可以简单地被称作低分辨率深度图像)就是在步骤3102获得的深度图像。以下参考图32描述了根据某些实施例的如何生成这样的低分辨率深度图像的附加细节。
在步骤3102获得的深度图像和信息能够为与用户相对应的像素子集中的每个像素指定像素定位和像素深度。如以上在图30的论述中提到的,像素定位可以由x位置值(即,水平值)和y位置值(即,垂直值)指示。像素深度可以由z位置值(也被称作深度值)指示,其指示在用于获得深度图像的捕获设备(例如,120)与用户的由该像素表示的部分之间的距离。出于本描述的目的,假定在步骤3102接收到的深度图像已经历了分割过程,所述分割过程确定了哪些像素对应于用户以及哪些像素不对应于用户。可替换地,如果在步骤3102接收到的深度图像尚未经过分割过程,则分割过程可以出现在步骤3102和3104之间。
步骤3104-3110(以下以另外的细节论述它们)被使用来辨别(在与用户相对应的深度图像内的像素子集内的)孔,使得这样的孔能够在步骤3112被填充。如以下将描述的,使用某些步骤来辨别潜在地是孔的一部分的像素,而另一步骤将(被辨别为潜在地是孔的一部分的)像素组分类为孔或非孔。被辨别为潜在地是孔的一部分但实际上不是孔的一部分的像素可以被称作误报。没有被辨别为潜在地是孔的一部分然而实际上是孔的一部分的像素可以被称作漏报(falsenegative)。如从以下论述中将认识到的,本文描述的实施例能够被使用来减少误报和漏报。
在步骤3104,在被指定为与用户相对应的像素子集内,辨别潜在地是孔的一部分的一个或多个像素区间(span)。这样的孔常常是由于在使用捕获设备(例如,120)来获得深度图像时用户的一部分遮蔽用户的另一部分而造成的。每个被辨别出的区间可以是水平区间或垂直区间。根据实施例,每个水平区间具有一个像素的垂直高度以及至少预定数目个像素(例如5个像素)的水平宽度。根据实施例,每个垂直区间具有至少预定数目个像素(例如,5个像素)的垂直高度以及一个像素的水平宽度。如从以下论述将认识到的,对这样的区间的辨别对于辨别被指定为与用户相对应的像素子集内潜在孔的边界来说是有用的。以下参考图33描述了根据实施例的步骤3104的附加细节。
在步骤3104和3106之间,可能被错误标记为潜在地是孔的一部分的区间可以被辨别并且重新分类为非潜在地是孔的一部分。例如,在实施例中,超过预定宽度或预定长度的任何区间都可以被重新分类为不再被辨别为潜在地是孔的一部分。例如,可以启发性地确定:在深度图像中表示的用户将很可能由高度上的某一数目的像素以及宽度上的某一数目的像素来表示。如果所辨别的区间具有比用户的预期高度大的高度,则可以将该区间重新分类为不再被辨别为潜在地是孔的一部分。类似地,如果所辨别的区间具有比用户的预期宽度大的宽度,则可以将该区间重新分类为不再被辨别为潜在地是孔的一部分。附加地或可替换地,在关于哪些像素很可能对应用户身体的哪些部分的信息可用的情况下,在已启发性地发现被频繁错误标记为孔的身体部分内或附近的区间可以被重新分类为不再被辨别为潜在地是孔的一部分。关于哪些像素很可能对应于哪些身体部分的信息可以从结构数据(例如,242)获得,但不限于此。对于更特定的示例,已发现与朝着捕获设备取向的下肢相对应的像素常常被错误标记为孔。在某些实施例中,如果确定所辨别的区间是用户的下肢的一部分,则该区间可以被重新分类为不再被辨别为潜在地是孔的一部分。
在步骤3106,分析区间相邻像素以确定是否一个或多个区间相邻像素也被辨别为潜在地是被指定为与用户相对应的像素子集中的孔的一部分。当在本文中使用时,术语区间相邻像素指的是与步骤3104所辨别的水平或垂直区间中的至少一个区间相邻的像素。该步骤被使用来辨别潜在地是孔的一部分但是没有在步骤3104被辨别出来的像素。因此,该步骤被使用来减少潜在的漏报。换言之,该步骤被使用来辨别应当被辨别为潜在地是孔的一部分但是没有被包含于在步骤3104所辨别的区间之一中的像素。以下参考图34来描述根据实施例的步骤3106的附加细节。
在步骤3108,将彼此相邻并且已被辨别为潜在地是(在被指定为与用户相对应的像素子集中的)孔的一部分的像素分组在一起,成为潜在地与(在被指定为与用户相对应的像素子集中的)一个或多个孔相对应的像素岛。可以例如使用地面填充算法(也称为种子填充)来实施步骤3108,但不限于此。在某些实施例中,向被认为是公共岛的一部分的每个像素指派公共岛值。例如,可以向被认为是第一岛的一部分的所有像素指派岛值1,并且可以向被认为是第二岛的一部分的所有像素指派岛值2,以此类推。
在步骤3110,将(在被指定为与用户相对应的像素的子集中的)所辨别的像素岛中的每一个像素岛分类为是孔或不是孔。因此,该步骤被使用来去除在先前实施的步骤之后可能遗留的任何误报。以下参考图35来描述根据实施例的步骤3110的附加细节。
在步骤3112,在被分类为是孔的每个像素岛上分开地实施孔填充(也称为图像完成或图像修补(inpaint))。可以实施各种不同类型的孔填充。在某些实施例中,使用分散的数据内插来实施孔填充。这可以包括例如针对被分类为孔的每个个别像素岛,同时地对岛的每个像素进行拉普拉斯(laplacian)求解,并将被辨别为边界点的像素看作是对于该解的边界问题。更具体地,可以基于被分类为孔的岛的像素来构造稀疏方程组,从而将非边界点的拉普拉斯设置为0,并将边界点设置为它们自身。通过使用带有逐次超松弛(例如,1.75)的高斯-赛德尔解算器,可以在多次迭代之后实现可靠的孔填充。可替换地,可以使用雅克比(jacobi)解算器代替高斯-赛德尔解算器来使方程求解并行化。在另一实施例中,可以使用径向基函数(rbf)来实施孔填充。其他类型的分散的数据内插技术可以可替换地用于孔填充。另外,除了基于分散的数据内插的技术之外,还可以使用可替换类型的孔填充技术。
在步骤3114,(例如,在存储器312或422中)存储指示孔填充结果的信息。例如,可以将这样的信息存储为与步骤3112获得的深度图像分离但是与之一起使用的深度值的阵列。可替换地,可以修改深度图像,使得将被辨别为是孔的一部分的每个像素的深度值被替换成由孔填充产生的对应深度值。无论以哪种方式,孔填充过程的结果都可用于在显示用户的表示时使用,如在步骤3116指示的。在显示这样的用户的表示之前,可以使用已知的变换技术将深度图像中的深度值从深度图像空间转换到摄像机空间。例如,通过获知用来获得深度图像(或其较高分辨率版本)的捕获设备(例如,120)的几何光学,能够计算针对深度图像中每个像素的摄像机空间位置连同孔的全部的已填充的深度值。然后可以使用数值微分来估计每个像素的法线以及因此估计表面的取向。根据特定实施例,为了减小(被包括在所显示的图像中的)用户的表示中的抖动,临时存储与帧相对应的摄像机空间位置,使得能够将与某个帧相对应的摄像机空间位置跟与紧挨在前面的帧相对应的位置相比较。然后可以将每个像素的位置与其在紧挨在前面的帧中的位置相比较,以确定它们之间的距离(即,位置的改变)是否超过了指定的阈值。如果没有超过阈值,则在显示用户的表示时,该像素在所显示的用户的表示中的位置不相对于前一帧改变。如果超过了阈值,则在显示用户的表示时,该像素在所显示的用户的表示中的位置相对于前一帧改变。通过仅在其位置改变超过指定的阈值时才改变像素在所显示的用户的表示中的位置,减小了在所显示的用户的表示中的(例如由于与用来获得深度图像的摄像机相关联的噪声造成的)抖动。
现在将在下面参考图32-35来描述以上参考图31论述的特定步骤的附加细节。
图32图示了根据某些实施例的被使用来提供图31中的步骤3102的附加细节的流程图。更具体地,图32被使用来描述如何产生已被指定为与用户相对应的像素子集的低分辨率版本,使得在显示用户的表示时,图像遵从用户的形状且不平滑用户的相异的身体部分,然而其不是用户的镜像图像。使用捕获设备(例如,120)来获得深度图像的原始版本,所述深度图像的原始版本具有原始分辨率,例如320x240像素,但不限于此。此外,使用深度图像分割模块252来指定原始深度图像内哪个像素子集与用户相对应。这样的像素子集可以被用来显示包括用户的相对准确的表示的图像。然而,依赖于应用,可能更期望显示包括用户的不太准确的表示、然而仍遵从用户的总体形状且不平滑相异的身体部分的图像。例如,在应用显示实施某些锻炼的用户的表示(该用户被指令实施所述锻炼)的情况下,可能不期望显示超重或过瘦的用户的准确表示。这是因为一些人偏爱在锻炼时不看他们自己的相对准确的镜像图像。因此,现在将参考图32来描述的本发明的某些实施例涉及用于产生与用户相对应的像素子集的较低分辨率版本的技术。
参考图32,步骤3202牵涉到接收(使用位于离用户一定距离处的捕获设备获得的)深度图像的原始版本以及指定深度图像内的像素子集对应于用户的原始信息。步骤3204牵涉到对被指定为与用户相对应的原始深度图像内的像素的子集进行下采样,以产生与用户相对应的像素的第一低分辨率子集。例如,下采样可以将深度图像的分辨率从320x240像素减小到80x60像素,但是不限于此。在实施例中,当实施下采样时,将较高分辨率像素的多个块中的每一个块用单个较低分辨率像素代替。例如,可以用单个像素代替包括320x240像素的原始深度图像的每个4x4像素块以产生包括80x60像素的较低分辨率深度图像。这只是示例,其不意味着限制。此外,应注意,每个较高分辨率像素块不需要是相同尺寸的。在某些实施例中,在针对每一个较高分辨率像素块(例如,每个4x4块)实施下采样时,特别地或任意地选择(在较高分辨率像素块中的)像素之一并与将该像素与其邻近像素相比较,以产生要在较低分辨率深度图像中代替较高分辨率像素块的单个像素。在特定实施例中,这是通过将所选择的像素用其邻近像素的加权和来代替而实现的。例如,可以使用以下等式将深度图像像素值用其邻近像素的加权和值(即,newvalue)来代替:
常规的图像滤波(比如,模糊)典型地将权重指定为是在输入像素与邻近像素之间的距离的函数,即,(其中将输入位置和邻近位置缩写为i和n),如下表达:
weight(i,n)=spatialweight(i,n)=e-distance(i,n)。
以上有效地是高斯滤波器。
根据特定实施例,在将(深度图像的原始版本中的)像素块用(该像素块的)像素的邻近像素中所选择的邻近像素的加权和来代替时,使用三角下采样方法,其中三角下采样使用三个加权因子来产生加权和。这三个加权因子包括:指示在该像素和邻近像素之间的距离的空间加权因子、指示在该像素的深度值与邻近像素的深度值之间的差是否小于阈值的深度加权因子、以及指示邻近像素是否在被指定为与用户相对应的像素子集内的分割加权因子。这三个加权因子可以被表达为三个单独的函数,包括:
spatialweight被使用来对图像滤波(例如,平滑)。depthweight确保平滑不跨越图像深度明显改变的边界。例如,考虑其手臂在其前面伸出的用户。与手部上的像素相对应的深度将明显不同于胸部上的像素。为了保存手部和胸部之间的边缘,滤波不应跨越在手部与胸部之间的边界。segmentationweight确保了平滑不跨越在用户与背景场景之间的边界。在没有segmentationweight的情况下,用户的深度值可能在用户的边缘处混合到背景环境中。
此外,对于每个较低分辨率像素,可以确定和存储指示较低分辨率像素的覆盖的信息,其中指示较低分辨率像素的覆盖的信息指示了被指定为与用户相对应的高分辨率像素(对应于较低分辨率像素)的百分比。
在步骤3204产生的与用户相对应的像素的第一低分辨率子集偶尔会包括错误地被指定为与用户相对应的伪像素。为了去除这些伪像素,可以对与用户相对应的像素的第一低分辨率子集实施形态学开(morphologicalopen),如在步骤3206指示的。为了保存运动者的准确轮廓,在步骤3208,通过(在与用户相对应的像素的第二低分辨率子集中)包括既在与用户相对应的像素子集的原始版本中又在与用户相对应的像素的第一低分辨率子集中的像素,产生与用户相对应的像素的第二低分辨率子集。例如,可以通过使用二进制and(与)操作来实施步骤3208,从而用与用户相对应的像素子集的原始版本掩蔽形态学开的结果。
这个与用户相对应的像素的第二低分辨率子集可以是在步骤3104中在其中辨别区间的子集。可替换地,还可以使用与以上参考步骤3204描述的方法相类似的三角滤波方法(但是不实施任何另外的分辨率减小)对像素的第二低分辨率子集滤波,并且最终得到的与用户相对应的像素的低分辨率子集可以是在步骤3104中在其中辨别区间的子集。还可能的是,可以在步骤3102或在步骤3102之前实施可替换类型的下采样,或者根本不使用下采样。换言之,在某些实施例中,在步骤3102获得的深度图像不需要被减小分辨率,并且因此不需要实施参考图32描述的步骤。
现在将使用图33来说明如何在步骤3104辨别潜在地是与用户相对应的像素子集中的孔的一部分的像素的一个或多个区间的附加细节。一般地,期望检测每个潜在孔的边界。根据特定的实施例,这是通过辨别(在被指定为与用户相对应的像素子集内的)像素的每个水平区间来完成的,其中在水平区间的两侧都存在深度值从一个像素到其水平邻近像素的改变,所述改变超过了深度不连续性阈值,如在步骤3302指示的。此外,这是通过辨别(在被指定为与用户相对应的像素子集内的)像素的每个垂直区间来完成的,其中在垂直区间的两侧存在深度值从一个像素到其垂直邻近像素的改变,所述改变超过了深度不连续性阈值。更一般地,存在对这两个方向中的每个方向上的足够大的深度不连续性的搜索。由于进行遮蔽的身体部分必然比被遮蔽的身体部分离捕获设备(例如,120)更近,所以将具有正增量(其超过阈值)的深度不连续性辨别为潜在孔的起始点,并且将具有负增量(其超过阈值)的深度不连续性辨别为潜在孔的结束点。
在特定实施例中,为了辨别潜在地是孔的一部分的像素的垂直区间,可以逐列分析被指定为与用户相对应的像素子集,以辨别任何两个连续像素,其中第二像素以大于深度不连续性阈值的值更靠近第一像素。这可以被存储为区间的潜在起始点,并且任何后续的起始点可以取代先前的起始点。由于不存在填充多个层的需要,所以不存在存储起始点的历史的需要。可以通过以下方式来辨别区间的潜在结束点:辨别两个连续像素,其中第二像素比第一像素的远离要大于相同阈值,用任何后续的结束点取代先前的结束点。将区间的起始点和结束点之间的像素辨别为潜在地是孔的一部分。此外,对于(被辨别为具有超过深度不连续性阈值的深度值的)每一对连续像素,将两个像素中“较远的”那个辨别为潜在孔的边界(并且因此还可以被称作潜在孔边界)。为了辨别潜在地是孔的一部分的像素的水平区间(以及辨别另外的潜在孔边界),实施与刚刚描述的用于辨别垂直区间的过程相类似的过程,区别仅在于存在对被指定为与用户相对应的子集像素的逐行(而不是逐列)分析。
现在将使用图34来说明如何在步骤3106分析区间相邻像素以确定一个或多个区间相邻像素是否也将被辨别为潜在地是在被指定为与用户相对应的像素子集中的孔的一部分。参考图34,在步骤3402,选择区间相邻像素以用于分析。如以上提到的,区间相邻像素指的是与步骤3104所辨别的水平或垂直区间中的至少一个区间相邻的像素。在步骤3404,存在对于以下的确定:是否(在步骤3402选择的区间相邻像素的)至少第一阈值数目的邻近像素已被辨别为潜在地是孔的一部分。深度图像中的每个像素具有8个邻近像素。因此,像素的在0和8之间的任何数目的邻近像素可能已被辨别为潜在地是孔的一部分。在特定实施例中,第一阈值数目是4,意味着在步骤3404存在对于是否(在步骤3402选择的区间相邻像素的)至少四个邻近像素已被辨别为潜在地是孔的一部分的确定。如果步骤3404的答案为是,则流程进行至步骤3406,在步骤3406存在对于是否(在步骤3402选择的区间相邻像素的)至少第二阈值数目的邻近像素已被辨别为潜在孔的边界的确定。在特定实施例中,第二阈值数目是1,意味着在步骤3406存在对于是否(在步骤3402选择的区间相邻像素的)邻近像素中的至少一个已被辨别为潜在孔的边界的确定。如果步骤3406的答案为否,则该区间相邻像素被辨别为潜在地是孔的一部分。如果步骤3404的答案为否或者步骤3406的答案为是,则该区间相邻像素不被辨别为潜在地与孔相对应。如从步骤3410和3402能够认识到的,重复该过程直到分析了每个区间相邻像素为止。此外,应注意,步骤3404和3406的顺序能够反转。更一般地,在步骤3106,实施(先前在步骤3104中辨别的)区间的选择性形态学膨胀(morphologicaldilation),以将先前在步骤3104中没有被辨别出来的另外的像素或区间辨别为潜在地与孔相对应。
现在将使用图35来说明如何在步骤3110将(在被指定为与用户相对应的像素子集中的)每个被辨别出的像素岛分类为是孔或不是孔。参考图35,在步骤3502,选择像素岛以用于分析。在步骤3504,存在对于岛的高宽比或宽高比的确定。这样的像素岛典型地不会类似方形或矩形,因此典型地不会包括均匀的高度或均匀的宽度。因此,依赖于实现,可以将岛的高度认为是该岛的最大高度或该岛的平均高度。类似地,依赖于实现,可以将岛的宽度认为是该岛的最大宽度或该岛的平均宽度。在步骤3506,存在对于在步骤3504所确定的比值是否超过对应的阈值比值的确定。如果步骤3506的答案为是,则将像素岛分类为是在与用户相对应的像素子集内的孔。如果步骤3506的答案为否,则将像素岛分类为不是在与用户相对应的像素子集内的孔。如从步骤3512和3502能够认识到的,重复该过程直到分析了每个岛为止。
返回来参考图31,在步骤3110的结尾,与用户相对应的像素子集中的每个像素将被分类为是孔的一部分或不是孔的一部分。此外,在步骤3110的结尾,需要填充的孔将已被辨别出来,并且这样的孔的边界将已被辨别出来。此后,如以上参考图31描述的,在步骤3112实施孔填充,指示孔填充结果的信息在步骤3114被存储,并且当在步骤3116显示包括用户的表示的图像时该信息可供使用。
图36a图示了使用以上参考图31和图33-35描述的实施例来将其分类为孔的两个示范性像素岛3602和3604。图36b图示了在步骤3112实施的孔填充的结果。
如以上说明的,可以使用分割过程(例如,由深度图像分割模块3502实施的)来指定哪个像素子集对应于用户。然而,有时候的情况是:与支撑用户的地面的一部分相对应的像素也会错误地被指定为与用户相对应。这在尝试基于深度图像检测用户运动或其他用户行为时、或在尝试显示包括用户的表示的图像时,会导致问题。为了避免或减少这样的问题,可以使用参考图37描述的地面去除方法。这样的地面去除方法可以与以上参考图31-35描述的方法一起使用,或完全独立地使用。当与参考图31-35描述的方法一起使用时,可以在步骤3102之前、作为步骤3102的一部分、在步骤3102和3104之间或者在步骤3114和3116之间,实施地面去除方法,但不限于此。这样的地面去除方法牵涉到辨别被指定为与用户相对应的像素子集中很可能与支撑用户的地面相对应的一个或多个像素。这使得能从被指定为与用户相对应的像素子集中去除被辨别为很可能与地面相对应的像素。
为了实施地面去除方法,将深度图像的像素从深度图像空间变换到三维(3d)摄像机空间,以产生深度图像的3d表示,如在图37中的步骤3702指示的。此外,如在步骤3704指示的,确定或以别的方式获得满足平面a*x+b*y+c*z+d=0的系数a、b、c和d,其中这样的系数对应于深度图像的3d表示中的地面。此后,存在对于被指定为与用户相对应的像素是在地面平面以上还是在地面平面以下的确定。在地面平面以下的像素对应于地面的可能性比对应于用户的可能性大,因此这样的像素被重新分类为不对应于用户。可以使用以下描述的步骤3706-3714来完成这样的过程。
仍然参考图37,在步骤3706,从深度图像的3d表示中选择被指定为与用户相对应的像素。在步骤3708,使用等式fvr=a*x+b*y+c*z+d针对所选择的像素计算地面相对值(fvr),其中使用与地面相对应的a、b、c和d系数,并且使用所选择的像素的z、y和z值。在步骤3710,存在对于以下的确定:所计算的fvr是否小于或等于0,或者可替换地所计算的fvr是否小于0。如果步骤3710的答案为是,则认为该像素更有可能是地面的一部分,并因此不再被指定为与用户相对应,如在步骤3712指示的。如从步骤3714和3706能够认识到的,重复该过程直到分析了被指定为与用户相对应的每个像素为止。可替换地,只有被看作是与地面紧密靠近的那些像素才可能被分析。换言之,在步骤3706选择的像素可以仅仅是在地面的指定距离内的像素。
被用来获得深度图像的捕获设备(例如,120)可能相对于用户站立的或以别的方式支撑用户的地面倾斜。因此,使用这样的捕获设备获得的深度图像会依赖于捕获设备的倾斜而变化。然而,期望基于深度图像来检测用户的行为和显示包括用户的表示的图像是不依赖于捕获设备的倾斜。因此,解决捕获设备的倾斜将是有用的。这将通过以下方式来完成:将深度图像的像素从深度图像空间变换到三维(3d)摄像机空间,以产生包括被指定为与用户相对应的像素子集的深度图像的3d表示。此外,可以从传感器(例如,加速度计)或以某种其他方式获得向上矢量(upvector),并使用该向上矢量来生成新的投影方向。然后可以将每个像素重新投影到另一个平面,所述另一个平面相对于大地呈固定的空间方位角。然后可以将像素从3d摄像机空间变换回深度图像空间,最终得到的深度图像对摄像机倾斜具有较低的敏感度。
尽管以特定于结构特征和/或方法动作的语言描述了主题,然而要理解的是,在所附权利要求中限定的主题不一定限于以上描述的特定特征或动作。而是,以上描述的特定特征和动作是作为实现权利要求的示例性形式而被公开的。打算让本技术的范围由本文所附的权利要求来限定。