c# 如何实现 ocr 文字识别

来源:这里教程网 时间:2026-02-21 17:38:24 作者:

Tesseract
是最直接的方案

在 C# 中做 OCR,

Tesseract
(通过封装库
Tesseract.NET
或官方推荐的
tesseractdotnet
)是目前最成熟、免费、支持多语言且能离线运行的选择。它不依赖网络,识别精度对印刷体足够可靠,适合桌面应用或后台服务。

注意:不要用已停止维护的

Tesseract.NET
(旧版 NuGet 包 ID 为
Tesseract
),它不支持 .NET 6+,且缺乏 ARM64 和中文优化。应改用
tesseractdotnet
(GitHub 仓库名:
charlesw/tesseract
)。

安装命令:
dotnet add package tesseractdotnet
需额外下载对应语言数据文件(如
chi_sim.traineddata
),放在项目输出目录(如
./tessdata/
)并确保路径可读
初始化时必须显式指定
tessdata
路径,否则默认找不到中文模型

using Tesseract;
的最小可用示例

以下代码能在 .NET 6+ 控制台中跑通,识别一张含简体中文的 PNG 图片:

using Tesseract;
<p>string imagePath = "sample.png";
string tessDataPath = Path.Combine(AppContext.BaseDirectory, "tessdata");</p><p>using var engine = new TesseractEngine(tessDataPath, "chi_sim", EngineMode.Default);
using var img = Pix.LoadFromFile(imagePath);
using var page = engine.Process(img);
string text = page.GetText();</p><p>Console.WriteLine(text);

关键点:

tessDataPath
必须是包含
tessdata
文件夹的**父目录**,不是
tessdata
本身
"chi_sim"
是简体中文模型名,不是
"chi"
"chinese"
;繁体用
"chi_tra"
Pix
是 Tesseract 自带图像容器,不接受
Bitmap
Image
,需用
Pix.LoadFromFile
Pix.LoadFromMemory

常见错误:
Unable to load language 'chi_sim'

这个错误几乎总是路径或文件问题,和模型本身无关:

检查
tessdata
文件夹是否真的复制到了输出目录(
bin/Debug/net6.0/tessdata/
确认
chi_sim.traineddata
文件名拼写完全一致(区分大小写,无空格、无后缀错误)
若用 Visual Studio,右键该文件 → 属性 → “复制到输出目录” 设为“始终复制” Linux/macOS 下注意文件权限,
tessdata
目录需有读取权限

识别效果差?先调图,别急着换库

OCR 效果高度依赖输入图像质量。Tesseract 对模糊、低对比、倾斜、小字号、手写体基本无解,但对干净扫描件或截图效果很好。提升识别率的实操建议:

预处理优先用
Pix
自带方法:
img.Deskew()
(自动纠偏)、
img.BinarizeOtsu()
(二值化)
避免用
Bitmap
做缩放再转
Pix
—— 插值会引入锯齿,改用
Pix.Scale()
小文字区域可裁剪后单独识别:
page.GetSegmentedRegions(PageIteratorLevel.Block)
配合
Pix.Clone()
不推荐强行用
engine.SetVariable("tessedit_char_whitelist", "0123456789")
限制字符集,易漏字;应优先优化图像

复杂场景(如表格、多栏、带格式 PDF)需要额外布局分析,Tesseract 本身不擅长,得接

pdf2image
+
OpenCV
定位 ROI,再送入 Tesseract 分块识别。

相关推荐