本文基于金手指项目当前可见的 Windows 窗口选择、截图识别、任务状态与日志结构撰写。产品适配对象统一写作“梦幻西游手游时空客户端”。文中图片是流程示意,不冒充真实软件界面;关键判断仍以当前画面、代码行为和日志字段为准。

这篇文章解决什么问题

模板匹配返回的分数只是当前截图、区域和尺寸组合下的证据。本文说明如何把候选位置、分数、采用规则和点击后变化写在同一条记录中。。桌面自动化最容易被忽略的不是某个函数怎么调用,而是输入证据是否来自同一时刻、同一窗口和同一组参数。窗口移动、缩放变化、遮挡、短暂菜单和线程切换都会让看似合理的结果失去复核性。因此排查时应先把现象拆成采集、判断、动作和结果四层,再逐层记录。

运行前固定边界

开始任务前,先确认程序能够读取配置,目标窗口确实存在,客户区矩形已经取得,模板或资源文件路径可访问,停止控制处于可响应状态。窗口标题可以作为初筛,但不能替代客户区矩形;文件存在也不能替代尺寸、颜色格式和版本检查。若目标窗口没有出现,先记录“未找到窗口”的状态并停在观察阶段,不要把上一轮坐标当成本轮输入。

对于梦幻西游手游时空客户端相关流程,建议把窗口句柄、外框矩形、客户区矩形、截图时间和任务阶段放在同一条上下文记录中。这样即使画面随后变化,也能知道识别使用的究竟是哪一帧。如果程序运行权限与目标窗口不同,还要单独记录前台激活和输入发送结果,不把点击函数返回当成页面已经变化。

四层证据检查法

第一层是采集:保存原始截图的时间、尺寸、通道格式和裁剪区域,区域应来自当前窗口矩形,而不是屏幕固定点。第二层是判断:记录候选位置、匹配分数、采用阈值和筛选规则,必要时保留多个候选,不只留下一个布尔值。第三层是动作:写明逻辑坐标、转换后的屏幕坐标以及动作前窗口状态。第四层是结果:动作后重新获取画面,确认按钮消失、提示出现、阶段字段变化或任务面板进入下一状态。

这四层中任何一层缺失,后续都可能把问题归错。例如截图正确但模板版本不对,属于素材层;模板命中但点击后画面不变,可能是前台或权限层;任务状态已经改变但线程仍重复发送动作,则属于状态推进层。把证据按层分开,才能让下一次修改只针对一个条件。

本主题的重点判断

模板匹配返回的分数只是当前截图、区域和尺寸组合下的证据。本文说明如何把候选位置、分数、采用规则和点击后变化写在同一条记录中。。实际操作时先保留一份未经裁剪的原始证据,再制作供匹配使用的区域或模板。每次改变一个变量,例如只改搜索区域、只改缩放比例或只改阈值,并在日志中写下修改前后的值。若结果同时变化,优先回到同帧截图比较,而不是凭感觉继续调参。对多窗口任务,还要把每个窗口的状态分开保存,一个窗口完成不代表其他窗口完成。

异常与重试

遇到空截图、候选为空、分数忽高忽低、点击后无变化或窗口突然移动时,先回到观察状态。保存当前窗口矩形、截图路径、候选数据和最近一条日志,再决定是重新选择窗口、重新采集、重新加载素材还是结束阶段。重试应有次数和条件边界:同一画面没有变化时,不要无休止地重复扫描;画面发生变化后,再用新的同帧证据重新判断。停止任务时释放输入、结束等待并写入结束原因。

复核清单

发布或实际运行前,按以下顺序检查:名称和适配对象是否统一;窗口句柄与客户区矩形是否来自当前画面;截图、模板、日志是否使用同一编号;候选、分数、坐标和动作结果是否可回看;异常是否有回到观察状态的路径;停止控制是否仍可用;关键结论是否同时用文字说明,而不是只放在图片里。

视觉识别分数怎么记录:不要只看一次命中结果
视觉识别分数怎么记录:不要只看一次命中结果

这套方法把一次运行变成可检查的过程:先确认输入,再做判断,动作后验证外部变化,异常时回到已知状态。它不承诺固定结果,也不代替对具体版本和真实画面的检查;当代码、窗口布局或素材变化时,应重新采集证据并更新记录。需要了解窗口相对坐标时,可阅读窗口移动后的相对识别说明,需要了解多尺度模板时,可参考OpenCV多尺度模板匹配实践