使用纯opencv实现PaddleOCR v5/v6 OCR识别
项目简介
这是一个基于 C# Windows Forms 的桌面端 OCR(光学字符识别)应用程序,通过集成百度 PaddleOCR v5/v6 系列模型,利用 OpenCV DNN 推理引擎在本地实现高效的文字检测与识别。用户可通过图形界面选择图片,一键完成文字识别,并在界面上直观查看识别结果与文字区域标注框。
算法原理
整体 OCR 流水线
本项目采用经典的三阶段 OCR 流水线架构:
输入图片 → 文字检测(Det) → 方向分类(Cls,可选) → 文字识别(Rec) → 输出结果1. 文字检测(Detection)
使用 DB(Differentiable Binarization)算法进行文字区域检测,主要步骤如下:
- 将输入图片按比例缩放,使最长边不超过
limit_side_len(默认 960 像素),保持原始长宽比 - 通过轻量级 CNN 骨干网络提取多尺度特征
- 使用 FPN(Feature Pyramid Network)融合多尺度特征图,输出概率图(Probability Map)
- 对概率图以阈值
det_db_thresh(默认 0.3)进行二值化处理 - 对二值图进行轮廓检测,使用 Vatti 裁剪算法按
det_db_unclip_ratio(默认 1.6)进行膨胀扩张,得到完整的文字区域多边形框 - 过滤置信度低于
det_db_box_thresh(默认 0.6)的检测框,得到最终检测结果
2. 方向分类(Classification,可选)
- 仅在勾选
cls复选框后启用,默认关闭 - 使用轻量级分类模型(PP-OCRv5_mobile_cls_onnx.onnx)判断文字区域是否存在 180° 倒置
- 分类阈值
cls_thresh = 0.9,高于该阈值时执行翻转校正 - 批量处理数量由
cls_batch_num(默认 8)控制
3. 文字识别(Recognition)
使用 CRNN + CTC 架构进行端到端文字识别,主要步骤如下:
- 将每个检测到的文字区域裁剪并缩放到统一尺寸(高度
rec_img_h = 48,宽度rec_img_w = 320) - 通过 CNN 骨干网络提取视觉特征序列
- 使用 BiLSTM(双向长短期记忆网络)编码序列上下文信息
- 通过 CTC(Connectionist Temporal Classification)解码输出最终识别文字
- 支持批量推理,批次大小由
rec_batch_num(默认 4)控制,提升多行文字的处理效率 - 多 Predictor 并行推理,数量由
rec_predictor_num(默认 4)控制
推理引擎
项目通过C++ DLL封装库C#调用OpenCV DNN 模块作为推理后端,直接加载 ONNX 格式模型,具有以下特点:
- 无需额外安装 OpenVINO、CUDA 等推理框架,部署简单
- 原生支持 CPU 推理,兼容性强
- 通过 C# P/Invoke 调用 C++ 原生接口,性能接近原生水平
- 图像数据以 BGR 24位格式直接传入,避免不必要的格式转换开销
支持的模型
| 模型选项 | 检测模型 | 识别模型 | 方向分类 | 字典文件 | 说明 |
|---|---|---|---|---|---|
| v5 mobile | PP-OCRv5_mobile_det_onnx.onnx | PP-OCRv5_mobile_rec_onnx.onnx | 支持(可选) | ppocrv5_dict.txt | 轻量级,支持方向分类 |
| v5 server | PP-OCRv5_server_det_infer.onnx | PP-OCRv5_server_rec_infer.onnx | 不支持 | ppocrv5_dict.txt | 高精度大模型 |
| v6 tiny | PP-OCRv6_tiny_det.onnx | PP-OCRv6_tiny_rec.onnx | 不支持 | PP-OCRv6_tiny_rec_dict.txt | 体积最小,速度最快(默认) |
| v6 small | PP-OCRv6_small_det.onnx | PP-OCRv6_small_rec.onnx | 不支持 | PP-OCRv6_small_rec_dict.txt | 精度与速度均衡 |
环境要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows 10 / 11(64位) |
| 开发工具 | Visual Studio 2019 及以上版本 |
| .NET 版本 | .NET Framework 4.8 |
| 平台架构 | x64(强制要求) |
| C# 语法版本 | C# 7.3 |
核心依赖库
| 文件 | 说明 |
|---|---|
| opencv_world500.dll | OpenCV 5.0 运行时库(包含 DNN 推理模块) |
| Newtonsoft.Json.dll(13.0.1) | JSON 序列化/反序列化库 |
安装步骤
1. 下载项目源码
gitclone firc-projectscdFIRC2. 安装 Visual Studio
确保已安装 Visual Studio 2019 或更高版本,并勾选.NET 桌面开发工作负载。
3. 打开解决方案
双击FIRC.sln文件,在 Visual Studio 中打开项目。
4. 配置构建平台
在 Visual Studio 顶部工具栏中进行以下设置:
- 将解决方案平台切换为x64(必须,不支持 x86)
- 将解决方案配置切换为Debug或Release
5. 确认运行时依赖文件
确保编译输出目录(bin\x64\Debug\)中包含以下关键文件:
bin\x64\Debug\ ├── opencv_world500.dll # OpenCV 运行时 ├── Newtonsoft.Json.dll # JSON 库 ├── FIRC.exe # 主程序 └── inference/ # 模型文件夹(必须完整)如依赖文件缺失,请从发布包或原始编译目录中复制补充。
运行步骤
1. 编译启动
在 Visual Studio 中按F5编译运行,或直接运行已编译的FIRC.exe。
2. 选择 OCR 模型
在主界面左上角“ocr”分组框中选择模型:
v5 mobile:PPOCRv5 轻量移动端模型,支持方向分类v5 server:PPOCRv5 高精度服务器模型v6 small:PPOCRv6 平衡型模型v6 tiny:PPOCRv6 最小体积模型(默认选中)
3. 调整推理参数(可选)
主界面提供以下可调参数分组:
det(检测参数):
det_db_thresh:检测二值化阈值,默认 0.3det_db_box_thresh:检测框置信度阈值,默认 0.6det_db_unclip_ratio:文字框膨胀比例,默认 1.6
rec(识别参数):
rec_batch_num:识别批次大小,默认 4rec_predictor_num:Predictor 并行数量,默认 4
cls(分类参数,仅 v5 mobile 生效):
cls:是否启用方向分类,默认关闭cls_batch_num:分类批次大小,默认 8
4. 加载模型
点击右上角“初始化”按钮,等待日志区域显示模型加载成功信息。首次加载大模型可能需要数秒,Server 模型加载时间更长。
5. 选择并识别图片
- 点击“选择图片”按钮,从文件对话框中选择待识别图片(支持 BMP、JPG/JPEG、PNG、TIFF/TIF 格式)
- 选择图片后会自动触发识别,也可手动点击“识别”按钮重新执行
- 识别完成后:
- 左侧图片区域:显示带有红色文字检测多边形框的标注图
- 右侧文本区域:显示识别文字结果及耗时(毫秒)
- 勾选“显示全部信息”可查看完整的 JSON 格式结果(含坐标、置信度等详细信息)
6. 释放模型资源
- 再次点击“初始化”按钮可先释放再重新加载模型
- 关闭窗口时程序会自动释放模型资源
注意事项
强制 x64 平台:
opencv_world500.dll为 64 位库,项目必须以 x64 平台编译运行,不支持 x86。模型文件完整性:
inference/目录下的 ONNX 模型文件和字典文件必须完整,缺失任一将导致对应模型初始化失败。工作目录:程序从
FIRC.exe所在目录查找inference/文件夹,请确保从正确的编译输出目录运行,或将模型文件复制到可执行文件同级目录。内存占用:v5 server 模型文件较大(检测模型约 84MB,识别模型约 80MB),加载后内存占用较高,建议在内存充足的环境下使用。
图片输入格式:程序内部将图片转换为 24 位 BGR 格式(OpenCV 标准格式)送入推理引擎,建议使用清晰、无过度压缩的图片以获得最佳识别效果。
参数调节建议:
det_db_thresh降低可检出更多文字区域,但可能增加误检det_db_box_thresh降低可保留更多低置信度检测框det_db_unclip_ratio增大可扩大文字框范围,适合模糊文字- 调整参数后需重新点击“初始化”使参数生效
方向分类限制:
cls方向分类功能仅对 v5 mobile 模型有效,其他模型不支持该功能,勾选无效。模型切换:切换模型选项后,必须重新点击“初始化”按钮才能加载新模型。
文件夹结构
FIRC/ ├── .vs/ # Visual Studio 项目配置(自动生成,无需管理) ├── Properties/ # 项目属性文件 │ ├── AssemblyInfo.cs # 程序集版本与元信息 │ ├── Resources.Designer.cs # 资源文件设计器(自动生成) │ ├── Resources.resx # 项目资源文件 │ ├── Settings.Designer.cs # 设置文件设计器(自动生成) │ └── Settings.settings # 应用程序设置 ├── bin/ │ └── x64/ │ └── Debug/ # x64 Debug 编译输出目录 │ ├── inference/ # OCR 模型文件目录 │ ├── FIRC.exe # 主程序可执行文件 │ ├── FIRC.exe.config # .NET 应用配置文件 │ ├── FIRC.pdb # 调试符号文件 │ ├── opencv_world500.dll # OpenCV 5.0 运行时库 │ ├── Newtonsoft.Json.dll # JSON 处理库 │ ├── 1.jpg # 示例图片 │ └── 3.jpg # 默认加载的示例图片 ├── imgs/ # 示例测试图片目录 │ ├── 00006737.jpg # 测试样本图片 │ ├── 00009282.jpg │ ├── 00015504.jpg │ ├── 00018069.jpg │ └── ... # 更多测试样本 ├── App.config # .NET 应用程序配置文件 ├── FIRC.csproj # C# 项目文件(.NET Framework 4.8,x64) ├── FIRC.sln # Visual Studio 解决方案文件 ├── Form1.cs # 主窗体业务逻辑(模型加载、推理、结果显示) ├── Form1.Designer.cs # 主窗体 UI 界面设计代码 ├── Form1.resx # 主窗体资源文件 ├── OCRResult.cs # OCR 识别结果数据模型(text、score、坐标点) └── Program.cs # 程序入口点