简介:针对找图、找色难以满足的屏幕信息读取需求,本文系统讲解基于自定义字库的本地文字识别方案:从截图取样、二值化处理、点阵提取,到字符标注与字库验证,逐环节拆解实现细节,并附识别流程的示意代码与常见问题优化建议,帮助开发者在自动化脚本中搭建稳定、可控的文字识别能力。
在自动化脚本开发中,找图、找色是最常用的两类定位手段,它们擅长回答“某个图案在不在、坐标在哪里”。但有一类需求它们天然无法覆盖:屏幕上显示的内容到底是什么。
典型的场景包括:
这些场景的共同点是:待处理信息以“像素”形式呈现在屏幕上,脚本必须具备“看懂”文字的能力,也就是 OCR(光学字符识别)。本文介绍一种最务实、最易调试的落地方案——自定义字库识别。
屏幕文字识别通常有两条路线:
自定义字库的核心优势在于:识别对象封闭(如 0–9 十个数字)、显示样式固定(同一字体字号渲染)、响应快、完全本地化、结果可控可调试。
理解它的关键一句话是:字库就是字典。程序先“看见”像素图案,再查字典“理解”含义;没有字典,它只能看到一团点阵,并不知道那是一个数字还是一段乱码。
使用识别工具的抓图功能(快捷键或工具栏按钮均可),框选包含目标文字的最小区域,确认后预览窗口会显示刚截取的图像。
经验提示:截图范围务必小。范围越大,混入的背景颜色与干扰元素越多,后续二值化越容易产生噪点。宁可多截几次,也不要贪大。
二值化是把彩色图像变成“非黑即白”的点阵,操作上一般分三步:
若此时杂点很多,几乎都是截图范围过大所致,回到 4.1 重新截取更小的区域即可。
对数字识别,推荐使用“提取多个”,让工具自动完成字符切分,效率更高。
到目前为止,程序只知道“存在一个点阵图案”,并不知道它的中文含义。必须在定义文字输入框中手动输入该图案对应的字符(例如 1),输入后务必按回车保存——回车就是提交动作。保存后字库计数加一,界面通常以“图案编码|含义”的形式展示已录入条目,竖线左侧是编码,右侧即你标注的含义。
这一步的本质是人工建立“图案 → 语义”的映射,程序此后再遇到相同点阵,就能“理解”它是数字 1。
重复“截图 → 二值化 → 提取 → 标注”,把 0–9 十个数字全部入库。为什么必须做满十个?因为任意长度的数字串都由这十个字符组合而成,缺任何一个,遇到该字符时识别就会失败或输出错乱。
字库完成后,第一件事不是写代码,而是验证:
若显示结果与输入一致,字库即宣告可用;若出现错认、漏认,回到 4.2 检查二值化颜色与容差设置,或补充缺失的点阵样式。
验证通过后,识别逻辑只需三步:加载字库 → 截取区域 → 匹配输出。以下为示意性伪代码,具体函数名以所用环境为准:
// 1. 加载字库文件LoadFontLibrary("digit_lib.txt")// 2. 截取目标区域,按"前景色-偏色"描述进行二值化匹配text = OcrByLib(320, 180, 460, 210, "FFFFFF-000000")// 3. 用识别结果驱动业务分支If IsNumeric(text) Thenamount = CInt(text)TracePrint("识别到的金额:" & amount)ElseTracePrint("识别失败,进入重试逻辑")End If
工程化角度还应补充三点:识别失败时的重试与截图留档机制;识别结果的合法性校验(位数、取值范围);将字库文件纳入版本管理,便于迭代与回滚。
自定义字库方案的本质,是“点阵模板 + 人工标注字典”的封闭集识别:把屏幕文字问题转化为图案匹配问题。它的成本集中在前期标注入库,收益是运行期零外部依赖、低延迟、结果完全可控。对于字符集固定、显示样式稳定的自动化场景——金额、价格、倒计时等——这是最务实、最易调试的落地路径。掌握“截图—二值化—提取—标注—验证”这条流水线,再遇到“找图找色搞不定”的需求时,就有一套可靠的解题框架。