You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pytesseract识别速度过慢优化:读取MS Teams文本实现键盘自动化

优化方案

1 Tesseract配置优化(改完即可明显提速)

  • 将Tesseract路径初始化移到全局位置,无需放在函数内部重复加载
  • 替换德语训练数据:下载tessdata_fast版本的deu.traineddata,替换原有tessdata目录下的对应文件,体积更小速度更快,你的场景下精度完全够用
  • 调整OCR参数,新增字符白名单、更匹配场景的psm模式、关闭不必要的计算逻辑:
# 新的config参数
config='--psm 7 --oem 3 -c tessedit_char_whitelist=abcdefghijklmnopqrstuvwxyzäöüß -c tessedit_do_invert=0'

说明:--psm 7指定图像为单行文本,比你当前使用的--psm 6速度更快;白名单限定只识别你需要的小写德语字符,跳过无关字符识别;关闭自动反转逻辑减少额外计算。

2 图像预处理优化

  • 缩小截图范围:确认你的bbox参数刚好框住要识别的Teams文本区域,多余的边框、空白都切掉,待处理像素越少识别速度越快
  • 新增二值化处理:灰度图转换后加阈值处理转成纯黑白图像,去掉杂色,大幅降低Tesseract识别难度:
grayCap = cv2.cvtColor(np.array(cap), cv2.COLOR_BGR2GRAY)
# 新增二值化代码,阈值可以根据你的屏幕亮度调整
_, binaryCap = cv2.threshold(grayCap, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
  • 新增帧差异判断:每次截图后和上一帧的截图做像素对比,如果差异小于阈值说明文本没有变化,直接跳过OCR复用之前的识别结果,大部分场景下可以省掉90%以上的OCR调用。

3 代码逻辑优化

  • OCR线程的死循环里加time.sleep(0.2),不需要无间隔截图识别,0.2秒的间隔完全满足你的操作响应需求,还能降低CPU占用
  • 可选优化:不要用全局变量传值,换成queue队列传递识别结果,避免线程读写冲突,属于稳定性优化不影响速度。

优化后的imToString参考代码

# 全局初始化Tesseract路径,不要放在循环里
pytesseract.pytesseract.tesseract_cmd ='C:\\Users\\gornicec\\AppData\\Local\\Programs\\Tesseract-OCR\\tesseract.exe'
last_cap = None

def imToString():
    global message, last_cap
    print("Image getting read")
    while(True):
        cap = ImageGrab.grab(bbox=(177, 850, 283, 881))   
        grayCap = cv2.cvtColor(np.array(cap), cv2.COLOR_BGR2GRAY)
        _, binaryCap = cv2.threshold(grayCap, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

        # 帧差异判断,和上一帧对比,差异小就跳过OCR
        if last_cap is not None:
            diff = cv2.absdiff(last_cap, binaryCap).mean()
            if diff < 2: # 阈值可以自己调整
                time.sleep(0.2)
                continue
        last_cap = binaryCap

        t = time.perf_counter()
        message = pytesseract.image_to_string(
                binaryCap,
                lang ='deu',config='--psm 7 --oem 3 -c tessedit_char_whitelist=abcdefghijklmnopqrstuvwxyzäöüß -c tessedit_do_invert=0')
   
        print(str(message) + "was read" + str(time.perf_counter() - t))
        time.sleep(0.2)

4 替代方案(速度更快,可稳定控制在200ms以内)

如果上面的优化还达不到要求,可以直接换更适配场景的方案:

  • 用Windows自带OCR:调用WinRT的Windows.Media.Ocr接口,系统级OCR对本地语言的识别速度比Tesseract快5~10倍,只要你系统装了德语语言包,1000像素的截图基本100ms以内出结果
  • 模板匹配:你需要识别的只有固定5个单词(vorne、hinten、links、rechts、greif),完全不用通用OCR,提前截取每个单词的图像做模板,每次截图后用cv2.matchTemplate匹配即可,速度在毫秒级,完全不会超过2秒,是当前场景的最优解
  • 轻量OCR模型:用PaddleOCR的轻量多语言模型,识别速度也远高于Tesseract,部署也很简单。

内容的提问来源于stack exchange,提问作者Marvin Gornicec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 10:51:01