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
相关产品推荐
相关产品推荐

