简介:本文面向需要在自动化场景中读取屏幕数字与文字的开发者,系统梳理从区域截图、二值化处理、点阵提取到字库定义与匹配验证的完整实现链路,总结截图范围控制、噪声清理、字符切分与准确率优化等关键经验,并附识别流程伪代码,帮助读者快速搭建稳定、低开销的自定义识别方案。
在桌面自动化、回归测试、数据核对等场景中,很多目标程序并未开放读取界面的接口,界面上的金额、编号、计数等数字信息只能“看到”而无法直接“读取”。此时最常见的解决思路,就是把屏幕像素当作数据源:先截取目标区域,再对图像做识别,最终把像素图案还原成字符串。
相比训练一个通用神经网络模型,基于“点阵字库匹配”的方案在固定字体、固定背景的场景下有明显优势:实现简单、资源占用低、准确率高,且不依赖联网调用。对于识别内容收敛在有限字符集(例如 0~9 十个数字)的场景,它往往是性价比最高的选择。
点阵匹配的本质是“图像 → 编码 → 查表”三步:
理解这个原理后,整个制作流程就不再是零散的操作步骤,而是围绕“如何得到干净、稳定的编码”展开的工程问题。
使用识别辅助工具的新建字库功能,通过快捷键或工具栏按钮触发抓图,用鼠标框选包含目标数字的区域,确认后保存,预览窗口会显示截取结果。
这里有一条非常关键的实践经验:初始截图往往习惯性框得比较大,结果画面中的边框、图标、背景纹理都会进入二值化结果,形成大量干扰点。正确做法是在完整容纳目标文字的前提下,把选区压到最小,只保留数字本身和极小的边距。选区越小,后续二值化的噪声越少,字符切分也越可靠。
二值化需要一个参考颜色:先在颜色样本区任选一个颜色,再到预览图上点击数字笔画所在的颜色,工具会以该颜色为中心、按设定的色彩相似度容差进行判定,相近像素保留为前景,其余置黑。
两个实操要点:
如果二值化结果中出现大量与数字无关的内容,通常不是参数问题,而是截图范围太大。此时应回到上一步重新截取更小的区域,而不是反复调参。
二值化完成后即可提取点阵,常用两种模式:
使用自动切分时要注意字符间距:间距过小会导致两个字符被合并成一条记录,后续识别必然失败;这种情况应扩大字符间距或缩小截图范围后重试。
到这一步为止,工具得到的只是一段像素编码,程序只知道“存在这样一个图案”,并不知道它代表什么。必须人工在定义输入框中输入该图案对应的字符——例如当前图案是数字 1,就输入 1。
输入完成后务必执行保存操作(通常是回车确认)。保存成功的标志有两个:字库计数加一,说明新增了一条映射;记录列表中可以看到该编码与字符含义一一对应。很多初学者“字库做完了却识别不出结果”,多数是漏了保存,映射根本没写入。
接下来是重复性工作:更换数字、截图、二值化、提取、定义、保存,直到把 0~9 十个数字全部录入。
为什么必须做满十个?因为查表式识别没有泛化能力,字库里缺哪个字符,遇到它就只能返回失败或未知值。交付前最好再做一次验证:让目标界面依次显示全部字符,逐一核对识别输出是否正确,确认无误后字库才算可用。
字库做好后,脚本侧的识别逻辑可抽象为如下伪代码:
function recognizeNumber(region):img = capture(region) // 1. 截取目标区域bw = binarize(img, refColor, tolerance) // 2. 按参考色与容差二值化dots = extractDotMatrix(bw) // 3. 提取点阵text = ""for block in splitBlocks(dots): // 4. 按字符切分ch = fontLib.lookup(codeOf(block)) // 5. 逐块查字库if ch is null:return null // 未命中:返回失败,交由上层重试text += chreturn text// 调用侧建议加上校验与重试result = recognizeNumber(targetRegion)if result == null or not isDigits(result):retryOrFail()
提升稳定性可以从五个方面入手:
点阵字库方案的前提是“字体固定、字符集有限”。一旦面对字体多样、背景复杂、字符集开放(如汉字、英文混排)的场景,手工建库的成本会迅速失控,此时应转向通用 OCR 能力:既可采用本地集成的通用识别方案,也可使用云端 OCR 服务(通用文字识别类产品),由服务端完成复杂场景下的文字检测与识别,脚本只负责调用与解析结果。选型标准很朴素:字符集封闭、界面稳定,选自制字库;字符集开放、场景多变,选通用 OCR。
自制字库式文字识别并没有太高的技术门槛,难点全在工程细节:截图要小、颜色要准、保存要确认、字符集要补全、结果要校验。把“截取—二值化—提取—定义—验证”这条链路标准化成固定流程,再配合合理的容错逻辑,就能在固定场景中长期稳定地“读屏”,为上层自动化脚本提供可靠的文本输入。