Tesseract 是目前 C# 最稳的 OCR 方案,需注意平台架构匹配、tessdata 路径为绝对路径且语言代码正确、图像格式须为 Format24bppRgb/Format32bppArgb,并重视截图/照片预处理。

用 Tesseract 是目前 C# 最稳的 OCR 方案
不推荐自己调 Windows.Media.Ocr(仅限 UWP,桌面应用跑不了),也别碰那些包装简陋的国产 SDK。Tesseract 是开源、准确率高、支持多语言、能离线运行的成熟引擎,C# 通过 Tesseract.NET(即 TesseractOCR NuGet 包)调用它最靠谱。
常见错误现象:Tesseract 初始化时报 Unable to load DLL 'liblept-5.dll' 或识别结果为空字符串——基本是平台架构不匹配或依赖 DLL 没放对位置。
- 必须安装对应平台的
tessdata语言包(如chi_sim.traineddata),放到项目输出目录的tessdata文件夹下 - NuGet 安装
Tesseract包后,检查项目属性 → “平台目标”是否设为x64或x86(不能是AnyCPU),要和你引用的tessdata及原生 DLL 架构一致 - 初始化时传入的
tessdata路径必须是绝对路径,相对路径容易失效;建议用Path.GetFullPath("tessdata")
TesseractEngine 初始化失败的三个关键点
不是 new 一下就完事。初始化失败往往卡在路径、语言、平台三处,报错信息通常是 System.DllNotFoundException 或 NullReferenceException 在 Recognize() 前就抛出。
-
TesseractEngine构造函数第二个参数是语言代码(如"chi_sim"),不是文件名,更不能带.traineddata后缀 - 如果图像来自截图(
Bitmap),确保它不是索引像素格式(Format8bppIndexed等),Tesseract只吃Format24bppRgb或Format32bppArgb;可调用bitmap.Clone(..., PixelFormat.Format24bppRgb)强制转换 - 若从照片读取(
FileStream或byte[]),优先用Pix.LoadFromMemory加载,别直接丢Bitmap给Page——Bitmap的 DPI 和方向元数据可能干扰识别
截图/照片预处理比换模型更影响识别率
多数“识别不准”问题不出在 OCR 引擎本身,而出在输入图像质量。Tesseract 对清晰度、对比度、文字区域占比非常敏感,尤其中文。
- 截图建议先裁掉窗口边框、状态栏等干扰区域,只留纯文本区域;可用
Bitmap.Clone(Rectangle, PixelFormat)快速裁剪 - 照片务必二值化:调用
Pix.ConvertTo1(Otsu 阈值)比简单Threshold更鲁棒;避免直接用Bitmap.SetPixel手动阈值,性能差且易出错 - 小字号(Pix.Scale 放大 1.5–2 倍再识别;但别无脑放大,超过 3 倍会引入锯齿噪声
- 倾斜文本?
Tesseract自带PageSegMode.AutoOsd可检测旋转,但不如提前用 OpenCvSharp 做透视校正来得稳定(不过这就超出纯 Tesseract 范围了)
识别结果为空或乱码的典型原因
返回空字符串或一堆问号,90% 不是编码问题,而是输入没过 Tesseract 的“可识别性”门槛。
- 语言包没加载成功:检查
engine.GetAvailableLanguages()是否包含你传的lang,不包含说明路径或文件名错了 - 图像太暗或反色:Tesseract 默认按“黑字白底”识别,如果图像是白字黑底,得加配置
engine.SetVariable("tessedit_ocr_engine_mode", "1")并调用Pix.Invert - 中英文混排时别只用
"chi_sim";可尝试"chi_sim+eng"(需两个 traineddata 文件都存在),但注意识别速度下降约 40% - 单行短文本(如验证码、按钮文字)建议设
PageSegMode.SingleLine,否则默认的Auto模式会强行分段甚至切字
复杂点在于:同一张图里不同区域文字大小、角度、背景差异大时,分区域裁剪 + 分别识别,比整图一把梭成功率高得多。这个逻辑得自己写,Tesseract 不负责“智能框选”。


















