这个系统现在能干什么
给它一段真实的篮球视频,它能做的事情包括:
-
在连续对抗中识别出是否出现典型犯规动作
-
给出犯规类型,比如推人、拉人、阻挡、带球撞人
-
在动作结束后,自动进入裁判示意阶段
-
当裁判举手比号码时,识别出手指数量
-
把整次判罚整理成结构化结果
重点是:
视频不需要裁剪,时间点也不用人工标注。
系统是一路"看"下来的。
成果如下:犯规类型

犯规人号码

这个专栏打算讲什么
我不打算在这个专栏里教你:
-
如何调一个更高准确率的模型
-
如何套一个现成的动作识别框架
我更想讲的是这些东西:
-
为什么体育规则天然不适合端到端模型
-
状态机在视觉系统里到底有多重要
项目流程
1️⃣ 视频输入与基础信息
-
输入:完整篮球视频(无需裁剪)
-
获取 FPS,用来做时间判断而不是帧数猜测
-
逐帧读取,顺序处理
关键点在这里就已经定了基调:
这是一个时间系统,不是图片系统。
2️⃣ 姿态与关键点检测(感知层)
每一帧都会做三件基础感知工作:
-
人体姿态关键点(Pose)
-
左右手关键点(Hand)
-
当前帧是否存在"可能的犯规动作特征"
这些信息本身不直接给结论,只作为后续逻辑的输入。
在这一层,系统只负责"看见",不负责"判断"。
3️⃣ 犯规动作触发(进入判罚候选)
当检测到典型的身体对抗模式时:
-
推人
-
拉人
-
阻挡
-
带球撞人
-
非法侵占圆柱体
系统会做一件非常重要的事:
从「无动作」状态 → 切换到「犯规动作阶段」
这一步只发生一次,不会反复触发。
4️⃣ 锁定犯规阶段,屏蔽无关判断
一旦进入"犯规动作阶段":
-
系统不再尝试识别号码
-
不关心手指数量
-
只关注动作是否结束
原因很简单:
裁判在动作发生时,不可能同时给号码。
5️⃣ 动作结束与时间缓冲
当犯规动作结束后,系统不会立刻进入号码识别,而是:
-
启动一个 基于 FPS 的时间缓冲
-
等待约 0.5 秒左右
这一步解决了两个现实问题:
-
避免把动作收尾当成号码手势
-
给裁判一个真实的反应时间
这不是模型能力,而是现实世界的节奏。
6️⃣ 裁判示意检测(进入号码阶段)
在时间缓冲结束后,系统开始观察:
-
是否有手臂上举
-
手部关键点是否处于合理位置
-
是否满足"这是裁判示意"的基本条件
只有满足这些条件,系统才会:
从「犯规动作阶段」 → 切换到「号码识别阶段」
7️⃣ 手指识别(只触发一次)
在号码识别阶段:
-
读取左右手关键点
-
判断手指张开数量
-
得到球员号码
这里有一个非常刻意的设计:
号码识别只允许成功一次。
一旦识别成功:
-
锁定结果
-
不再重复识别
-
防止抖动和误判
8️⃣ 输出判罚结果
最终输出的信息包括:
-
犯规类型
-
球员号码
-
判罚发生时间段
这些结果可以直接用于:
-
比赛复盘
-
技术统计
-
后续规则分析
9️⃣ 回到初始状态,等待下一次犯规
号码识别完成后:
-
状态重置
-
所有计数清零
-
系统继续观看比赛
就像裁判一样,
判完一球,再看下一球。
下一章我会带上完整的main函数代码和讲解流程