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的模板匹配功能上,具体是在图像处理模块的模板匹配过程中出现了断言失败。
根本原因分析
经过深入排查,发现问题的根本原因在于:
-
图像匹配机制缺陷:当脚本连续两次捕获到完全相同的游戏画面时,第二次进行匹配的模板图像会出现宽度为零的非法输入情况。
-
缺乏输入验证:在调用OpenCV的模板匹配函数(cv2.matchTemplate)前,代码没有对输入图像的尺寸进行有效性验证,导致程序遇到非法输入时直接卡死。
-
分辨率相关性:在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)
该解决方案的核心改进点包括:
-
增加输入验证:在调用模板匹配前,先检查模板图像的尺寸是否有效。
-
优雅处理异常:当检测到无效输入时,记录错误日志并返回True,避免程序崩溃。
-
保持原有逻辑:在正常情况下,继续原有的模板匹配流程。
实施建议
对于需要手动应用此修复的用户,建议:
-
修改文件路径:"./OnmyojiAutoScript-easy-install/module/atom/image.py"约150行处。
-
关闭自动更新:在config目录下的deploy.yaml文件中,将KeepLocalChanges的值设置为true,以防止修复被自动更新覆盖。
技术思考
虽然这个解决方案能够有效解决问题,但从软件工程角度看,这只是一个临时性的修复。更完善的解决方案应该考虑:
-
在更高层次上避免连续获取相同截图的情况。
-
建立更健壮的图像处理异常处理机制。
-
考虑不同分辨率下的兼容性问题。
总结
OnmyojiAutoScript探索任务卡死问题揭示了自动化脚本开发中图像处理环节的重要性。通过增加基本的输入验证,可以有效提高脚本的稳定性。这个案例也提醒开发者,在使用第三方库(如OpenCV)时,应该充分了解其输入要求并做好防御性编程。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考