python中的实时OCR

Pet*_*ter 8 python ocr image image-recognition python-tesseract

问题

我试图用 OpenCV 捕获我的桌面并让 Tesseract OCR 查找文本并将其设置为变量,例如,如果我要玩游戏并且捕获帧超过资源量,我希望它打印并使用它。一个完美的例子是Micheal Reeves 的视频 ,每当他在游戏中失去健康时,它就会显示它并将其发送到他的蓝牙气枪来射击他。到目前为止,我有这个:

# imports
from PIL import ImageGrab
from PIL import Image
import numpy as np
import pytesseract
import argparse
import cv2
import os

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter("output.avi", fourcc, 5.0, (1366, 768))

while(True):
        x = 760
        y = 968

        ox = 50
        oy = 22

        # screen capture
        img = ImageGrab.grab(bbox=(x, y, x + ox, y + oy))
        img_np = np.array(img)
        frame = cv2.cvtColor(img_np, cv2.COLOR_BGR2RGB)
        cv2.imshow("Screen", frame)
        out.write(frame)

        if cv2.waitKey(1) == 0:
                break

out.release()
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

它实时捕获并将其显示在窗口中,但我不知道如何使其每帧识别文本并输出它。

有什么帮助吗?

小智 2

Tesseract 是一个使用文件进行输入和输出的一次性命令行应用程序,这意味着每个 OCR 调用都会创建一个新进程并初始化一个新的 Tesseract 引擎,其中包括从磁盘读取数兆字节的数据文件。其作为实时 OCR 引擎的适用性将取决于确切的用例\xe2\x80\x94更多像素需要更多时间\xe2\x80\x94以及提供哪些参数来调整 OCR 引擎。最终可能需要进行一些实验来将引擎调整到准确的场景,但也预计一帧的 OCR 所需的时间可能会超过帧时间,并且可能需要降低 OCR 执行的频率,即以 10- 执行 OCR游戏运行时的帧速率可能为 20 FPS,而不是 60+ FPS。

\n

根据我的经验,在老化的 CPU 上使用 4 核(默认)的英语快速模型,2200x1700px 图像中相当复杂的文档可能需要 0.5 秒到 2 秒的时间,但是这个“复杂文档​​”代表了最坏的情况,并且对正在识别的文本的结构不做任何假设。对于许多场景,例如从游戏屏幕中提取数据,可以进行一些假设来实现一些优化并加快 OCR 速度:

\n
    \n
  • 减小输入图像的尺寸。从屏幕中提取特定信息时,尽可能将抓取的屏幕图像裁剪为仅显示该信息。如果您尝试提取健康值等值,请围绕健康值裁剪图像。
  • \n
  • 使用“快速”训练的模型以牺牲准确性为代价来提高速度。您可以使用该-l选项来指定不同的模型,并使用该--testdata-dir选项来指定包含模型文件的目录。您可以下载多个模型并将文件重命名为“eng_fast.traineddata”、“eng_best.traineddata”等。
  • \n
  • 使用该--psm参数可以防止您的方案不需要的页面分段。--psm 7可能是单一信息的最佳选择,但可以尝试不同的值并找到最有效的选择。
  • \n
  • 如果您知道将使用哪些字符(例如您只想查找数字),请通过更改白名单配置值来限制允许的字符集:-c tessedit_char_whitelist=\'1234567890\'
  • \n
\n

pytesseract是开始实现 Tesseract 的最佳方式,该库可以直接处理图像输入(尽管它在传递到 Tesseract 之前将图像保存到文件中)并使用image_to_string(...).

\n
import pytesseract\n\n# Capture frame...\n\n# If the frame requires cropping:\nframe = frame[y:y + h, x:x + w] \n\n# Perform OCR\ntext = pytesseract.image_to_string(frame, lang="eng_fast" config="--psm 7")\n\n# Process the result\nhealth = int(text)\n
Run Code Online (Sandbox Code Playgroud)\n