Python - 改进Tesseract OCR以识别名称列表

时间:2017-07-13 10:37:03

标签: python ocr tesseract

我正在开展一个项目,该项目将识别游戏中的团队(守望)并记录哪些玩家在哪个团队中。它有一个预定义的正在播放的列表,它只需要识别它们所在的图像。到目前为止,我已成功捕获每个团队的图像并获得每个玩家名称的粗略输出,但是,它会让几个字母混淆。

我的输入图片:

Team 1 image

Team 2 Image

我从OCR获得的输出:

W THEMIGHTVMRT
ERSVZENVRTTR
ERSVLUCID
ERSVZRRVR
ERSVMEI
EFISVSDMBRR

ERSV RNR
ERSVZENVRTTR
EFISVZHRVR
ERSVMCCREE
ERSVMEI
EHSVRDRDHDG

由此可以看出,OCR将“A”与“R”混淆,将“Y”与“V”混淆。我能够获取Overwatch使用的字体文件并使用Train Your Tesseract生成.traineddata文件 - 我知道可能有更好的方法来生成此文件,但我不确定如何。

我的代码:

    from pytesseract import *
    import pyscreenshot

    pytesseract.tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract'
    tessdata_dir_config = '--tessdata-dir "C:\\Program Files (x86)\\Tesseract-OCR\\tessdata"'

    team1 = pyscreenshot.grab(bbox=(50,450,530,810)) # X1, Y1, X2, Y2
    team1.save("team1screenshot.png")
    team1text = pytesseract.image_to_string(team1, config=tessdata_dir_config, lang='owf')

    team2 = pyscreenshot.grab(bbox=(800,450,1280,810)) # X1, Y1, X2, Y2
    team2.save("team2screenshot.png")
    team2text = pytesseract.image_to_string(team2, config=tessdata_dir_config, lang='owf')

    print(team1text)
    print("------------------")
    print(team2text)

我应该如何提高对这些角色的认可?我是否需要更好的.traineddata文件,还是需要更好的图像处理?

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

正如@FlorianBrucker所提到的,对字符串进行相似性测试允许(通过一些微调)在OCR级别之后找到正确字符串的能力。

答案 1 :(得分:0)

您可以尝试自定义 OCR 配置来进行稀疏文本搜索,“尽可能多地查找文本,没有特定的顺序。”

在 tesseract 配置中将 psm 设置为 11

看看你能不能做到:

tessdata_dir_config = "--oem 3 --psm 11"

要查看支持的页面分割模式 (psm) 的完整列表,请使用 tesseract -h。这是截至 3.21 的列表:

  1. 仅限方向和脚本检测 (OSD)。
  2. 使用 OSD 自动进行页面分割。
  3. 自动页面分割,但没有 OSD 或 OCR。
  4. 全自动页面分割,但没有 OSD。 (默认)
  5. 假设有一列大小可变的文本。
  6. 假设有一个统一的垂直对齐文本块。
  7. 假设有一个统一的文本块。
  8. 将图像视为单个文本行。
  9. 将图像视为一个词。
  10. 将图像视为圆圈中的单个单词。
  11. 将图像视为单个字符。
  12. 稀疏文本。尽可能多地查找无特定顺序的文本。
  13. 带有 OSD 的稀疏文本。
  14. 原始线。将图像视为单个文本行,绕过 Tesseract 特定的黑客攻击。

我正在为 Tesseract https://github.com/madmaze/pytesseract 使用 python 包装器

这里你可以将tesseract配置为:

custom_oem_psm_config = r'--oem 3 --psm 6'
pytesseract.image_to_string(image, config=custom_oem_psm_config)