OnmyojiAutoScript探索任务卡死问题分析与解决方案

OnmyojiAutoScript探索任务卡死问题分析与解决方案

OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 OnmyojiAutoScript 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript

问题现象描述

在使用OnmyojiAutoScript进行探索任务时,用户反馈在击败第一个怪物后,如果当前屏幕内没有可攻击对象,脚本会出现停止运行的异常情况。该问题在1080p分辨率环境下较为常见,而在更高分辨率设备上则较少出现。

错误日志分析

从错误日志中可以观察到关键报错信息:

OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\templmatch.cpp:588: error: (-215:Assertion failed) corr.rows <= img.rows + templ.rows - 1 && corr.cols <= img.cols + templ.cols - 1 in function 'cv::crossCorr'

这表明问题出在OpenCV的模板匹配功能上,具体是在图像处理模块的模板匹配过程中出现了断言失败。

根本原因分析

经过深入排查,发现问题的根本原因在于:

  1. 图像匹配机制缺陷:当脚本连续两次捕获到完全相同的游戏画面时,第二次进行匹配的模板图像会出现宽度为零的非法输入情况。

  2. 缺乏输入验证:在调用OpenCV的模板匹配函数(cv2.matchTemplate)前,代码没有对输入图像的尺寸进行有效性验证,导致程序遇到非法输入时直接卡死。

  3. 分辨率相关性:在1080p分辨率下更容易出现这种情况,可能是因为屏幕显示内容较少,更容易出现两次截图完全相同的情况。

解决方案实现

针对这一问题,开发者提出了以下修复方案:

source = self.corp(image)
mat = self.image

if mat is None or mat.shape[0] == 0 or mat.shape[1] == 0:
    logger.error(f"Template image is invalid: {mat.shape}")
    return True  # 如果模板图像无效,直接返回True

res = cv2.matchTemplate(source, mat, cv2.TM_CCOEFF_NORMED)

该解决方案的核心改进点包括:

  1. 增加输入验证:在调用模板匹配前,先检查模板图像的尺寸是否有效。

  2. 优雅处理异常:当检测到无效输入时,记录错误日志并返回True,避免程序崩溃。

  3. 保持原有逻辑:在正常情况下,继续原有的模板匹配流程。

实施建议

对于需要手动应用此修复的用户,建议:

  1. 修改文件路径:"./OnmyojiAutoScript-easy-install/module/atom/image.py"约150行处。

  2. 关闭自动更新:在config目录下的deploy.yaml文件中,将KeepLocalChanges的值设置为true,以防止修复被自动更新覆盖。

技术思考

虽然这个解决方案能够有效解决问题,但从软件工程角度看,这只是一个临时性的修复。更完善的解决方案应该考虑:

  1. 在更高层次上避免连续获取相同截图的情况。

  2. 建立更健壮的图像处理异常处理机制。

  3. 考虑不同分辨率下的兼容性问题。

总结

OnmyojiAutoScript探索任务卡死问题揭示了自动化脚本开发中图像处理环节的重要性。通过增加基本的输入验证,可以有效提高脚本的稳定性。这个案例也提醒开发者,在使用第三方库(如OpenCV)时,应该充分了解其输入要求并做好防御性编程。

OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 OnmyojiAutoScript 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钱葵允

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值