摘要
在《英雄无敌:上古纪元》的战斗画面里,左右两侧各有一个英雄 HUD(抬头显示:英雄头像、三个属性数字、魔力“当前/上限”),角上或英雄旗帜内有计时,顶部有一条行动条(按出手顺序排列的生物小卡片,卡片底色红/蓝表示所属方,卡片上有兵堆数量)。本实验分多轮(2026-09-09 至 09-20)回答:只看一帧,能不能可靠地把这些区域找到并读出来?
主要结果(全部是已看过的开发材料,不是盲测或产品准确率):
- 稳定候选帧转成固定区域后,136 个计时区域全部得到成对读数;136 个英雄 HUD 中 124 个读出完整数字,12 个保守拒识。
- 跨任务 24 张原图:角落计时 30/30、旗帜内计时 10/10、英雄数字整组 32/34,2 组拒识,0 组读错被接受。
- 行动条:单类卡片检测加固定高度后,36 张新参考图 448 张卡片 0 漏检 0 多框;身份 349 张接受且一致、99 张拒识、0 张错误接受。
- 真实录像固定时刻:14/20 组完整数字,70 个数字与人工核对一致;6 个无数字画面全部不输出。
- 能把肖像、属性图标和数字关联成“希尔:攻 3 防 3 法强 18”这样的候选记录,但敌我关系只是候选。
要回答的问题
给一张原生截图、不告诉程序现在是哪一方行动,能否:
- 找到并读出左右英雄 HUD 的数字和计时;
- 找到顶部行动条的每张卡片,分别读出它的位置、生物身份和红蓝底色;
- 在录像任一时刻只用“此刻及之前”的画面读数,不偷看未来;
- 把数字绑定到正确的英雄和属性名。
本实验只观察单帧画面,不判断“暗按钮是因为点数不够”,不判断计时在减少,不维护对局状态。左右只表示屏幕位置,不等于我方/敌方。
数据与来源
所有图都来自用户自己录的对局录像,按轮次:
| 轮次 | 数据 |
|---|---|
| 首轮(09-09) | 由另一个选帧实验挑出的 68 张稳定战斗帧,来自 2 段录像、6 个 30 秒区间,切出 272 个区域 |
| 跨任务补标(09-10) | 24 张原图、17 段录像;助手目视转录 216 个文字框、48 个 HUD 布局标签 |
| 玩家头像与行动条(09-10) | 20 张图、5 段录像;184 个卡片框、53 种生物、184 个数量原文 |
| 行动条扩充(09-10) | 36 张新图、20 段录像,448 张卡片;另 12 张顶部无卡片的对照图 |
| 稀缺类别补标(09-10) | 12 张图、10 段录像,156 张卡片 |
| 书页打开时的 HUD(09-12) | 10 张开发图,120 个可见字段 |
| 真实录像按时刻读取(09-20) | 一段 9 月 20 日录像的 3600–6300 秒,10 个检查点;后补 64 次取帧、128 个 HUD 区域 |
人工参考均由助手逐项看原图转录,状态是“助手目视核对、待用户确认”,不是人工审核(REVIEWED)。很多参考在转录前看过模型输出,因此不是盲测。行动条累计 68 张图、788 张卡片,覆盖 132/141 个竞技场生物身份。
方法
固定区域 + OCR。 画面是 2560×1440,HUD 和计时位置固定,直接按归一化坐标裁出(完整 HUD 333×547,计时 154×202)。用本地 PP-OCRv6 文字识别模型跑两路:原图和 3 倍对比度增强(CLAHE)。两路都完整且一致就接受;只有一路完整也接受但标记;两路完整却不一致(例如增强路把 12 12 6 连成 12 126 6)则拒识。不把两路的残缺读数拼起来。
旗帜内计时。 有些 HUD 的计时嵌在英雄旗帜里,只在完整 HUD 裁图的固定竖直区间 300–385 内找时间格式,复用同一个解析器,不读参考答案。
行动条:检测和身份分开。 先用一个单类检测器(YOLO26n,只学“这是一张生物卡片”)在顶部区域找卡片位置,输出统一固定在 y=0..127,只回归横向位置,横向重叠超过 0.70 的重复框只留一个。然后对每个框独立做两件事:用游戏目录里 148 个生物头像做模板匹配认身份(分数 ≥0.80 且领先第二名 ≥0.03 才接受),读卡片两侧底色认红蓝。身份不确定就输出未知但保留框;颜色混杂也输出未知。
玩家头像锚点。 用户的个人头像(一只兔子)在左上小圆圈;用模板匹配找它,读它的边框颜色,再和行动条首张卡片的底色比较,作为“现在是不是我方行动”的候选。
不看未来的取帧。 给定截止时刻,只取时间戳不超过截止点的最后一帧(最多往前看 500 毫秒),不挑更清楚的未来帧。为验证这一点,把两秒片段做成“完整 / 截断 / 截止后换成纯色”三路,分别独立解码、裁图、启动新 OCR 进程,比较输出是否完全相同。
肖像与属性图标绑定。 肖像用 SIFT 局部特征和几何一致性检验,在全部 77 个英雄标准图中找(不是只在已知两位中选);属性图标用 11 个标准属性图标做带透明掩膜的模板匹配(首名 ≥0.70 且领先 ≥0.10)。只有三个图标各不相同且都认出、数字组也完整,才把数字绑定到属性名。
设置
行动条检测器:旧 20 张图按录像分组,12 张/110 框训练、8 张/74 框验证;顶部区域 [448,0,2144,160],长边 1024,最多 80 轮,第 65 轮早停、选第 50 轮,训练调用 50.74 秒(RTX 5080)。不使用 Simulator(项目自己的规则模拟器)作为标签来源。
结果
首轮稳定帧:
| 项目 | 结果 |
|---|---|
| 计时区域 | 136/136 成对读数;125 两路一致,11 只有增强路完整 |
| 英雄 HUD | 124/136 接受(91.18%);12 拒识(9 冲突 + 3 两路都不完整) |
| GPU 常驻批次耗时 | 计时 4.63 秒,HUD 11.70 秒 |
抽查 10 个 HUD,6 个被接受的样例读数全对;3 个不完整样例肉眼可读但 OCR 漏了中间属性,说明召回不完整。
跨任务 24 张原图:
| 任务 | 参考可见 | 读对 | 拒识 | 接受但读错 | 不可见时误输出 |
|---|---|---|---|---|---|
| 角落计时(两行一起) | 30 对 | 30 | 0 | 0 | 0/18 |
| 属性与魔力整组 | 34 组 | 32 | 2 | 0 | 0/14 |
| 旗帜内计时 | 10 对 | 10 | 0 | 0 | 0/38 |
玩家头像与行动条(20 张开发图): 可见兔子 → 侧别/颜色 15/15;部署阶段拒绝绑定 5/5;槽位 184/184 无多框;身份 Top-1 184/184;底色 177 对、7 拒识、0 错;首槽与我方颜色关系 12 张给出候选、3 张不猜。CPU 共 179.11 秒,不是实时性能。
行动条扩充(36 张新图):
| 方法 | 匹配 | 漏检 | 多余框 |
|---|---|---|---|
| 旧边框扫描规则 | 448 | 0 | 0 |
| 小模型原始输出 | 448 | 0 | 4 |
| 固定高度 + 横向去重 | 448 | 0 | 0 |
| 身份/颜色 | 旧验证 74 张卡 | 新增 448 张卡 |
|---|---|---|
| 身份接受且一致 | 60 | 349 |
| 身份拒识 | 14 | 99 |
| 身份错误接受 | 0 | 0 |
| 底色一致 / 拒识 / 错接受 | 71 / 3 / 0 | 412 / 36 / 0 |
| 从图库移除真实身份后错误接受 | 0 | 4 |
12 张顶部无卡片对照图 0 误报。151 张批量候选图共 1,618 个框,身份未知 370、颜色未知 138;累计推理 1179.35 秒,其中定位只占 7.05 秒,主要成本在 CPU 多模板匹配。
书页打开时: 冻结的全图 OCR 读数与 120 项参考全部一致(英雄 80/80、时钟 40/40);这是单视频重复开发帧的事后核对,没有无文字负例。
真实录像按时刻(10 个检查点): 完整数字组 14/20;70 个数字核对一致;6 个无数字 HUD 不输出;20 张裁图 GPU 批次 2.24 秒(另有约 1.26 秒模型初始化)。截断/替换对照:像素、原时间戳、解析读数全部一致。
绑定: 3980 秒之前最后一帧,左侧候选希尔(攻 3、防 3、法强 18),右侧候选修女凯莉(攻 4、防 6、法强 14)。部署附近 36 帧 72 区域的数字组全部不完整;战斗开始附近 28 帧 56 区域中 45 组完成关联、10 组不完整、1 组冲突。两个截止点(500 ms、999 ms)的物理截断对照全部通过,共启动 6 个独立 OCR 进程。
失败与负结果
- 增强并不总帮忙:4180 秒右侧原图路读
[4,6,14]、增强路读[6,1,14],按规则整组保留冲突、字段为空;不从相邻时刻抄数,也不按“看起来合理”选值。 - 第一次截断/替换对照失败:编码器把早期帧的时间戳重新取整,500 ms 的帧变成 469 ms,对照输入本身已不同。改为保留 1/1000 时间基后重跑才通过;失败记录保留。
- 行动条小模型原始输出有 4 处重复框;固定高度和去重是在看到新增集问题后加入的,属于回顾性检查。旧规则在这批同样够用,不能说小模型比规则好。
- 4 处参考底色曾被生物衣服颜色误导,打开 3 倍局部后修正。
- 用参考应用做全图英雄识别时,画面中部冒出一个无关的第三英雄候选,说明全图匹配不能直接当英雄绑定器。
- 部署附近 72 组数字全部不完整。
局限
- 所有数字都来自已看过的开发材料,相邻帧和同一英雄重复很多,不是独立样本,更不是 ≥95% 字段准确率目标的证明。
- 只支持 2560×1440;UI 缩放变化未验证。
- 本批没有兔子在右侧/蓝方的真实样本,不能把“我方 = 左/红”写成通用规则。
- “移除真实身份”只是模拟目录缺类,不是真正的开放集测试,不能保证未知生物都会被拒识。
- 3980 秒只是新增采样的第一个完整读数,不是已证明的开局值;不能把法强 18→19 的变化直接归因于某个技能。
- 行动条覆盖仍缺 9 个竞技场生物;数量 OCR 这一轮没有重新跑。
结论与下一步
固定布局的 HUD、计时和行动条,用“固定区域 + 两路 OCR + 冲突就拒识”和“先找卡片位置、再分别认身份和颜色”的方法,在开发材料上没有出现错误接受,代价是一部分拒识。下一步不再堆相似 HUD 核对次数,而是补部署到开战的首现时刻和英雄面板证据,用公开的 Simulator 规则接口比较少量合法技能/宝物候选,并在新的、未看过的录像上盲测漏检、误检与未知接受。
Comments