为了给开合跳腾出地方,玩家把茶几推到墙边,又往后退了两步。结果刚才还很稳的游戏角色,手臂开始轻微发抖,深蹲偶尔会被多算一次,屏幕还提示了一句“注意膝盖方向”,可他觉得自己的膝盖明明没问题。人没变,动作也没变,真正变的是玩家在画面里占了多少像素。九游体育在处理这类问题时,先把“站远了”翻译成一串具体的数字,再决定在哪一层补救。

Camera → Pose → Motion → Game Input → Response

往后退两步,人在画面里缩小了一半

在焦距固定的情况下,人体在画面中的高度大致与站立距离成反比。在一个示例设定里,摄像头以1280×720横屏拍摄,玩家站在约2米处时,全身高度约占画面高度的八成;退到约4米时,只剩四成左右,也就是不到300个像素。手腕、脚踝这些细小部位,此时在原始画面里可能只有十来个像素宽。

距离拉远还会带来附带问题:人离开了补光灯的照射范围,画面噪点变多;自动曝光优先照顾背景,人物变暗;视频压缩也更容易把小尺寸的细节抹平。这些都会进一步降低细节质量。对只需要看手臂的拳击关卡来说,这点损失也许还能接受;对需要看膝盖和脚踝关系的深蹲,影响就明显得多。

模型看到的不是原图,而是一张更小的图

姿态估计模型并不直接处理整张高清画面。为了在手机上跑出实时帧率,常见的轻量模型输入只有一两百像素见方,例如 MoveNet 的 Lightning 版本使用192×192的输入。如果把整张横屏画面直接缩进这个尺寸,站在远处的玩家可能只剩几十个像素高,手腕只是一两个像素。

这时模型的定位误差哪怕只有一个输入像素,换算回原图也是好几个像素,而且相对于变小的身体,这个误差的比例更大了。关节角度是由三个关键点连线算出来的,大腿和小腿在画面中越短,同样的点位误差造成的角度波动就越大。在模拟场景里,站在近处时膝角可能只抖一两度,站远后可能抖到接近十度,足以让判定来回越过门槛。

先找到人,再把这块区域放大给模型看

解决思路是不把整张画面交给姿态模型,而是分两步:先用人体检测找出玩家所在的区域,再把这一块裁出来,放大到模型的输入尺寸,也就是常说的 ROI(感兴趣区域)处理。这样无论玩家站近还是站远,人体都能尽量占满模型输入,关键点定位的相对精度得以保持。

这里有几个细节需要处理好:

  • 留边距:裁剪框要比人体略大,否则开合跳时手臂一举高就被切出去了。
  • 跟踪而不是每帧重检:用上一帧的关键点推算这一帧的裁剪框,既省算力又稳定;跟丢时再重新检测。
  • 按需提高采集分辨率:玩家站得很远时,可以把摄像头采集切到更高分辨率,代价是更多的计算和发热,因此只在必要时启用。

需要说清楚的是,放大裁剪区域并不能凭空产生原图里没有的细节。原始画面里只有一百多个像素高的人,放大之后依然模糊,只是比整图缩小要好得多。所以ROI能缓解问题,但不能取代合理的站位。九游体育的做法是两者配合:ROI负责在推荐范围内把精度用足,站位提示负责让玩家尽量待在这个范围里。

把抖动挡在动作判定之外

即使做了ROI,远距离时的关键点抖动仍然比近处大。九游体育在动作层做了三件事:

  1. 按人体尺度归一化:所有距离都用躯干长度换算成相对值,玩家站远站近,门槛的含义保持一致。
  2. 滤波强度随尺度调整:人体越小,平滑越强,代价是轻微增加延迟;人体大时恢复轻度平滑,保证反应速度。
  3. 评分项随尺度降级:人体过小时,仍然判断动作是否发生(Motion Detected)和动作幅度(Range of Motion),但暂停膝盖内扣、左右对称这类细粒度的质量项,避免把噪声当成动作问题;同时提高关键点置信度(Confidence)的采用门槛,低于门槛的帧不参与计算。

这也是开头那句“注意膝盖方向”出现的原因:在没有降级的情况下,远距离的膝盖关键点抖动被误读成了内扣。

推荐站位范围:按人体占画面的比例划三档

系统会持续估算人体高度占画面高度的比例,并据此给出站位状态。以下为示例设定:

人体占画面高度 站位状态 系统处理
超过九成或头脚被裁切 太近 提示后退,受影响的动作暂停评分
五成到九成 推荐范围 全部动作与质量项正常评估
低于五成 偏远启用更强滤波,细粒度质量项暂停

首次使用时的动作校准会记录玩家身高与推荐站位,之后每局开始前都会用这个范围做一次快速检查。

提示放在两局之间,而不是动作做到一半

玩家在跳跃中途被一句“请向前一步”打断,体验很糟,还可能打乱动作。因此除非人体已经小到无法识别,站位提示都放在两局之间或休息环节:屏幕上显示一个人形框和地面方向箭头,玩家走进框里即可开始下一局。如果下载后始终拍不全身体,可以参考摄像头识别不到完整身体的排查步骤。

文中分辨率、比例与角度数值均为示例设定,用于说明原理;实际效果取决于设备、光线与房间条件。