从视频游戏截图中尽可能多地找到文本的最佳方法是什么?

Rom*_*her 14 python ocr automated-tests tesseract ui-automation

我正在尝试使用tesseract ocr工具从视频游戏中提取ocr文本(我正在预处理屏幕截图并将它们传递给命令行工具tsv输出并解析它).

我想将它用于测试自动化,与硒网测试不同.那是我希望能够等待元素出现而不是睡觉和点击按钮(主要是菜单).

为了能够做到这一点,我需要能够始终如一地找到相同的按钮文本,并在一系列视频游戏中找到尽可能多的文本.为了抽象,我更喜欢每个游戏的预处理/ tesseract选项是相同的.

我可以添加每个游戏中遇到的每个单词的字典,但我不愿意.

我有一个设置,我可以测试预处理/ tesseract选项的许多不同组合,并查看结果的单词.

我已经尝试将屏幕截图(70-90 dpi)吹了5次,并在将其传递给tesarect之前将其设置为灰度.

我可以使用哪些其他技术来提高结果的数量和准确性?我应该看哪些tesseract旋钮?我可以添加任何其他有用的预处理吗?

PS我发现,如果我将图片放大到两倍长/宽,tesseract似乎因为图像的内存耗尽而爆炸.有静态限制吗?我可以找到它,所以我可以炸掉最大尺寸附近的图像吗?我可以调整吗?

mni*_*tic 9

训练自己的tessdata

这是迄今为止我从tesseract经验中学到的最重要的一课。开箱即用的tesseract在识别扫描的书和报纸文本方面确实非常有效,但是当您尝试使用与标准书和报纸字体(例如Times New Roman)不一样的字体时,我的体验准确性会大大降低。培训过去要困难得多,但如今tesstrain.sh使它变得束手无策。您将必须收集视频游戏字体(或至少看起来与它们相似的字体),并将其作为训练脚本的输入。即使您的字体差别很大,tesseract也将能够在运行时以惊人的精度为所提供的图像选择正确的字体。同样,我知道这很乏味,但是将视频游戏中遇到的所有单词的单词列表提供给训练脚本将是有益的。使用您自己的字体和您的单词列表来训练tesseract,可以使您获得几乎完美的准确性,而无需执行其他任何操作。

预处理图像以识别

不要依赖tesseract的布局分析

如果可以,请进行自己的布局分析,然后将图像裁剪为包含文本的部分。Teseract具有内置的页面细分引擎,但它必须涵盖如此广泛的用例,因此很可能无法满足您的特定需求。另外,根据我的经验,如果将图像分成单行文本并使用分段模式7(将图像作为单行文本处理),则可以进一步提高准确性。

提高输入文字的x高度

如果将输入文本的x高度增加到训练tesseract所用的高度(IIRC在我的情况下为70像素),则将有帮助。

提高输入文字的DPI

Tesseract 非常喜欢300 DPI。请注意,更改图像的DPI与更改图像的大小不同。(例如,对于ImageMagick,您可以使用-density选项更改图像的DPI)。

使用的Tesseract配置变量

以我的经验,调整与匹配的词典单词有关的不同“惩罚”设置对提高准确性影响最大。对我有用的设置:

language_model_penalty_non_dict_word      0.975
language_model_penalty_non_freq_dict_word 0.575
segment_penalty_dict_case_bad             1.3125
segment_penalty_dict_case_ok              1.1
segment_penalty_dict_nonword              10.25
Run Code Online (Sandbox Code Playgroud)

但是显然您应该自己进行调整。另外,我发现x高度设置在运行时非常有用:textord_min_xheightmin_sane_x_ht_pixels


我不知道tesseract的任何内存大小限制。您是否可能通过有其自身局限性的包装使用tesseract?


注意:此答案是假设您使用的是tesseract的最新稳定版本,即tesseract 3.05。如果您使用的是tesseract 4.0,则仍然可以进行自己的培训和细分,但是答案的其他部分可能是OBE。