简介:本文系统讲解自动化脚本中文字识别的完整流程:从为何需要OCR、字库的原理,到截图预处理、二值化、点阵提取与字符含义绑定,再到多字符字库构建与识别验证。读者可掌握一套可复用的字库制作方法论,并能将其应用于终端数字识别、界面信息提取等场景。
在自动化脚本开发中,最常用的两类定位手段是找图与找色。它们实现简单、执行高效,在界面稳定、目标固定的场景下表现良好。然而,一旦面对动态内容,这两类方法就会迅速失效:
这正是光学字符识别(OCR) 要解决的问题。在自动化脚本语境下,OCR 的目标不是做通用文档识别,而是在一个受控的、小范围的屏幕区域内,把像素图案稳定地映射为字符含义。为此,业界常见的技术方案会引入“字库”这一中间层——它相当于一本字典,让脚本有据可依,从而把“图案”翻译成“文字”。
本文将以“识别终端中的数字”为目标,完整走一遍字库构建与识别验证的流程。为避免依赖任何特定厂商工具,下文统一使用“自动化脚本工具”“OCR 辅助工具”“字库”等中立表述,方法本身可迁移到任意具备 OCR 能力的运行环境中。
字库(Dictionary / Font Library)在自动化 OCR 中并不是操作系统里的字体文件,而是一份“像素点阵 → 字符含义”的映射表。它的基本结构可以抽象为:
{"点阵特征A": "1","点阵特征B": "2",..."点阵特征J": "0"}
识别时,OCR 引擎会先对目标区域做二值化处理,把彩色图像变成黑白点阵,再对每个字符区域提取点阵特征,最后在字库中查找最匹配的条目,返回对应的字符含义。
由此可以推导出三个关键结论:
理解了这一点,后续所有操作都有了明确的判断标准:每一步都是在为“点阵特征稳定且可区分”服务。
在开始制作字库前,需要确认以下前提:
提示:不同版本的 OCR 插件在接口命名、参数上可能不同。本文只描述通用流程,具体调用方式请以所用环境的官方文档为准。
打开 OCR 辅助工具,新建一个字库文件,例如命名为 test.txt。这个文件将用于存储后续所有“点阵—字符”映射条目。命名建议带场景信息,例如 terminal_digits.txt,便于后期维护。
使用工具提供的抓图功能(通常可通过快捷键触发,如 Ctrl+1),用鼠标左键框选需要识别的屏幕区域,然后按回车确认保存。
此时左侧预览窗口会显示刚截取的图像。截图范围的控制非常关键:
如果第一次截图效果不理想,应重新截图,而不是硬着头皮往下做。
在颜色方框中选择一个颜色,将鼠标移到其上,左键点击一次,将其设为当前操作颜色。这一步是为后续的二值化指定“哪些像素被视为文字”。
点击左上方预览区域,将鼠标移动到数字的颜色上,左键点击一次。此时工具会以该颜色为基准,对图像做二值化处理,二值化区域会显示识别出的内容。
颜色拾取的准确性直接影响二值化质量:
二值化区域会暴露问题:如果截图范围偏大,干扰项多,点阵会混入大量噪点。此时应重新截图,把范围缩小到只包含目标字符,再重复 4.3–4.4 的步骤。
这一步看似繁琐,但它是字库质量的分水岭。一个干净的二值化结果,能让后续点阵提取和匹配事半功倍。
确认二值化区域干净后,使用“提取点阵”功能,把像素图案转成字库条目。通常有两种模式:
对于“识别终端数字”这类目标,若一次截取一位数字,用提取单个即可;若一次截取整行数字,建议用提取多个。
到这一步为止,字库里的条目还只是“像素图案”,程序并不知道它代表什么。必须手动在“定义文字”输入框中,填入该图案对应的字符含义,例如输入 1,然后按回车键保存。
回车键代表保存,这是硬性要求。保存成功后:
这一环节最容易出错,也最需要耐心:
重复 4.2–4.7,不断截取不同数字,直到 0–9 全部建好。为什么必须是 10 个?因为任意长度的数字串,都是由这 10 个字符组合而成。字符集不完整,识别到缺失字符时就会失败或返回错误结果。
若目标不仅是数字,而是包含字母、符号的混合文本,则字符集需相应扩展。字符集越大,字库越大,构建工作量也越大,因此应尽量缩小业务所需的字符范围。
字库做好后,第一件事不是写业务代码,而是验证。很多识别失败并非代码问题,而是字库本身有缺陷。验证方法如下:
若识别正确,说明字库可用;若识别错误或无法识别,常见原因包括:
针对这些问题,应回到建库环节,调整截图范围、颜色或阈值,必要时补建条目。
把字库用于实际脚本时,建议遵循以下原则:
1. 字库与场景绑定管理
为每个场景维护独立字库文件,命名体现场景与版本,例如 terminal_digits_v1.txt。场景变更时同步更新,避免混用导致识别率下降。
2. 识别结果做二次校验
OCR 不可能 100% 准确。对关键数值(如交易金额),应在脚本中加入格式校验(如正则匹配 \d+)、范围校验(如金额在合理区间)和重试机制,降低误判风险。
3. 区域与阈值参数化
把截图区域坐标、颜色值、二值化阈值写成可配置参数,便于不同分辨率下快速适配,而不是硬编码在脚本里。
4. 优先缩小识别区域
能只识别一行就不识别整屏,能只识别数字就不识别全字符集。区域越小、字符集越小,识别速度与准确率越高。
5. 建立回归测试集
保存若干张带有已知结果的截图作为测试样本,每次调整字库或参数后跑一遍,量化识别准确率,避免“改一处、坏一片”。
自动化脚本中的文字识别,本质是在受控区域内把像素图案稳定映射为字符含义。其核心流程可归纳为:
掌握这套方法论后,无论是终端数字、界面金额还是其他固定字体的文本,都可以用同样的思路构建字库并实现稳定识别。真正决定成败的,往往不是代码写得多复杂,而是字库制作阶段对细节的把控。