上一篇
按键通过文字识别暂停脚本
- 行业动态
- 2025-05-14
- 2
当指定按键触发时,脚本通过OCR识别屏幕文字,匹配预设内容后
环境准备
依赖库安装
pyautogui
:用于模拟键盘/鼠标操作pillow
:图像处理pytesseract
:OCR文字识别tesseract-ocr
:底层OCR引擎
pip install pyautogui pillow pytesseract # Windows需手动安装Tesseract并配置环境变量
Tesseract配置
- 路径配置(仅Windows):
下载Tesseract安装包并配置系统环境变量,或在代码中指定路径:import pytesseract pytesseract.pytesseract.tesseract_cmd = r'C:Program FilesTesseract-OCRtesseract.exe'
- 路径配置(仅Windows):
文字识别与暂停逻辑
核心流程
- 截图:捕获屏幕图像
- OCR识别:提取图像中的文字
- 关键词匹配:判断是否包含预设的暂停关键词(如“暂停”“停止”)
- 触发暂停:匹配成功时暂停脚本执行
代码示例
import pyautogui import pytesseract from PIL import Image import time def check_pause(keyword="暂停", confidence=0.8): # 截取全屏 screenshot = pyautogui.screenshot() # 转为灰度图(提升OCR准确率) image = screenshot.convert("L") # OCR识别(简体中文) text = pytesseract.image_to_string(image, lang="chi_sim", config=f"--psm 6 --oem 3 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") # 检查关键词 if keyword in text: print(f"检测到关键词 '{keyword}',暂停脚本") return True return False # 主循环 while True: if check_pause(): # 暂停逻辑(可自定义) input("按回车键继续...") # 等待用户输入 else: # 执行其他操作 print("脚本继续运行") time.sleep(2) # 避免频繁检测
关键参数与优化
参数/方法 | 说明 |
---|---|
lang="chi_sim" | 指定简体中文语言包(需下载对应训练数据) |
--psm 6 | 页面布局模式(6=单行文本,7=单列文本,可根据目标文字位置调整) |
confidence | 置信度阈值(部分OCR引擎支持,如pytesseract.image_to_data() ) |
图像预处理 | 灰度化、二值化、降噪(提升文字识别准确率) |
多线程/异步检测 | 避免阻塞主线程(适用于实时性要求高的场景) |
常见问题与解决方案
问题 | 解决方案 |
---|---|
识别率低 | 调整图像预处理(如二值化、膨胀腐蚀) 限定识别区域(减少干扰) 使用白名单( tessedit_char_whitelist ) |
性能不足 | 降低检测频率(如time.sleep(1) )缩小截图范围 使用多线程/异步IO |
多语言混合文本 | 分段识别不同语言区域 使用 lang 参数指定混合语言(如eng+chi_sim ) |
相关问题与解答
问题1:如何提高文字识别的准确率?
解答:
- 图像预处理:对截图进行灰度化、二值化、降噪等操作,突出文字轮廓。
image = image.point(lambda x: 255 if x > 128 else 0, "1") # 二值化
- 限定识别区域:仅截取包含目标文字的屏幕区域(如固定坐标或动态定位)。
- 配置Tesseract参数:启用字符白名单、调整PSM模式或使用自定义训练数据。
config = "--psm 7 --oem 3 -c tessedit_char_whitelist=暂停启动" text = pytesseract.image_to_string(image, config=config)
问题2:如何在不阻塞主线程的情况下实时检测文字?
解答:
使用多线程或异步IO实现后台检测:
import threading def monitor_pause(): while True: if check_pause(): # 触发暂停逻辑(如发送信号给主线程) print("暂停信号已发送") time.sleep(1) # 启动后台线程 thread = threading.Thread(target=monitor_pause, daemon=True) thread.start() # 主线程继续执行其他任务 while True: print("主线程任务运行中...") time.sleep(2)