本项目提供了一个快速、稳定、可训练的 OCR(光学字符识别)解决方案,基于 C# .NET Framework 4.8 开发。
✅ 高性能识别 - 基于 Tesseract 5.x LSTM 引擎
✅ 多语言支持 - 支持 100+ 种语言(中文、英文等)
✅ 可自定义训练 - 支持训练专用模型提高特定场景准确率
✅ 图像预处理 - 自动灰度化、二值化、降噪
✅ 批量处理 - 支持批量图片识别
✅ 线程安全 - 单例模式,多线程安全访问
✅ 易于集成 - 简洁的 API,几行代码即可使用
┌─────────────────────────────────────┐
│ OCREngine (核心引擎) │
│ - 单例模式管理 │
│ - 线程安全 │
│ - 资源自动释放 │
└──────────────┬──────────────────────┘
│
┌───────┴────────┐
│ │
┌──────▼──────┐ ┌─────▼──────────┐
│ 识别功能 │ │ 配置管理 │
│ - 文件识别 │ │ - 语言选择 │
│ - Bitmap识别 │ │ - 引擎模式 │
│ - 批量识别 │ │ - 白名单 │
└─────────────┘ │ - 预处理开关 │
└────────────────┘
│
┌──────▼────────┐
│ OCRTraining │
│ Helper │
│ (训练工具) │
└───────────────┘
OCREngine (单例)
├── Instance # 默认实例
├── GetInstance(language) # 按语言获取实例
├── GetInstance(config) # 按配置获取实例
├── RecognizeText(path) # 识别图片文件
├── RecognizeFromBitmap(bitmap) # 从Bitmap识别
├── RecognizeBatch(paths[]) # 批量识别
└── Dispose() # 释放资源
OCRConfig (配置类)
├── Language # 语言代码
├── EngineMode # 引擎模式
├── Whitelist # 字符白名单
├── EnablePreprocessing # 预处理开关
└── PageSegMode # 页面分割模式
OCRResult (结果类)
├── Text # 识别文本
├── Confidence # 置信度
├── ElapsedMilliseconds # 耗时
├── Success # 是否成功
└── Error # 错误信息
OCRTrainingHelper (训练工具)
├── PreprocessTrainingImages() # 批量预处理
├── GenerateLabelFiles() # 生成标注
├── ValidateDataset() # 验证数据集
├── AnalyzeCharacterFrequency() # 分析字符频率
├── GenerateTrainingScript() # 生成训练脚本
└── CreateSampleProject() # 创建示例项目
var engine = OCREngine.Instance;
var result = engine.RecognizeText("image.png");
Console.WriteLine(result.Text);
var engine = OCREngine.GetInstance("chi_sim+eng");
var result = engine.RecognizeText("chinese_image.png");
var config = new OCRConfig
{
Language = "eng",
EngineMode = EngineMode.LstmOnly,
Whitelist = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",
EnablePreprocessing = true
};
var engine = OCREngine.GetInstance(config);
var result = engine.RecognizeText("serial_number.png");
string[] images = Directory.GetFiles("folder", "*.png");
var engine = OCREngine.Instance;
Parallel.ForEach(images, path =>
{
var result = engine.RecognizeText(path);
Console.WriteLine($"{path}: {result.Text}");
});
// 产品序列号识别
var config = new OCRConfig
{
Language = "eng",
Whitelist = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-",
EngineMode = EngineMode.LstmOnly,
EnablePreprocessing = true
};
var engine = OCREngine.GetInstance(config);
while (true)
{
var image = CaptureCamera(); // 相机采集
var result = engine.RecognizeFromBitmap(image);
if (result.Success && result.Confidence > 90)
{
SaveToDatabase(result.Text);
break;
}
}
| 优化项 | 优化前 | 优化后 | 提升幅度 |
|---|---|---|---|
| 引擎模式 | Default | LstmOnly | ⚡ 30-50% |
| 字符白名单 | 无 | 限制字符集 | ⚡ 40-60% + 🎯 准确率↑ |
| 图像预处理 | 无 | 启用 | 🎯 准确率 10-20%↑ |
| 单例复用 | 每次创建 | 复用实例 | ⚡ 80-90% |
| 并行处理 | 串行 | Parallel | ⚡ N倍(CPU核数) |
| 图片裁剪 | 全图 | ROI区域 | ⚡ 50-70% |
new OCRConfig {
Language = "eng",
EngineMode = EngineMode.LstmOnly,
EnablePreprocessing = true
}
new OCRConfig {
Language = "eng",
EngineMode = EngineMode.LstmOnly,
Whitelist = "0123456789.",
EnablePreprocessing = true
}
new OCRConfig {
Language = "chi_sim+eng",
EngineMode = EngineMode.Default,
EnablePreprocessing = true
}
new OCRConfig {
Language = "eng",
EngineMode = EngineMode.LstmOnly,
Whitelist = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-",
PageSegMode = PageSegMode.SingleLine,
EnablePreprocessing = true
}
1. 收集样本 (100-500张)
↓
2. 标注文本 (.txt文件)
↓
3. 预处理图片 (灰度化、二值化)
↓
4. 生成box文件 (jTessBoxEditor)
↓
5. 命令行训练 (train.bat)
↓
6. 测试验证
↓
7. 部署使用 (.traineddata)
// 创建训练项目
OCRTrainingHelper.CreateSampleProject(@"D:\MyProject");
// 批量预处理
OCRTrainingHelper.PreprocessTrainingImages(
@"D:\MyProject\raw",
@"D:\MyProject\processed",
targetWidth: 800
);
// 验证数据集
OCRTrainingHelper.ValidateDataset(@"D:\MyProject\processed");
// 生成训练脚本
OCRTrainingHelper.GenerateTrainingScript(
"myfont",
@"D:\MyProject\train.bat"
);
✅ 需要训练的场景
❌ 不需要训练的场景
| 场景 | 图片尺寸 | 平均耗时 | 准确率 | 备注 |
|---|---|---|---|---|
| 英文文本 | 800x600 | 50-100ms | 95%+ | LSTM模式 |
| 中文文本 | 800x600 | 100-200ms | 90%+ | chi_sim |
| 数字序列 | 400x100 | 20-50ms | 98%+ | 白名单优化 |
| 字母数字 | 400x100 | 30-60ms | 96%+ | 白名单优化 |
| 批量10张 | 800x600 | 500-1000ms | - | 并行处理 |
| 批量100张 | 800x600 | 5-10s | - | 并行处理 |
注:实际性能取决于图片质量、复杂度和系统负载
EnablePreprocessing = trueWhitelistEngineMode.LstmOnly完整列表见 Tesseract 语言包
常用语言:
eng - 英语chi_sim - 简体中文chi_tra - 繁体中文jpn - 日语kor - 韩语// 定期清理
OCREngine.Cleanup();
// 或使用 using
using (var engine = OCREngine.GetInstance("eng"))
{
// 使用后自动释放
}
使用 OpenCvSharp 进行矫正:
using (var src = Cv2.ImRead("image.png"))
{
// 检测并矫正倾斜
// ...
var result = engine.RecognizeFromBitmap(src.ToBitmap());
}
tesseract-ocr本项目使用的第三方库:
本 OCR 识别方案提供了:
✅ 快速 - 优化的 LSTM 引擎,毫秒级响应
✅ 稳定 - 工业级验证,异常处理完善
✅ 准确 - 支持自定义训练,满足特殊需求
✅ 易用 - 简洁 API,5分钟上手
✅ 灵活 - 丰富配置,适应各种场景
✅ 可扩展 - 模块化设计,易于定制
适用于:
开始使用吧! 🚀
最后更新:2026-05-08