当前位置:首页 > 行业动态 > 正文

按键通过文字识别暂停脚本

当指定按键触发时,脚本通过OCR识别屏幕文字,匹配预设内容后

环境准备

  1. 依赖库安装

    • pyautogui:用于模拟键盘/鼠标操作
    • pillow:图像处理
    • pytesseract:OCR文字识别
    • tesseract-ocr:底层OCR引擎
    pip install pyautogui pillow pytesseract
    # Windows需手动安装Tesseract并配置环境变量
  2. Tesseract配置

    • 路径配置(仅Windows):
      下载Tesseract安装包并配置系统环境变量,或在代码中指定路径:

      import pytesseract
      pytesseract.pytesseract.tesseract_cmd = r'C:Program FilesTesseract-OCRtesseract.exe'

文字识别与暂停逻辑

  1. 核心流程

    • 截图:捕获屏幕图像
    • OCR识别:提取图像中的文字
    • 关键词匹配:判断是否包含预设的暂停关键词(如“暂停”“停止”)
    • 触发暂停:匹配成功时暂停脚本执行
  2. 代码示例

    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:如何提高文字识别的准确率?

解答

  1. 图像预处理:对截图进行灰度化、二值化、降噪等操作,突出文字轮廓。
    image = image.point(lambda x: 255 if x > 128 else 0, "1")  # 二值化
  2. 限定识别区域:仅截取包含目标文字的屏幕区域(如固定坐标或动态定位)。
  3. 配置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)
0