
简介本资源为 tesseract-ocr 安装包与中文语言包合集面向从事 OCR 文字识别、人工智能与 Python 图像处理的开发者及学习者帮助解决中文识别环境搭建与语言数据缺失的问题。压缩包共 722 个文件约 33.78MB以 C 源码cpp、h为主辅以 Java、XML、HTML、Shell 脚本及 CMake 构建文件并包含训练数据、字体与图像样本等覆盖从编译构建到识别测试的完整链路。内容预览显示还附带 combine_tessdata、unicharset_extractor、shapeclustering、mftraining 等命令行工具说明便于理解字符集提取与模型训练流程。目前已有 3944 人学习下载适合需要快速部署中文 OCR 环境、研究识别原理或进行二次开发的读者参考使用。1. 从一张发票说起为什么离线 OCR 仍然值得折腾上个月帮一个做财务系统的朋友处理一批扫描件两千多张增值税发票要求把发票代码、金额、开票日期提取出来做对账。他第一反应是调云端 OCR 接口我给他算了一笔账按量计费两千张跑下来成本不低而且发票数据涉及企业信息走公网传输本身就有合规风险。最后我们用 tesseract-ocr 在本地搭了一套离线识别流程一台普通办公机跑了一晚上准确率在印刷体场景下完全够用。这就是 tesseract-ocr 安装包和中文语言包这类资源一直有人找的原因——它解决的是「不想联网、不想付费、数据不出本地」的 OCR 需求。tesseract 本身是开源 OCR 引擎装完之后默认只认英文中文识别必须额外挂载chi_sim简体或chi_tra繁体语言包。很多人卡住的地方不是引擎装不上而是语言包路径没配对、版本对不上、或者拿它去识别手写体和复杂版式然后得出「tesseract 中文不行」的结论。这篇面向的是想在自己机器上把 tesseract 中文识别跑通的开发者尤其是做票据、证件、文档归档这类印刷体场景的。我会把安装、语言包配置、参数调优、预处理、避坑一条线讲完新手能照着复现熟手能直接拿去改自己的 pipeline。2. 安装包与语言包版本、来源与目录结构2.1 先搞清楚你要装的是哪一层tesseract 的安装分三层很多人混在一起导致后面找不到文件。第一层是引擎本体提供tesseract命令行和libtesseract库第二层是训练数据也就是语言包文件名形如chi_sim.traineddata第三层是调用层比如 Python 的pytesseract或者 C 直接链接库。安装包和语言包是分开的两样东西.rar这类压缩包通常是把引擎安装程序和语言包文件打包在一起解压后要分别处理。Windows 上常见的是某个安装程序装完默认路径在C:\Program Files\Tesseract-OCR语言包放在其下的tessdata目录。Linux 用包管理器装语言包是独立的包。macOS 用 brew 装引擎语言包同样单独拉。不管哪个平台核心逻辑一致引擎去tessdata目录找语言代码.traineddata文件。2.2 语言包该放哪、怎么验证语言包放错位置是最常见的翻车点。判断标准只有一个tesseract --list-langs能不能列出chi_sim。如果列不出来说明引擎没在你指定的tessdata目录里找到它。# 查看当前 tesseract 版本和默认 tessdata 路径 tesseract --version # 列出引擎能识别的所有语言 tesseract --list-langs # 如果 chi_sim 不在列表里手动指定 tessdata 目录再试 tesseract --tessdata-dir D:/ocr/tessdata --list-langs--version输出里会带一行tessdata的搜索路径这是排查的第一手信息。--list-langs是验证语言包是否生效的唯一权威命令别靠肉眼看目录。--tessdata-dir是临时覆盖路径适合语言包不想放系统目录的情况。语言包文件本身有版本匹配问题。tesseract 4.x 用的是 LSTM 格式的 traineddata3.x 用的是旧格式两者不通用。如果你拿到的是老版本语言包在新引擎上可能加载失败或者识别结果异常。判断方法4.x 的chi_sim.traineddata体积通常在几十 MB 量级3.x 的明显更小。拿不准就重新下载对应版本的。2.3 最小可运行验证装完别急着上业务图先用一张干净的印刷体中文图跑通链路。# 最简调用输入图 - 输出文本 tesseract input.png stdout -l chi_sim # 输出到文件同时保留识别置信度信息 tesseract input.png output -l chi_sim tsv第一条命令把识别结果直接打到终端-l chi_sim指定简体中文。第二条的tsv是输出格式会生成带每个词坐标和置信度的表格文件后面做版面分析时很有用。如果第一条能出中文说明安装和语言包这条链路是通的剩下的都是精度问题。提示路径里有中文或空格时Windows 下容易出问题建议把图片和 tessdata 都放在纯英文路径下测试。3. 让中文识别率从「能用」到「好用」的参数与预处理3.1 页面分割模式PSM怎么选tesseract 默认假设输入是一整页文档会自动做版面分析。但你的图可能只是一行字、一个表格单元格、或者一张票据的局部这时候默认模式反而会帮倒忙。--psm参数控制页面分割策略是中文场景下最值得调的参数。# psm 6假设是一整块统一文本适合截图、票据主体区域 tesseract invoice.png stdout -l chi_sim --psm 6 # psm 7假设是单行文本适合识别单个字段 tesseract single_line.png stdout -l chi_sim --psm 7 # psm 11稀疏文本适合画面上文字零散分布的情况 tesseract scattered.png stdout -l chi_sim --psm 11--psm 6是我在票据场景下用得最多的它跳过复杂的版面分析把整块区域当连续文本处理对规整的印刷体中文效果稳定。--psm 7用于已经裁好的单行比如从表格里切出来的金额栏。--psm 11适合文字位置不规则的图但速度会慢一些。选错 PSM 的典型症状是明明图里字很清楚识别结果却缺行、串行、或者把两列文字混在一起。3.2 图像预处理二值化和去噪的取舍tesseract 对输入图像质量有要求尤其是中文笔画密集图一糊就全乱。常见做法是先做灰度、再二值化、必要时去噪和纠偏。但预处理不是越多越好过度处理会把细笔画吃掉。import cv2 import numpy as np # 读图并转灰度 img cv2.imread(invoice.png) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 自适应二值化对光照不均的扫描件比全局阈值稳 binary cv2.adaptiveThreshold( gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, # 邻域块大小必须是奇数 10 # 常数 C从均值里减去的值 ) # 轻度去噪中值滤波对椒盐噪声有效且不糊边 denoised cv2.medianBlur(binary, 3) cv2.imwrite(preprocessed.png, denoised)adaptiveThreshold的两个关键参数块大小 31 适合 A4 扫描件图小就调小到 15 或 21常数 C 越大二值化越激进笔画细的字体可以适当调小。medianBlur的核大小用 3 就够再大中文笔画会粘连。预处理完拿preprocessed.png再喂给 tesseract对比一下识别结果能明显看出差异。3.3 用 pytesseract 把参数串起来命令行验证通了之后实际项目里一般用 Python 封装。pytesseract是常用封装但要注意它只是调用引擎参数还是那些。import pytesseract from PIL import Image # 指定引擎路径Windows 下常需要 pytesseract.pytesseract.tesseract_cmd rC:\Program Files\Tesseract-OCR\tesseract.exe # 自定义配置语言 PSM 白名单字符 custom_config r--oem 3 --psm 6 -c tessedit_char_whitelist0123456789.- text pytesseract.image_to_string( Image.open(amount_region.png), langchi_sim, configcustom_config ) print(text)--oem 3表示用默认的 LSTM 引擎4.x 下一般不用改。tessedit_char_whitelist是白名单识别纯数字金额时把字符集限制住能显著减少把0认成O、1认成l这类错误。注意白名单只对特定字段用整页中文识别时千万别加否则中文全被过滤掉。4. 避坑与排查中文识别翻车的五个真实场景4.1 现象识别结果全是方框或乱码原因通常是语言包没加载成功引擎退回了默认英文模型中文全变成不可识别字符。解决先跑tesseract --list-langs确认chi_sim在列表里不在就检查tessdata路径和文件权限在列表里但结果仍乱检查调用时-l参数有没有写对chi_sim不能写成chi-sim或zh。4.2 现象数字和字母混淆严重原因是没有做字符集约束LSTM 在相似字形上会犯错。解决对金额、编号这类字段加tessedit_char_whitelist把可能字符限定死。如果字段里既有数字又有中文白名单就不适用改用后处理正则纠错比如把金额里的O替换回0。4.3 现象整页识别缺行、串行原因是 PSM 选错默认模式对非标准版面做了错误的区域划分。解决规整文本块用--psm 6单行用--psm 7零散文字用--psm 11。如果版面复杂到 PSM 都搞不定就先做版面分析把区域切出来再逐块识别别指望一个参数解决所有版面。4.4 现象扫描件识别率明显低于截图原因是扫描引入的噪声、倾斜、光照不均。解决加预处理链路灰度、自适应二值化、中值去噪、必要时用霍夫变换做倾斜校正。倾斜角度超过 2 度中文识别率就会明显下降这一步不能省。4.5 现象换了一台机器结果不一致原因是两台机器的 tesseract 版本或语言包版本不同。解决把引擎版本和traineddata文件一起纳入版本管理部署时统一分发。别用「我这边能跑」当交付标准OCR 结果对版本敏感这是血泪经验。5. 进阶把 tesseract 塞进批量流水线并做结果校验单张图跑通只是起点真实业务是成百上千张。我一般会把流程拆成「预处理 → 识别 → 后处理校验」三段每段可独立替换。预处理用 OpenCV 批处理识别用 pytesseract 循环调用后处理用正则和业务规则做校验。import os import re import cv2 import pytesseract from concurrent.futures import ThreadPoolExecutor def ocr_one(path): img cv2.imread(path) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) binary cv2.adaptiveThreshold( gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 10 ) text pytesseract.image_to_string( binary, langchi_sim, config--psm 6 ) return path, text def validate(text): # 业务校验金额字段必须能匹配到数字模式 amounts re.findall(r\d\.\d{2}, text) return len(amounts) 0, amounts paths [f for f in os.listdir(scans) if f.endswith(.png)] with ThreadPoolExecutor(max_workers4) as pool: results list(pool.map(ocr_one, [os.path.join(scans, p) for p in paths])) for path, text in results: ok, amounts validate(text) if not ok: print(f[需人工复核] {path})ThreadPoolExecutor的并发数别开太大tesseract 本身吃 CPU开 4 个在四核机上比较稳开太多反而互相抢资源。validate函数是业务校验的入口金额匹配不上就标记人工复核这一步能把大部分识别失败拦下来避免错误数据直接进库。校验策略上我习惯分三档高置信度直接入库中等置信度抽样复核低置信度或校验失败的全量人工。置信度可以从image_to_data拿比image_to_string多返回每个词的 conf 值。这套组合跑下来印刷体票据场景的自动化率能到八成以上剩下的两成交给人工整体成本远低于全量人工录入。最后说个我自己的习惯每次调完参数别只看一两张图的结果固定拿一组二十张左右的「回归集」跑一遍记录识别率和错误类型。OCR 调参很容易顾此失彼今天为金额调好了明天发现日期字段崩了。有回归集在手改参数才有底气。希望帮到你。本文还有配套的精品资源点击获取