Files
climperor/README.md
T
vosonandCursor a089660ca9 Drop real template library; keep CDN-only matching.
Remove build_library and runtime artifacts, ignore regenerable outputs, and add README/AGENTS/DESIGN/CHANGELOG for the simplified project.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-26 11:59:48 +08:00

2.7 KiB
Raw Blame History

上分帝(Climperor

Dota 2 天梯选将识别:从选人 / 决策时间截图中识别双方 10 个英雄。

本地、离线、秒级;模板来自 Steam CDN 官方头像。GSI 只负责触发时机,阵容靠视觉读顶栏。

设计背景见 DESIGN.md;协作约定见 AGENTS.md;变更记录见 CHANGELOG.md

原理

决策时间截图(PNG)
  → 按相对坐标裁出 10 个头像格(分辨率无关)
  → 缩放到统一尺寸;天梯局自动屏蔽段位条/勋章遮挡区
  → 与 CDN 模板做归一化相关匹配(TM_CCOEFF_NORMED
  → Top-1 分数 + Top1Top2 分差双阈值 → hero_key 或 null

皮肤差异靠会话策略处理(选人阶段多帧确认,决策阶段禁止改判),不堆皮肤模板。

安装

pip install -r requirements.txt
python fetch_cdn_templates.py   # 一次性:heroes.json + templates/cdn/

快速开始(GSI 自动跟踪)

python gsi_setup.py             # 写入 Dota GSI 配置
# Steam → Dota 2 → 属性 → 启动项加上 -gamestateintegration,重启游戏
python gsi_watch.py

进入英雄选择后自动跟踪;凑齐 10 人或超时后写出 results/draft_<时间戳>.json(该目录已 gitignore)。

主菜单收不到 GSI 是正常的:客户端第一次载入对局后才开始推送。看到 [gsi] connected 才算链路通。

手动流程

截图

python capture.py                # 单张 → samples/raw/
python capture.py --loop 300 3   # 每 3 秒一张,持续 300 秒

需无边框窗口或窗口模式(独占全屏可能黑帧)。

标定 ROI(一次性)

python autocalibrate.py samples/raw/<某帧>.png
# 失败时退路:python calibrate.py samples/raw/<某帧>.png

识别 / 评测

python recognize.py samples/raw/<>.png
python recognize.py samples/raw/<>.png --sheet
python recognize.py samples/raw/<>.png --truth hero1,...,hero10
python evaluate.py              # 按 samples/labels.json 批量评测

辅助脚本:roles.py(位置字)、grid.py(禁用名单)、modes.py(模式字)。

截图要求

  • PNG、原始分辨率(勿经聊天工具压缩)
  • 顶栏 10 个英雄完整可见
  • 优先选人阶段默认脸帧(皮肤尚未上顶栏)

已知限制

  • 宽高比差异大(如 21:9)时可能需重标定
  • 客户端改网格排序后 grid.pyok=False,不会瞎报禁用名单
  • 新英雄上线后重跑 fetch_cdn_templates.py
  • 位置文字模板取自简体中文客户端

相关项目

成熟后可移植到 dota2-hex 或独立发布。合规边界:只使用屏幕可见信息,不读内存、不注入。