如何优化pytesseract+OpenCV图像文本提取速度适配高时效需求
基于pytesseract+OpenCV的OCR耗时优化方案
现有流程的最大冗余开销是磁盘IO操作,截图存盘再读取的步骤完全可以砍掉,所有操作都在内存中完成即可,配合参数优化可以大幅降低耗时,具体优化方案如下:
- 砍掉磁盘IO流程,直接在内存中传递图像数据
不管你用哪种截图工具(PIL、mss、pyautogui等),截图结果直接在内存中转成OpenCV可识别的格式,不需要写入磁盘生成temp_chit.png再用cv2.imread读取,仅这一步就能节省30%以上的整体耗时。 - 固定Tesseract识别参数,减少无效计算
调用image_to_string时指定固定参数,避免Tesseract做多余的布局分析、全语言包加载操作:- 用
lang参数仅加载你需要的语言包,比如仅识别简体中文就填lang='chi_sim',不要加载全量语言 - 用
config参数指定--psm布局模式,比如识别固定区域的块状文本用--psm 6,识别单行文本用--psm 7,同时指定--oem 3用默认引擎组合,避免动态适配开销
- 用
- 初始化逻辑前置
把tesseract_cmd路径配置、识别参数定义放到程序初始化阶段执行,不要每次识别都重复配置,减少重复初始化开销。 - 简化不必要的预处理操作
如果你的截图清晰度足够,不需要额外做二值化、降噪等OpenCV预处理操作,可以直接把内存中的截图对象传给pytesseract,省去格式转换开销。
优化后示例代码
import pytesseract import cv2 import numpy as np from PIL import ImageGrab from timeit import default_timer as timer # 程序初始化阶段执行,仅跑一次 pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # 固定识别参数,根据你的业务场景调整psm和lang即可 OCR_CONFIG = '--psm 6 --oem 3' OCR_LANG = 'chi_sim' # 仅识别英文就改成'eng' start = timer() # 直接截指定区域屏幕到内存,无需存盘,bbox填你要识别的区域坐标 pil_screenshot = ImageGrab.grab(bbox=(100, 100, 800, 400)) # 内存中转成OpenCV格式,无磁盘操作 cv_img = cv2.cvtColor(np.array(pil_screenshot), cv2.COLOR_RGB2BGR) # 识别文本 text = pytesseract.image_to_string(cv_img, lang=OCR_LANG, config=OCR_CONFIG) print(text) end = timer() print(f"耗时:{end - start}s")
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

