摘要

战场上每个兵堆脚下有一块彩色小牌子(数量牌),红色或蓝色表示阵营,上面的数字是这一堆生物的数量。读准数量牌,就能在两次行动之间算出减员。现有读取流程(项目内称 A25 基线)在 4 张开发图、38 个可读目标上能读对 35 个。

本实验(编号 A26)分两部分:

  1. 试一个新的数量牌裁剪候选:只保留牌面彩色区域、把牌子外面的像素替换成牌面颜色,希望去掉背景和特效干扰后再交给 OCR。规则和参数在看图前冻结。结果在跑 OCR 之前就失败了:40 个已有候选只保留 14 个,两张雪地图全部被拒;就算保留的 14 个全读对,最多也只有 14/38 = 36.84%,已经低于基线的 35/38。负责人否决了第二阶段,没有做任何 OCR,也不再调参。
  2. 新增 8 张原图的完整数量牌参考:105 个可见数量牌区域,98 个可读、7 个不可读。负责人抽查后接受。它们是扩充的已曝光来源,不是认证过的盲测集。

要回答的问题

一个只依赖原始像素和已有牌框位置的“牌面裁剪”,能否在不丢目标的前提下给 OCR 提供更干净的输入?

数据与来源

  • 裁剪检查:只解码 A25 的 4 张 2560×1440 原图,使用它们已保存的 40 个牌框候选,不重新检测。
  • 新参考:8 张已有的原生截图,每张来自不同的录像;排除了 A24 用过的草地/雪地来源、旧调试来源和已知的续接录像。全部以前被其他读取器或人工看过,不是认证留出集。前 4 张拟作开发扩充,后 4 张拟作来源验证(待负责人决定)。

方法

冻结的裁剪规则(在任何图像检查之前提交):

  • 输入只有原始 BGR 像素、已保存的牌框和算法给出的红/蓝外观。
  • 用已有的 HSV 颜色区间找牌面填充;要求填充比例 ≥ 0.25、最大连通块占比 ≥ 0.70、牌面宽 ≥ 牌框 0.50、高 ≥ 0.45。
  • 填充牌面外轮廓(以保留浅色数字的“孔”),外扩 1 像素,裁到牌框内;牌面以外的像素替换为观测到的牌面中位色。
  • 颜色未知、填充不足、碎片化或过窄 → 未知、不裁剪。牌面外有浅色形状(可能是特效,也可能是被截断的真实数字)→ 也判未知。
  • 不用 OCR、数字个数、数量范围、参考框、身体、卡片或面板作为输入;没有后备方案;看完 4 张开发图后不再调整。

新参考标注:选图前先看来源记录,冻结时只读 PNG 头信息。之后逐张以原生分辨率人工查看,列出所有可见的脚下数量牌(包括读不出的),数值来自牌上字形,从不取自旧 OCR、行动条或兵种名单;完全被挡住或在屏幕外的单位不重建。手工框表示带边距的文字区域,不是精确掩膜。

设置

0 次新候选检测、0 次 OCR/模型调用、0 次 GPU 调用;OpenCV 使用 2 个 CPU 线程,裁剪数组只在内存中,不生成新图片。4 张图解码共 0.146558 秒,裁剪处理 0.005128 秒(不含启动和人工查看)。

结果

裁剪候选

A25 原图 候选 保留裁剪 判未知 可读目标中被保留
草地 1 13 9 4 9/13
雪地 1 13 0 13 0/12
草地面板 7 5 2 5/7
雪地面板 7 0 7 0/6
合计 40 14 26 14/38

被拒的 26 个中,24 个因为“牌面外有浅色形状”,2 个因为“多个颜色区域、找不到可靠牌面”。浅色形状规则把雪地和背景里普通的浅色像素也当作威胁,所以雪地图全军覆没。事后(只为覆盖率统计)对照已保存的目标分配:保留的裁剪覆盖手工区域的 53.80%–82.76%,但这既不能证明数字完整,也不能证明被截断——主要失败已经是覆盖率太低。

新参考(8 张图)

原图 拟议用途 可见数量牌 可读 不可读
10 月 1 日 18:13 开发 14 13 1
10 月 1 日 17:49 开发 14 13 1
10 月 1 日 00:44 开发 14 14 0
10 月 1 日 00:23 开发 14 14 0
9 月 30 日 23:33 验证(待定) 14 14 0
9 月 29 日 22:15 验证(待定) 14 13 1
10 月 1 日 20:52 熔岩图 验证(待定) 7 6 1
熔岩开局 验证(待定) 14 11 3
合计 8 段不同录像 105 98 7

105 个牌子中红色 56、蓝色 49,颜色都能直接区分;98 个可读数量中一位数 3 个、两位数 72 个、三位数 23 个。7 个不可读是被生物、装备、盾牌或鼠标完全挡住。负责人打开全部 8 张原图,独立核对了 38 个可读数量和全部 7 个不可读,接受这份参考。

失败与负结果

  • 裁剪候选在 OCR 之前就因覆盖率上限(36.84%)低于基线(35/38)而被否决;第二阶段未批准,不做 OCR、不调参、不换候选。
  • 第一次运行“已保存结果验证器”时失败:Python 的整数键在 JSON 中变成了字符串键。修正的是只读元数据比较器本身,没有改动任何推理、参数、原始决定或人工数值;之后验证通过,并增加了 JSON 往返断言。

局限

  • 被规则拒绝不代表那 24 个目标不可读,它们仍留在分母中。
  • 8 张新参考是已曝光来源的扩充,认证过的独立盲测对局为 0;不覆盖整图的界面、身体、身份或关联。
  • 10 项软件测试通过只验证合成数据上的边界行为,不证明人工标签或识别准确率。

结论与下一步

“把牌面以外抹掉”这条路在雪地和浅色背景上过于保守,无法超越现有基线,已结案。新得到的 105 个数量牌参考可留给今后另行授权、另行冻结的基线评估使用。如果需要一个真正未见过的数量盲测集,建议的最小采集是:4 段新的、未曝光的对局录像,每段 1 张批准的原生战场帧,每帧至少 13 个可读脚下数量、总计 ≥ 50,在任何读取器运行前冻结来源与参考——这只是提议,未执行。