简介:当找图、找色难以满足自动化需求时,屏幕文字识别(OCR)成为读取界面动态数字与文本的关键手段。本文系统讲解基于自定义字库的OCR完整流程:环境准备、区域截图、二值化、点阵提取、人工标注到识别验证,并给出可复用的调用示例与常见问题排查思路,帮助读者快速搭建稳定可靠的屏幕文字识别能力。
找图、找色是自动化脚本中最基础的界面定位手段,它们擅长回答“某个固定的图案或颜色出现在哪里”,却难以回答“屏幕上这段内容到底是什么”。当界面内容是动态生成的——例如交易金额、拍卖行报价、倒计时秒数、系统提示文本——图案本身每个时刻都不一样,不可能为每一种取值都预先截图比对。此时就需要把屏幕上的像素图案“翻译”成字符串,也就是文字识别(OCR)。
典型的应用场景包括:
本文以一个最小案例作为切入点:在终端(命令行窗口)中输入数字 123,让脚本自动识别并输出 123。选择数字识别作为入门,是因为它的字符集只有 0~9 十个字符,是理解字库式 OCR 最简洁、最清晰的案例;掌握方法后,扩展到字母、汉字只是工作量问题,原理完全一致。
字库式 OCR 的本质,是一张“图案 → 含义”的映射表:
可以把字库理解为一本字典:字典存在,识别才有依据。这也解释了为什么字库制作是整个流程中最核心的工作——字库覆盖的字符越全、样本越标准,识别结果就越可靠。
Step 1:截取目标区域。 在字库工具中触发抓图功能(常见形式为快捷键 Ctrl+数字键,或点击工具栏抓图按钮),用鼠标框选包含目标字符的区域,按回车确认保存,左侧预览窗口会显示刚截取的图像。
Step 2:二值化,只保留文字颜色。 在颜色选择区任选一个颜色框,将鼠标移到预览图中数字的像素上单击,把该颜色设为前景色;工具会把与该颜色匹配的像素保留为黑点、其余全部丢弃,这一步称为二值化。二值化后,输出区会显示当前提取到的点阵内容。
经验提示:一开始截图范围不要太大。范围越大,背景中的干扰像素越多,二值化结果越杂乱,会直接影响后续点阵提取。先用小而干净的样本跑通流程,再逐步扩展。
Step 3:提取点阵。 提取单个,会把当前二值化区域的全部内容作为一个整体条目写入字库,适合整段文字一起识别的场景;提取多个,则会自动按字符之间的空隙智能切分,把每个字符拆成独立条目,适合需要逐字符匹配的数字、字母识别,通常更为常用。
Step 4:人工标注含义(最关键的一步)。 到这一步为止,程序只知道“屏幕上有一团这样的点阵”,并不知道它是 1 还是 7。必须在定义文字输入框中手动输入该点阵对应的字符(例如输入 1),然后按回车保存。回车即保存,漏按会导致标注丢失;保存成功后,字库计数会加一,条目列表中会以“点阵编码 | 标注含义”的形式显示这条数据。
Step 5:重复采样,覆盖整个字符集。 对 0~9 每个数字分别执行截图、二值化、提取、标注,共做 10 条。为什么必须做全十个?因为任意长度的数字都是由这十个字符组合而成——字库覆盖了全集,才能识别任意数字串。如果只做了 0~8,那么所有包含 9 的数字都会识别失败或出现乱码。
字库做完后,第一件事不是写代码,而是验证:
验证通过后再进入编码环节,能把问题域从“字库 + 代码”缩小到“纯代码”,大幅降低排错成本。
以下是概念化的调用示意(具体函数名以所用插件文档为准):
// 伪代码:读取终端中的数字ocr = 创建识别对象()ocr.加载字库("digital.txt")ocr.设置颜色过滤(前景色, 背景色, 颜色偏差)ocr.设置相似度(0.9)text = ocr.识别区域(x1, y1, x2, y2)If text <> "" Then输出 "识别结果:" & textElse输出 "未识别到内容"End If
几个关键参数需要注意:
字库式屏幕文字识别的流程可以概括为六个环节:环境准备 → 截图 → 二值化 → 点阵提取 → 人工标注 → 验证调用。其中“人工标注后务必回车保存”与“先验证再编码”是最容易踩坑、也最容易被忽视的两步。理解了“点阵图案与字符含义的映射”这一本质之后,无论是识别数字、字母还是汉字,都只是字符集大小与采样工作量的差别。