Pytesseract,试图从屏幕上检测文本
Pytesseract, trying to detect text from on screen
我将 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' object has no attribute 'read'
我还尝试使用 pyplot 将其转换回图像,如代码示例中的注释行所示。然而打印回错误:TypeError: img is not a numpy array, neither a scalar
我对 Python 有点陌生(周日才开始涉足)。但是,我在检测图像方面的其他尝试都相当成功。但是,为了达到我的最终目标,我需要能够阅读屏幕上的字符。它们将具有相同的字体和相同的大小,始终如一,所以我不必担心缩放问题,但暂时我试图通过将图像存储在内存中(不保存到文件)来了解它是如何工作的从桌面上的回收站图标,并尝试从图像中获取字符串 "Recycle Bin"。
更新
我想我可能有一些突破,但如果我试图同时显示流,就会出现一些问题。但是,我可以通过使用临时文件足够快地处理流。
我更新后的代码如下:
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)
这个目前吐出一个permission is denied错误,如下:
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: 循环的情况下显示图像可以正常工作,作为屏幕截图。但是,将其放入 while True: 循环会导致 window 冻结。
我可以让这段代码工作:
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 爆炸。
我将 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' object has no attribute 'read'
我还尝试使用 pyplot 将其转换回图像,如代码示例中的注释行所示。然而打印回错误:TypeError: img is not a numpy array, neither a scalar
我对 Python 有点陌生(周日才开始涉足)。但是,我在检测图像方面的其他尝试都相当成功。但是,为了达到我的最终目标,我需要能够阅读屏幕上的字符。它们将具有相同的字体和相同的大小,始终如一,所以我不必担心缩放问题,但暂时我试图通过将图像存储在内存中(不保存到文件)来了解它是如何工作的从桌面上的回收站图标,并尝试从图像中获取字符串 "Recycle Bin"。
更新 我想我可能有一些突破,但如果我试图同时显示流,就会出现一些问题。但是,我可以通过使用临时文件足够快地处理流。
我更新后的代码如下:
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)
这个目前吐出一个permission is denied错误,如下:
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: 循环的情况下显示图像可以正常工作,作为屏幕截图。但是,将其放入 while True: 循环会导致 window 冻结。
我可以让这段代码工作:
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 爆炸。