Skip to content

在异常截图(NavError / Debug Screenshot)上自动标注当前 ROI / 探测点,提升调试效率 #426

@syokounya

Description

@syokounya

Validations

  • 我已经阅读了 用户文档 并尝试自己解决问题,同时在社群中进行了讨论
  • 我无法找到任何 open issue 提出了相同的建议

问题描述

目前当脚本发生导航超时、像素匹配失败或模板未命中时,会自动保存原始截图(如 NavError_*.pngdebug_screenshot.png)。然而这些截图仅仅是未经任何标注的游戏原图,开发者在事后排查时面临以下困难:

  • 难以定位检测区域:代码中使用的是相对坐标(如 0.802, 0.389),需要手动换算到具体像素位置,才能在截图上找到程序“正在看哪里”。
  • 动态区域无法直观判断:对于模板匹配(ImageChecker)或 OCR 裁切区域,失败时并不知道实际搜索的是屏幕的哪一块。
  • 颜色误判无从考证:像素检测(PixelChecker)失败时,无法直接看到探测点处的真实颜色,经常需要再次跑 tools/pixel_marker.pytools/debug_screenshot.py 去复测。

这导致很多“看一眼图就知道”的问题,反而需要花费大量时间在坐标换算和二次验证上。

解决方案

在截图保存前增加一层可选的可视化标注(Annotation Layer),将当前检测上下文绘制到图像上再落盘。

  1. 扩展 save_image API

    autowsgr.infra.logger.save_image 增加一个可选参数 annotations,支持传入一组标注对象,例如:

    save_image(
        image=screen,
        tag='NavError',
        annotations=[
            PointAnnotation(x=0.802, y=0.389, color='red', label='challenge_probe'),
            RectAnnotation(x1=0.15, y1=0.05, x2=0.65, y2=0.10, color='green', label='tab_bar'),
            TextAnnotation(text="Expected: Color(33,132,226)", position='top-left'),
        ]
    )
  2. 在核心视觉层自动收集 ROI

    • PixelChecker:当 check_pixel / check_signature 失败时,可返回失败的规则坐标,供上层绘制十字或圆点。
    • ImageChecker:模板匹配失败时,将搜索的 roi 以半透明矩形框标注出来。
    • NavigationErrorwait_for_page / click_and_wait_for_page 超时保存截图时,如果调用方传入了 checker,尝试提取 checker 内部关联的像素规则或模板区域并一并绘制。
  3. 统一标注规范(示例)

    • 探测点:红色十字 + 或圆点,附带坐标文本(适用于 PixelChecker 单点检测)
    • 矩形 ROI:绿色/黄色半透明边框(适用于模板匹配搜索区、OCR 裁切区)
    • 策略结果:左上角文字,标注期望颜色 vs 实际颜色(适用于像素匹配失败对比)
    • 页面状态:顶部横幅文字,标注当前识别到的页面或“未知”(适用于 NavigationError 场景)
  4. 向后兼容

    • annotations 默认为 None,不传时行为与现在完全一致,不影响任何正常流程的性能。
    • 仅在 DEBUG 日志级别或显式开启调试模式时才自动附加详细标注,避免生产环境截图过大。

预期效果

拿到 NavError 截图后,能直接看到

  • 红色的探测点落在了哪里
  • 绿色的模板搜索框覆盖了哪个区域
  • 期望的颜色值和实际检测到的颜色值

从而将“坐标换算 -> 二次验证 -> 定位 Bug”的周期从十几分钟缩短到几秒钟。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions