摘要

游戏战场是一张由六边形格子组成的棋盘。程序要说出“某个单位站在哪一格”,第一步是把抽象的六边形网格准确叠到截图像素上,这叫网格配准(registration)。本实验从“固定相机标定”出发:在一张校准截图上人工点出格子顶点,拟合一个从网格坐标到屏幕像素的变换,再在其它截图上检验这个变换是否仍然对得上,以及是否需要按每张图做小幅修正。

经过用户在网页工具里逐点复核标注后,开发集选出的方案是固定透视变换(homography)、不做逐图修正:3 张测试图、53 个参考点上,误差中位数 2.757 像素(约为局部格距的 3.7%),50/53 个点在 8 像素以内。之后又比较了三种新的边缘评分方法(Chamfer 距离、带方向的 Chamfer、经典直线段检测 LSD),它们在全部三张测试图上都比固定方案差,因此没有采用。最后用户还人工圈定了可玩区域:157 个候选格中保留 137 个。

要回答的问题

  1. 摄像机和截图布局基本固定时,一次标定能否直接用于其它战场截图?
  2. 在固定标定之上,按每张图的边缘做小范围搜索修正,是否能进一步提高精度?
  3. 换用更“专门”的边缘匹配分数(Chamfer、LSD)会不会比现有的梯度分数更可靠?

数据与来源

  • 六张原始战斗截图,来自六段不同录像:1 张校准图、2 张开发图、3 张测试图。最初的试点阶段这批截图都是 1920×1078 像素。
  • 人工标注网页上共有 124 个候选点:36 个用于校准、35 个用于开发、53 个用于测试。用户完成复核:123 个确认,1 个校准点不确定被排除,最终 35 个校准对应点参与拟合。
  • 测试点分三类:地形格线 37 个、选中格轮廓 10 个、单位脚下范围 6 个。
  • 开发点和测试点从不参与拟合;开发集先选方法并保存选择,然后才看测试结果。

早期版本的参考点是助手(Codex)自己看图放的,同一个助手既标注又实现算法;后来全部换成用户复核过的点。两者不能混为一谈。

方法

固定变换。 把六边形网格用相对的轴向坐标表示(例如 q+0_r+0),用校准点拟合两种变换:仿射(affine,保持平行线)和透视(homography,可以表现近大远小)。拟合用普通最小二乘,没有剔除异常点。

逐图修正。 在固定变换基础上,允许平移、相似变换或仿射的小范围调整,用“边缘证据”给每个候选打分并做有界搜索。现有评分在每条投影格边内部取 7 个采样点,55% 看垂直于边的梯度响应、45% 看亮度线响应,再按 12 个区域平均。另有一个未经校准的置信门槛,用来判断这张图是否“对上了”。

新的评分比较(v5)。 在运行前先写下协议:沿用同一份冻结的人工参考和同样的搜索范围,比较 8 种配置——固定仿射、固定透视、梯度评分的平移/相似/仿射修正、普通截断 Chamfer、带方向的截断 Chamfer、LSD 直线段匹配。Chamfer 的思路是先找出图里的边缘,再算每条投影格边离最近边缘有多远;带方向的版本只认方向相近的边缘(12 个方向桶,每桶 15 度)。所有新方法用同样的边和采样点,不增加搜索自由度。另外用“校准变换 + 256 个随机变换”组成一个公共候选库,事后看各评分方法给出的排序与真实误差的相关性。

设置

  • 评价指标:预测顶点到最近参考点的像素距离,报告中位数、P95、相对局部格距的比例和“8 像素以内”的数量。
  • 选择规则:按开发图中位误差的平均值选方法;新方法只有在开发改善、测试中位/P95/最差图都不变差、且排序相关性优于梯度评分时才推荐。

结果

人工复核前后的历史版本(同一批测试图,但标注不同,不是纯算法改进):

版本 标注来源 选中方法 测试误差中位 P95 8 像素内
试点 v1 助手目视 相似变换修正 19.34 px 28.77 px 4/40
修正 v2 助手修正校准点 31–36 透视 + 仿射修正 18.79 px 33.80 px 6/40
修正 v3 助手再修 12 个点 仿射修正 17.03 px 32.92 px 1/40
v4 用户网页复核 固定透视 2.757 px 8.071 px 50/53

v4 的开发集平均中位误差为 3.064 px;测试中位误差 2.757 px 约为局部格距的 3.735%,P95 为 10.852%。同一测试集上仿射修正的中位误差是 4.499 px,比不修正更差。

v5 新评分方法(同一 v4 参考,开发集再次选中固定透视):

方法 测试误差中位(53 点)
固定透视 2.757 px
LSD 直线段 + 仿射修正 4.253 px
梯度评分 + 仿射修正 4.499 px
普通 Chamfer + 仿射修正 4.796 px
带方向 Chamfer + 仿射修正 5.807 px

可玩区域边界。 用户在投影出的 157 个候选格中排除 20 个,留下 137 个可玩格,共 11 行,自下而上每行 12、13 个交替。为了便于阅读,另定义 board_xy 坐标:最下一行最左格为 (0,0),x 向右、y 向上;相邻关系仍用轴向坐标计算。

失败与负结果

  • 三种新评分方法都让三张测试图的中位误差全部变差。带方向的 Chamfer 在五张评估图上的排序相关性都比普通 Chamfer 好,但在三张测试图上都输给原梯度评分,因此不采用。
  • LSD 的第一版穷举实现因为太慢被中途停止;之后改用不改变分数的包围盒剪枝,没有借评估结果调参数。
  • 置信门槛不可靠:v3 时三张测试图虽然误差很大,仍全部通过门槛;在熔岩地图上,真实纹理能骗过它(黑图和孤立轮廓的压力测试会正确拒绝)。
  • 逐图修正在人工标注下反而不如固定变换。

局限

  • 测试图已经被反复查看,不再是新的留出数据;后续改动要在新录像上评估。
  • 指标只衡量稀疏顶点的吻合,不衡量格子中心、绝对编号、占用情况或每个格子是否都可见。
  • 整格平移会得到一张看起来同样吻合的无限网格,所以绝对格号无法从边缘分数验证;本实验只用相对原点,换原点格号就会变。
  • 只做过一次合成的半尺寸坐标检查,没有在真实分辨率或镜头变化下验证。
  • 项目软件测试(313 项)通过只说明代码约束成立,不是识别准确率。

结论与下一步

在相机和截图布局稳定的前提下,“一次人工标定 + 固定透视变换”已经能把网格对到几个像素以内,比逐图边缘修正更稳;更换评分方式没有带来改善。网格算出来的格子编号仍是推断候选,不是已确认的游戏事实。下一步是把地形格线和选中轮廓的证据分开、加入前景单位遮挡掩码,并在新的录像上重新评估。