简介:本文详细介绍如何在C#环境中集成PaddleOCR开源库实现图片文字识别,涵盖环境配置、核心代码实现、性能优化及常见问题解决方案,帮助开发者快速构建高效OCR应用。
PaddleOCR作为百度开源的OCR工具库,凭借其多语言支持(中/英/日等80+语言)、高精度识别(中文场景准确率超95%)和轻量化模型(最小仅4.7MB)成为开发者首选。相较于Tesseract等传统方案,PaddleOCR在中文识别、复杂排版处理和推理速度上具有显著优势,尤其适合需要处理中文文档、票据等场景的C#应用。
<ItemGroup><PackageReference Include="PaddleOCRSharp" Version="2.6.0" /><PackageReference Include="OpenCvSharp4" Version="4.5.5" /></ItemGroup>
模型文件下载:
ch_PP-OCRv3_det_infer、ch_PP-OCRv3_rec_infer、ppocr_keys_v1.txt)./models目录下环境变量配置:
Environment.SetEnvironmentVariable("PADDLE_OCR_MODEL_DIR", "./models");
using PaddleOCRSharp;using System.Drawing;public class OCRService{private readonly PPOCR _ocr;public OCRService(){var options = new PPOCROptions{DetModelPath = "./models/ch_PP-OCRv3_det_infer",RecModelPath = "./models/ch_PP-OCRv3_rec_infer",ClsModelPath = null, // 可选:方向分类模型UseGpu = false, // 根据硬件配置调整GpuMem = 1024};_ocr = new PPOCR(options);}public List<OCRResult> RecognizeImage(string imagePath){using var image = Image.FromFile(imagePath);var results = _ocr.Run(image);return results;}}public class OCRResult{public string Text { get; set; }public float Confidence { get; set; }public Rectangle Position { get; set; }}
public async Task<List<OCRResult>> BatchRecognizeAsync(List<string> imagePaths){var tasks = imagePaths.Select(path => Task.Run(() => RecognizeImage(path)));var results = await Task.WhenAll(tasks);return results.SelectMany(r => r).ToList();}
public List<OCRResult> RecognizePdf(string pdfPath){using var reader = new PdfReader(pdfPath);var strategy = new SimpleTextExtractionStrategy();var results = new List<OCRResult>();for (int i = 1; i <= reader.NumberOfPages; i++){var text = PdfTextExtractor.GetTextFromPage(reader, i, strategy);if (!string.IsNullOrEmpty(text)){results.Add(new OCRResult { Text = text });}}return results;}
UseGpu = true后,推理速度提升3-5倍(需安装CUDA和cuDNN)int8量化可将模型体积缩小4倍,速度提升2倍
var options = new PPOCROptions {Quantize = true,QuantType = QuantType.QUANT_INT8};
public Bitmap PreprocessImage(Bitmap original){// 灰度化var gray = new Bitmap(original.Width, original.Height);using (var g = Graphics.FromImage(gray)){var colorMatrix = new ColorMatrix{Matrix00 = 0.299f, Matrix01 = 0.299f, Matrix02 = 0.299f,Matrix10 = 0.587f, Matrix11 = 0.587f, Matrix12 = 0.587f,Matrix20 = 0.114f, Matrix21 = 0.114f, Matrix22 = 0.114f};var attributes = new ImageAttributes();attributes.SetColorMatrix(colorMatrix);g.DrawImage(original, new Rectangle(0, 0, original.Width, original.Height),0, 0, original.Width, original.Height,GraphicsUnit.Pixel, attributes);}return gray;}
public string PostProcessText(List<OCRResult> results){// 去除重复文本var distinctResults = results.GroupBy(r => r.Text).Select(g => g.OrderByDescending(r => r.Confidence).First()).ToList();// 合并相邻文本var mergedText = new StringBuilder();for (int i = 0; i < distinctResults.Count; i++){mergedText.Append(distinctResults[i].Text);if (i < distinctResults.Count - 1){// 根据位置判断是否需要添加空格var nextPos = distinctResults[i + 1].Position;var currentPos = distinctResults[i].Position;if (nextPos.X > currentPos.X + currentPos.Width * 1.5){mergedText.Append(" ");}}}return mergedText.ToString();}
System.DllNotFoundException: paddle_inference.dllpaddle_inference.dll复制到程序运行目录det_db_thresh(默认0.3)和det_db_box_thresh(默认0.5)参数rec_batch_num(默认6)以提升长文本识别效果PP-OCRv4模型
// 使用IDisposable模式管理资源public class OCRService : IDisposable{private bool _disposed = false;public void Dispose(){if (!_disposed){_ocr?.Dispose();_disposed = true;}GC.SuppressFinalize(this);}~OCRService() => Dispose();}
本文系统介绍了C#集成PaddleOCR的全流程,从环境配置到性能优化提供了完整解决方案。实际开发中,建议优先测试PP-OCRv3模型,在CPU环境下可达到300ms/张的识别速度(300dpi图片)。更多高级功能可参考PaddleOCR官方文档。
推荐学习资源: