基于C#winform使用纯opencv部署ppocrv5和ppocrv6的onnx模型进行OCR文件检测识别

使用纯opencv实现PaddleOCR v5/v6 OCR识别

项目简介

这是一个基于 C# Windows Forms 的桌面端 OCR(光学字符识别)应用程序,通过集成百度 PaddleOCR v5/v6 系列模型,利用 OpenCV DNN 推理引擎在本地实现高效的文字检测与识别。用户可通过图形界面选择图片,一键完成文字识别,并在界面上直观查看识别结果与文字区域标注框。


算法原理

整体 OCR 流水线

本项目采用经典的三阶段 OCR 流水线架构:

复制代码
输入图片 → 文字检测(Det) → 方向分类(Cls,可选) → 文字识别(Rec) → 输出结果
1. 文字检测(Detection)

使用 DB(Differentiable Binarization)算法进行文字区域检测,主要步骤如下:

  1. 将输入图片按比例缩放,使最长边不超过 limit_side_len(默认 960 像素),保持原始长宽比
  2. 通过轻量级 CNN 骨干网络提取多尺度特征
  3. 使用 FPN(Feature Pyramid Network)融合多尺度特征图,输出概率图(Probability Map)
  4. 对概率图以阈值 det_db_thresh(默认 0.3)进行二值化处理
  5. 对二值图进行轮廓检测,使用 Vatti 裁剪算法按 det_db_unclip_ratio(默认 1.6)进行膨胀扩张,得到完整的文字区域多边形框
  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 架构进行端到端文字识别,主要步骤如下:

  1. 将每个检测到的文字区域裁剪并缩放到统一尺寸(高度 rec_img_h = 48,宽度 rec_img_w = 320
  2. 通过 CNN 骨干网络提取视觉特征序列
  3. 使用 BiLSTM(双向长短期记忆网络)编码序列上下文信息
  4. 通过 CTC(Connectionist Temporal Classification)解码输出最终识别文字
  5. 支持批量推理,批次大小由 rec_batch_num(默认 4)控制,提升多行文字的处理效率
  6. 多 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. 下载项目源码

bash 复制代码
git clone firc-projects
cd FIRC

2. 安装 Visual Studio

确保已安装 Visual Studio 2019 或更高版本,并勾选 .NET 桌面开发 工作负载。

3. 打开解决方案

双击 FIRC.sln 文件,在 Visual Studio 中打开项目。

4. 配置构建平台

在 Visual Studio 顶部工具栏中进行以下设置:

  • 解决方案平台 切换为 x64(必须,不支持 x86)
  • 解决方案配置 切换为 DebugRelease

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.3
  • det_db_box_thresh:检测框置信度阈值,默认 0.6
  • det_db_unclip_ratio:文字框膨胀比例,默认 1.6

rec(识别参数):

  • rec_batch_num:识别批次大小,默认 4
  • rec_predictor_num:Predictor 并行数量,默认 4

cls(分类参数,仅 v5 mobile 生效):

  • cls:是否启用方向分类,默认关闭
  • cls_batch_num:分类批次大小,默认 8

4. 加载模型

点击右上角 "初始化" 按钮,等待日志区域显示 模型加载成功 信息。首次加载大模型可能需要数秒,Server 模型加载时间更长。

5. 选择并识别图片

  • 点击 "选择图片" 按钮,从文件对话框中选择待识别图片(支持 BMP、JPG/JPEG、PNG、TIFF/TIF 格式)
  • 选择图片后会自动触发识别 ,也可手动点击 "识别" 按钮重新执行
  • 识别完成后:
    • 左侧图片区域:显示带有红色文字检测多边形框的标注图
    • 右侧文本区域:显示识别文字结果及耗时(毫秒)
    • 勾选 "显示全部信息" 可查看完整的 JSON 格式结果(含坐标、置信度等详细信息)

6. 释放模型资源

  • 再次点击 "初始化" 按钮可先释放再重新加载模型
  • 关闭窗口时程序会自动释放模型资源

注意事项

  1. 强制 x64 平台opencv_world500.dll 为 64 位库,项目必须以 x64 平台编译运行,不支持 x86。

  2. 模型文件完整性inference/ 目录下的 ONNX 模型文件和字典文件必须完整,缺失任一将导致对应模型初始化失败。

  3. 工作目录 :程序从 FIRC.exe 所在目录查找 inference/ 文件夹,请确保从正确的编译输出目录运行,或将模型文件复制到可执行文件同级目录。

  4. 内存占用:v5 server 模型文件较大(检测模型约 84MB,识别模型约 80MB),加载后内存占用较高,建议在内存充足的环境下使用。

  5. 图片输入格式:程序内部将图片转换为 24 位 BGR 格式(OpenCV 标准格式)送入推理引擎,建议使用清晰、无过度压缩的图片以获得最佳识别效果。

  6. 参数调节建议

    • det_db_thresh 降低可检出更多文字区域,但可能增加误检
    • det_db_box_thresh 降低可保留更多低置信度检测框
    • det_db_unclip_ratio 增大可扩大文字框范围,适合模糊文字
    • 调整参数后需重新点击 "初始化" 使参数生效
  7. 方向分类限制cls 方向分类功能仅对 v5 mobile 模型有效,其他模型不支持该功能,勾选无效。

  8. 模型切换 :切换模型选项后,必须重新点击 "初始化" 按钮才能加载新模型。


文件夹结构

复制代码
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                        # 程序入口点
相关推荐
江畔柳前堤2 小时前
agent面试题
数据库·人工智能·opencv·数据挖掘·语音识别·agent
小满Autumn7 小时前
log4net 日志框架 — 从配置到实战速查手册
笔记·c#·.net·wpf·上位机·log4net
JaydenAI12 小时前
[对比学习LangChain和MAF-07]如何引入人机交互的审批流程
python·ai·langchain·c#·agent·hitl·maf
AI人工智能+12 小时前
智能文档抽取系统以专业的文档解析底座和大模型智能语义理解能力为核心,洞察文档的语义内涵与逻辑结构
深度学习·自然语言处理·ocr·文档抽取
北域码匠14 小时前
SHA-1算法:安全哈希原理与应用解析
算法·c#·哈希算法
123的故事14 小时前
工具分享(7)-多Excel文件内容查询工具
c#·excel·实用工具
iCxhust17 小时前
C#进程管理程序
开发语言·汇编·stm32·单片机·c#·微机原理
无心水18 小时前
27、私有化部署|PaddleOCR-Server 本地OCR服务搭建
金融·pdf·ocr·pdf解析·pdf抽取·pdf提取·ocr服务
Java患者·18 小时前
《Python 人脸识别入门实践:从人脸检测到人脸比对完整实现》
开发语言·python·opencv·目标检测·计算机视觉·目标跟踪·视觉检测