我正在为视频游戏创建机器人,我必须阅读屏幕上显示的一些信息。鉴于信息始终在同一位置,因此我可以截取屏幕截图并将图片裁剪到正确的位置。
90%的时间,识别将是完美的,但有时它会返回看起来完全随机的东西(请参见下面的示例)。
我尝试将图片转换为黑白没有成功,并尝试更改pytesseract配置(config = ("-l fra --oem 1 --psm 6"))
def readScreenPart(x,y,w,h):
monitor = {"top": y, "left": x, "width": w, "height": h}
output = "monitor.png"
with mss.mss() as sct:
sct_img = sct.grab(monitor)
mss.tools.to_png(sct_img.rgb, sct_img.size, output=output)
img = cv2.imread("monitor.png")
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imwrite("result.png", img)
config = ("-l fra --oem 1 --psm 6")
return pytesseract.image_to_string(img,config=config)
示例:此图片生成错误,它返回字符串“ IRPMV / LEIILK”
另一张图片
现在我不知道问题的出处,因为它不仅是一个错误的字符,而且是一个完全随机的结果。
感谢您的帮助
答案 0 :(得分:1)
预处理是将图像投入Pytesseract的重要步骤。通常,您希望将所需的文本设为黑色,将背景设为白色。当前,您的前景文本为绿色而不是白色。这是修复格式的简单过程
原始图片
大津的门槛
反转图像
Pytesseract的输出
122活力
其他图片
200点生命力
在反转图像之前,最好执行morphological operations来平滑/过滤文本。但是对于您的图像,文本不需要额外的平滑处理
import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
image = cv2.imread('3.png',0)
thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
result = 255 - thresh
data = pytesseract.image_to_string(result, lang='eng',config='--psm 6')
print(data)
cv2.imshow('thresh', thresh)
cv2.imshow('result', result)
cv2.waitKey()
答案 1 :(得分:0)
正如评论所说,这与您的文字和背景颜色有关。 Tesseract对于深色背景上的浅色文本基本上是没有用的,这是我在将其提供给tesseract之前适用于任何文本图像的几行内容:
# convert color image to grayscale
grayscale_image = cv2.cvtColor(your_image, cv2.COLOR_BGR2GRAY)
# Otsu Tresholding method find perfect treshold, return an image with only black and white pixels
_, binary_image = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
# we just don't know if the text is in black and background in white or vice-versa
# so we count how many black pixels and white pixels there are
count_white = numpy.sum(binary > 0)
count_black = numpy.sum(binary == 0)
# if there are more black pixels than whites, then it's the background that is black so we invert the image's color
if count_black > count_white:
binary_image = 255 - binary_image
black_text_white_background_image = binary_image
现在,无论原始颜色是哪种颜色,您都可以肯定在白色背景上有黑色文字,如果字符高度为35像素,Tesseract也是(最奇怪的)最有效的方法,较大的字符不会显着降低精度,但短一些像素会使tesseract失去作用!