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
    No fields configured for Feature.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions