Pytesseract,试图从屏幕上检测文本

时间:2018-01-05 17:04:08

标签: python numpy pytesser python-mss

我将MSS与pytesseract结合使用,尝试在屏幕上阅读,以确定受监控区域的字符串。我的代码如下:

import Image
import pytesseract
import cv2
import os
import mss
import numpy as np

with mss.mss() as sct:
    mon = {'top': 0, 'left': 0, 'width': 150, 'height': 150}

    im = sct.grab(mon)
    im = np.asarray(im)
    im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
    #im_gray = plt.imshow(im_gray, interpolation='nearest')

    cv2.imwrite("test.png", im_gray)
    #cur_dir = os.getcwd()
    text = pytesseract.image_to_string(Image.open(im_gray))
    print(text)

    cv2.imshow("Image", im)
    cv2.imshow("Output", im_gray)
    cv2.waitKey(0)

我收到以下错误:AttributeError:' numpy.ndarray'对象没有属性'读'

我还尝试使用pyplot将其转换回图像,如代码示例中的注释行所示。然而,它打印错误:TypeError:img不是一个numpy数组,也不是标量

我对Python有点新鲜(刚开始在周日开始涉足它)。但是,在我检测图像的其他尝试中,我已经相当成功了。但是,要达到我的最终目标,我需要能够在屏幕上阅读字符。它们将是相同的字体和相同的大小,因此我不必担心缩放问题,但暂时我试图通过将图像存储在内存中来了解它是如何工作的(没有从桌面上的回收站图标保存到文件),并尝试获取字符串"回收站"从图像。

更新 我想我可能会有一些突破,但如果我试着同时显示流,那就有一些问题。但是,我可以通过使用临时文件来快速处理流。

我的更新代码如下:

from PIL import Image
from PIL import ImageGrab
import pytesseract
import cv2
import os
import mss
import numpy as np
from matplotlib import pyplot as plt
import tempfile

png = tempfile.NamedTemporaryFile(mode="wb")

with mss.mss() as sct:
    #while True:
    mon = {'top': 0, 'left': 0, 'width': 150, 'height': 150}
    im = sct.grab(mon)
    im_array = np.asarray(im)
    #im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
    #with tempfile.NamedTemporaryFile(mode="wb") as png:
    png.write(im_array)
    im_name = png.name
    print(png.name)

    #cv2.imwrite("test.png", im_gray)
    #cur_dir = os.getcwd()
    #text = pytesseract.image_to_string(Image.open(im_name))
    #print(text)
    cv2.imshow("Image", im_array)
#cv2.imshow("Output", im_gray)
cv2.waitKey(0)

这当前吐出一个权限被拒绝错误,如下所示:

File "C:\Python\Python36-32\Lib\idlelib\ocr.py", line 27, in <module>
    text = pytesseract.image_to_string(Image.open(im_name))
  File "C:\Python\Python36-32\lib\site-packages\PIL\Image.py", line 2543, in open
    fp = builtins.open(filename, "rb")
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\JMCOLL~1\\AppData\\Local\\Temp\\tmp7_mwy2k9'

我怀疑这是正常的,我将在家中的笔记本电脑上尝试此更新。这可能是由于工作笔记本电脑的限制,我没有时间解决。

我很困惑为什么在没有while的情况下显示图像:循环工作正常,作为截图。但是,将它放入一段时间True:循环会导致窗口冻结。

1 个答案:

答案 0 :(得分:1)

我可以使用此代码:

import time

import cv2
import mss
import numpy
import pytesseract


mon = {'top': 0, 'left': 0, 'width': 150, 'height': 150}

with mss.mss() as sct:
    while True:
        im = numpy.asarray(sct.grab(mon))
        # im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)

        text = pytesseract.image_to_string(im)
        print(text)

        cv2.imshow('Image', im)

        # Press "q" to quit
        if cv2.waitKey(25) & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            break

        # One screenshot per second
        time.sleep(1)

睡眠时间可能是一个不会爆炸CPU的好事。