Tesseract.NET 是跨平台纯托管 OCR 封装,需通过 NuGet 安装 TesseractOCR(非 tessnet2),并显式指定含 chi_sim.traineddata 的 tessdata 绝对路径;图像须预处理——纠偏、增强对比度、去水印后识别效果才可靠。

用 Tesseract.NET 在 C# 里跑通 OCR 识别
Tesseract 是目前最成熟的开源 OCR 引擎,C# 可通过 Tesseract.NET(即 TesseractOCR NuGet 包)调用。它不依赖系统级安装,纯托管封装,适合 Win/macOS/Linux 跨平台部署。
常见错误是直接引用旧版 tessnet2(已停更、仅支持 .NET Framework 4.x),或误以为装了系统级 tesseract.exe 就能自动工作——其实 C# 项目必须显式加载语言数据文件(chi_sim.traineddata 等)并指定路径。
- 用 NuGet 安装
TesseractOCR(作者:charlesw),不是tessnet2 - 下载对应语言的
.traineddata文件(如中文用chi_sim.traineddata),放到项目目录(如./tessdata/),设Copy to Output Directory = Copy always - 初始化时必须传入
tessdata所在目录的绝对路径,相对路径会静默失败 - 图像预处理很关键:Tesseract 对倾斜、低对比度、小字号(Bitmap 转灰度 + 二值化(
Threshold = 150)再送入
using (var engine = new TesseractEngine(@"./tessdata/", "chi_sim", EngineMode.Default))
{
using (var img = Pix.LoadFromFile("sample.png"))
{
using (var page = engine.Process(img))
{
string text = page.GetText(); // 不是 .Recognize()
}
}
}
PaddleOCR 在 C# 中怎么调用(非直接引用)
PaddleOCR 是飞桨推出的高精度 OCR 工具,但它是 Python 生态,没有官方 C# SDK。所谓“C# 调用 PaddleOCR”,本质是进程间通信:C# 启动 Python 子进程,传图路径,读取 JSON 输出。
容易踩的坑是试图用 Python.Runtime 直接 import paddle ——会因 CUDA/cuDNN 版本、Python 环境隔离、.NET Core 与 CPython ABI 不兼容而崩溃。稳定做法只走标准输入输出管道。
- 确保本地已安装 Python 3.8–3.11,并用
pip install paddlepaddle paddlenlp paddleocr(CPU 版即可,GPU 需额外验证驱动) - 写一个独立的 Python 脚本(如
ocr_api.py),接收sys.argv[1]图片路径,输出 JSON 格式结果(含text、box、score) - C# 用
Process.Start()调用该脚本,捕获StandardOutput,用JsonSerializer.Deserialize解析() - 注意超时控制:PaddleOCR 单图 CPU 推理约 1–3 秒,务必设
process.WaitForExit(5000),否则卡死
选 Tesseract 还是 PaddleOCR?看这三点
不是“哪个更好”,而是“哪个更稳、更省事、更贴合你的场景”:
- 要快速上线、识别印刷体文档、无 GPU 服务器、.NET 6+ 纯托管部署 → 选
TesseractOCR,启动快、内存占用低、无外部依赖 - 要识别手写体、复杂版面(表格/多栏)、中英文混排、弯曲文字,且已有 Python 运维能力 → 选 PaddleOCR,准确率明显更高,但得维护 Python 环境和模型文件(
ch_PP-OCRv4_rec_infer等) - 对实时性要求高(如视频帧 OCR)、需自定义训练 → 两者都不推荐直接嵌入 C#;应把 OCR 抽成 HTTP 微服务(Flask/FastAPI 托管 PaddleOCR,或 tesseract-server 封装),C# 用
HttpClient调用
图像预处理比换引擎更能提准
无论用哪个 OCR 引擎,原始图片质量差,模型再强也白搭。C# 里最容易被忽略的是这三步:
- 缩放:Tesseract 最佳输入尺寸是 300–600 DPI,用
Bitmap.SetResolution(300, 300)再保存为 PNG,别靠原始像素硬扛 - 去噪:用
System.Drawing做简单中值滤波(Bitmap.Clone()+ 邻域像素排序取中位)比不做强得多,尤其对付扫描件噪点 - 旋转校正:若检测到文本行倾斜角 > 2°,先用
Graphics.RotateTransform()仿射变换纠偏;PaddleOCR 的det_db_box_thresh参数对歪斜敏感,不校正可能漏检整行
真正难的不是调哪个库,而是拿到一张模糊、反光、带水印的现场拍照图时,你有没有意识先把它“洗干净”再喂给 OCR。











