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-l选项来指定不同的模型,并使用该--testdata-dir选项来指定包含模型文件的目录。您可以下载多个模型并将文件重命名为“eng_fast.traineddata”、“eng_best.traineddata”等。--psm参数可以防止您的方案不需要的页面分段。--psm 7可能是单一信息的最佳选择,但可以尝试不同的值并找到最有效的选择。-c tessedit_char_whitelist=\'1234567890\'。pytesseract是开始实现 Tesseract 的最佳方式,该库可以直接处理图像输入(尽管它在传递到 Tesseract 之前将图像保存到文件中)并使用image_to_string(...).
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)\nRun Code Online (Sandbox Code Playgroud)\n