【问题标题】:Python text extraction from a video game screenshot从视频游戏截图中提取 Python 文本
【发布时间】:2021-05-04 20:55:04
【问题描述】:

我正在使用 discord.py 为视频游戏暗黑破坏神 2 构建一个不和谐机器人。其中一项功能需要机器人从暗黑破坏神 2 屏幕截图中提取项目的名称和属性。我目前正在为此使用 pytesseract,但我没有得到足够的结果。

示例截图:

我裁剪了项目的一部分(代码需要稍后自动执行此操作)并在预处理后得到它(参见下面的代码):

那是对手动裁剪的图像进行预处理和提取的代码:

def grayscale(image):
    return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

def threshold(image):
    return cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

def dilate(image):
    kernel = np.ones((5,5),np.uint8)
    return cv2.dilate(image, kernel, iterations = 1)

image = cv2.imread('item.png')

scale = 10 
w = int(image.shape[1] * scale)
h = int(image.shape[0] * scale)
dim = (w, h)
image = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)

image = grayscale(image)
image = threshold(image)
image = dilate(image)

custom_config = r'--oem 3 --psm 6 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ%+'
print(pytesseract.image_to_string(image, config=custom_config))

它给了我这些结果:

s灵性

病房

ITamLavar66 搜索

Daryusa4if Oe

有机会获得 BLece7a%

耐用性 Blep5

要求强度76

拉吉娜DLavat66

6%CHANCETSCASTLEVEL8FADEWHENSTRUCE

926%PFASTERBLeckRATE

增加 29% 的 BLeckiING2 机会

失去 t142%PNHANCEDDEFENSE a ALLRESISTANCES93i

哎呀眼科

ETHEREACANTBEREPAIRED

而且我不确定如何继续获得更好的结果。 OCR 的字体和分辨率肯定很难(您可以在结果中看到 OCR 尤其是 5 和 6 存在问题)。以下是有关该问题的一些进一步指示:

  • 我确实有暗黑破坏神 2 字体 (Exocet),所以我可以训练自己的模型 (?)
  • 我确实有所有可能的项目和属性的列表,以进一步将结果列入白名单(但是,我需要我的机器人功能的确切数字)
  • 我还尝试了另一个库 (keras-ocr),但没有得到更好的结果

【问题讨论】:

    标签: python opencv ocr screenshot python-tesseract


    【解决方案1】:

    我有一个稍微改进的解决方案


      1. 调整图片大小,让每个字符都清晰可见
      1. 逐行处理

    Preprocessed Tesseract output
    oo : SPIRIT WARD © (
    _WARD '
    Irem LeveL: 88
    DeFEeNs@: 41°
    CHANCe Te@ BLeck: “73%
    DURABILITY: 51 @F 61
    RE@UIRED STRENGTH: 176
    ReouireD LeveL: 68 )
    6% CHANCE T® CAST LEVEL 8 FADE WHEN STRUCK.
    926% FasTER BLOCK RATE
    29% INCREASED CHANCE @F BLOCKING
    8h462% ENHANCED) DEFENSE ON
    ALL RESISTANCES @3h
    9 COLD ABSORE
    ETHEREAL [CANN@T BE REPAIRED)

    比较

    Current result OP's result
    oo : SPIRIT WARD © ( sSPIRITWARD
    _WARD ' WARD
    Irem LeveL: 88 ITamLavar66 Se a
    DeFEeNs@: 41° Daryusa4if Oe
    CHANCe Te@ BLeck: “73% CHANCE Te BLece7a%
    DURABILITY: 51 @F 61 DURABILITY Blep5
    RE@UIRED STRENGTH: 176 REQUIREDSTRENGTHI76
    ReouireD LeveL: 68 ) RaguinaDLavat66
    6% CHANCE T® CAST LEVEL 8 FADE WHEN STRUCK. 6%CHANCETSCASTLEVEL8FADEWHENSTRUCE
    926% FasTER BLOCK RATE 926%PFASTERBLeckRATE
    29% INCREASED CHANCE @F BLOCKING 29%IMCREASEDCHANCEOFBLeckiING2
    8h462% ENHANCED) DEFENSE ON Los t142%PNHANCEDDEFENSE a ALLRESISTANCES93i
    ALL RESISTANCES @3h Ay eYCeGlLOABSERE
    9 COLD ABSORE ?
    ETHEREAL [CANN@T BE REPAIRED) ETHEREALCANNTBEREPAIRED

    我在处理上做了些许改动。

    代码:


    import cv2
    import pytesseract
    
    img = cv2.imread("YKEyQ.png")
    (h, w) = img.shape[:2]
    img = cv2.resize(img, (w*3, h*3))
    gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    (h, w) = gry.shape[:2]
    
    s_idx = 0
    e_idx = int(h/15)
    
    for i, _ in enumerate(range(0, 15)):
        gry_crp = gry[s_idx:e_idx, 0:w]
        thr = cv2.threshold(gry_crp, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
        thr = cv2.dilate(thr, None, iterations=1)
        cv2.imwrite("/Users/ahx/Desktop/res{}.png".format(i), thr)
        txt = pytesseract.image_to_string(thr, config="--psm 6")
        print(txt)
        s_idx = e_idx
        e_idx = s_idx + int(h/15)
        cv2.imshow("thr", thr)
        cv2.waitKey(0)
    

    【讨论】:

      猜你喜欢
      • 2020-11-12
      • 2018-10-14
      • 1970-01-01
      • 2022-12-12
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多