如何提升Python中游戏字符图像识别的运行速度?
优化游戏字符图像识别速度的方案
你的核心问题是重复调用locateOnScreen导致多次截图与重复计算——每个字符都单独触发一次屏幕捕获和模板匹配,7个字符就会重复7次相同区域的截图操作,这是速度瓶颈的关键。下面是几个直接有效的优化方法:
1. 单次截图复用,避免重复捕获屏幕
先一次性截取目标区域的图像,再在这张截图上循环匹配所有字符模板,彻底减少屏幕捕获的开销(屏幕捕获是耗时操作)。
修改后的代码:
import pyautogui name = ["char1", "char2","char3","char4","char5","char6","char7"] # 预加载所有字符模板,避免每次循环都重新读取图片 templates = [pyautogui.loadImage(f"{name}.png") for name in name] while True: # 只截图一次目标区域 screen = pyautogui.screenshot(region=(0,40,500,130)) found = False for idx, template in enumerate(templates): # 在已截取的屏幕图像上匹配模板 if pyautogui.locate(template, screen, grayscale=True, confidence=0.6) is not None: print(name[idx]) found = True # 如果只需要识别第一个出现的字符,可直接break跳出循环减少计算 # break if not found: print(" ")
2. 改用OpenCV直接处理,提升匹配效率
PyAutoGUI的模板匹配底层依赖OpenCV,直接调用OpenCV的API可以更灵活地优化,比如选择更快的匹配算法,速度会比PyAutoGUI的封装更快。
示例代码:
import cv2 import numpy as np import pyautogui name = ["char1", "char2","char3","char4","char5","char6","char7"] # 预加载模板并转为灰度图 templates = [] for name in name: img = cv2.imread(f"{name}.png", cv2.IMREAD_GRAYSCALE) templates.append((name, img)) while True: # 截取目标区域并转为灰度图 screen = pyautogui.screenshot(region=(0,40,500,130)) screen_gray = cv2.cvtColor(np.array(screen), cv2.COLOR_RGB2GRAY) found = False for name, template in templates: # 使用TM_CCOEFF_NORMED算法,速度与精度平衡 res = cv2.matchTemplate(screen_gray, template, cv2.TM_CCOEFF_NORMED) threshold = 0.6 loc = np.where(res >= threshold) if len(loc[0]) > 0: print(name) found = True # 找到即跳出循环,减少不必要计算 # break if not found: print(" ")
3. 其他细节优化
- 预加载模板:提前加载所有字符模板,不要在循环里重复读取图片文件,减少磁盘IO开销。
- 减少输出频率:原代码每次循环都打印空行,改为只有未识别到字符时再打印,减少控制台IO耗时。
- 调高匹配阈值:如果字符特征明显,适当提高
confidence(或OpenCV的threshold),减少无效匹配的计算量。 - 缩小匹配范围:如果字符出现的位置有固定分区,把大区域拆分成小区域,针对性匹配对应区域的字符,减少匹配的像素范围。
内容的提问来源于stack exchange,提问作者protocolHost
相关产品推荐
相关产品推荐

