☰
Botty的OCR魔法:Tesseract如何识别地面物品?词表、正则与纠错机制揭秘
2026/9/26 7:24:51 网站建设 项目流程

Botty的OCR魔法:Tesseract如何识别地面物品?词表、正则与纠错机制揭秘

【免费下载链接】bottyD2R Pixel Bot项目地址: https://gitcode.com/gh_mirrors/bo/botty

Botty 是一款开源的D2R(暗黑破坏神2:重制版)像素机器人,它能自动跑图、捡物、换装。但一个"看图说话"的程序如何分辨地上的文字是 "FLAWLESS RUBY"(无瑕红宝石)还是垃圾?本文带你揭秘 Botty 基于Tesseract OCR的文字识别体系:预训练词表、正则纠错和模糊匹配三层机制如何让一个开源 OCR 引擎稳定读懂暗黑风格像素字体。

为什么 OCR 是像素机器人的核心能力?

D2R 没有对外接口,机器人"看得见"的只有屏幕截图。物品信息(名字、等级、词缀)全部以像素文字形式存在,因此必须借助 OCR(光学字符识别)把图像转成文本,再交给 BNIP 词缀解析引擎判断物品价值。

整个图像识别管线位于 src/d2r_image/ 目录,核心入口函数是 image_to_text(),它完成了"图像 → 文本"的全过程。

第一步:两套专门训练的 Tesseract 模型

Tesseract 默认不擅长暗黑这种细像素字体。Botty 的解法是自训练模型:用真实游戏截图 + 人工标注的文本样本(标注工具见 gen_ocr_samples.py),训练出两套 LSTM 模型存放在 assets/tessdata/:

  • ground-eng_inconsolata_inv_th_fast:识别地面物品名称(单行文字)
  • hover-eng_inconsolata_inv_th_fast:识别悬停提示框(多行属性文字)

模型加载时还会读取 ocr_config.txt,对"非词表词"施加语言模型惩罚——让模型更信任词表里的词,这是后面纠错机制的第一道伏笔。

第二步:图像预处理,让像素字变得"可读"

原始截图中,物品文字是彩色的、边缘还带着背景噪点。image_to_text() 在送入 Tesseract 前做了一连串处理:

  1. 缩放(scale):小字体放大后更易识别
  2. 腐蚀去边(erode):地面物品专用,erode_to_black() 用形态学重建抹掉文字周围的彩色噪点,只留下文字
  3. 裁剪+补白(crop_pad):去掉图块边缘干扰
  4. 灰度 + 二值化阈值:把图像变成纯黑白
  5. 反色(invert):暗黑是白字黑底,Tesseract 偏好黑字白底

识别地面物品时的实际调用在 processing_helpers.py:先按文字颜色聚类定位物品区域,再批量送入ground模型,psm=7表示"单行文字"模式。

第三步:三层纠错机制,Tesseract 输出只是起点

Tesseract 再准也会犯错——I和1、O和0、S和5在像素字体里几乎无法区分。Botty 在 ocr.py 里设计了三层递进的纠错流水线:

1️⃣ 正则规则修正(_fix_regexps)

针对字母数字混淆写了一组带上下文的正则,定义在 ocr_data.py:

场景示例规则
词中的1其实是IW1RT'S LEG两侧是大写字母 → 替换为I
数字旁的I其实是1+32I to mana两侧是数字/符号 → 替换为1
孤立的I/S/OI TO 5 DEFENSE单独成词 → 替换为1/5/0

完整的上下文判断逻辑见 _fix_regexps()。

2️⃣ 已知错误映射表(_check_known_errors)

有些词 Tesseract 的错法非常固定,直接查表替换。ERROR_RESOLUTION_MAP 里收录了几十个"固定错误",例如:

  • SHIFLD→SHIELD
  • SPFAR→SPEAR
  • CLAVMORE→CLAYMORE
  • IOX%→10%

3️⃣ 词表模糊匹配(_ocr_result_dictionary_check)

最后一层最聪明:把每个词拿去和完整词表做模糊匹配(find_best_match() 使用 rapidfuzz 的 Levenshtein 编辑距离),归一化相似度 ≥ 0.6 才替换,避免"错改"。

它还有一个亮点——前瞻合并:如果 OCR 把单词中间的空格读丢了,或把两个词读碎(S11PER这种),算法会尝试"当前词 + 下一个词"合并后再匹配词表,取更优解,详见 _ocr_result_dictionary_check()。

词表:OCR 的"知识库"

模糊匹配的效果取决于词表质量。Botty 在 assets/word_lists/ 维护了 5500+ 条词条:

  • all_words.txt(约 3850 词):全部合法词,含基础物品、符文、技能与词缀
  • base_items.txt:基础装备/武器名称
  • magic_prefixes.txt 与 magic_suffixes.txt:魔法前后缀

加载逻辑在 strings_store.py,带缓存,词表同时被注入给 Tesseract(user_words_file)和纠错层,一份数据两处受益。

总结:一张"图像到物品"的完整链路

把整条链路串起来,Botty 识别一件地面物品的流程是:

截图 → 颜色聚类定位文字 → 腐蚀/二值化预处理 → Tesseract 自训练模型识别 → 正则修正 → 已知错误查表 → 词表模糊匹配 → BNIP 解析物品价值 → 自动拾取

这套"模型特化 + 预处理 + 三层纠错"的组合拳,展示了在受限像素字体场景下用好开源 OCR 的完整思路——对任何想给复古像素游戏做图像识别的项目,都有很强的参考价值。

关键文件速查:

  • OCR 核心:src/d2r_image/ocr.py
  • 正则与错误表:src/d2r_image/ocr_data.py
  • 地面物品定位管线:src/d2r_image/processing_helpers.py
  • OCR 模型与配置:assets/tessdata/
  • 词表数据:assets/word_lists/
  • 开发文档:development.md

【免费下载链接】bottyD2R Pixel Bot项目地址: https://gitcode.com/gh_mirrors/bo/botty

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询