[cmake]基于C++使用纯opencv部署ppocrv5v6的onnx模型源码

作品简介

 



项目简介

本项目是 C++ 控制台实现 ,通过动态加载 PPOCR.dll 调用 PaddleOCR v5/v6 系列 ONNX 模型,在Windows平台使用 OpenCV DNN推理引擎实现本地文字识别。程序以控制台交互方式运行,支持多套模型切换、循环批量识别,结构清晰、依赖简洁。

算法原理

整体 OCR 流水线

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

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

使用 DB(Differentiable Binarization) 算法检测文字区域:

  1. 1. 将输入图片等比缩放至 limit_side_len = 960 ,保持长宽比
  2. 2. 通过轻量级 CNN 骨干网络(MobileNetV3 / ResNet)提取多尺度特征
  3. 3. 使用 FPN(Feature Pyramid Network)融合多尺度特征图
  4. 4. 输出概率图,经阈值化( det_db_thresh = 0.3 )生成二值图
  5. 5. 对二值图做轮廓检测,使用 Vatti 裁剪算法膨胀( det_db_unclip_ratio = 1.6 )得到最终文字区域多边形框
  6. 6. 过滤置信度低于 det_db_box_thresh = 0.6 的框
2. 方向分类(Classification,可选)
  • • 仅 PPOCRv5 Mobile 模型默认启用
  • • 使用轻量级分类模型判断文字区域是否需要旋转 180°
  • • 分类阈值 cls_thresh = 0.9
3.文字识别(Recognition)

使用 CRNN + CTC 架构进行文字识别:

  1. 1. 将检测到的文字区域裁剪并缩放到统一高度( rec_img_h = 48 )
  2. 2. 通过 CNN 提取视觉特征序列
  3. 3. 使用 BiLSTM 编码序列上下文
  4. 4. 通过 CTC(Connectionist Temporal Classification)解码输出文字
  5. 5. 支持批量推理( rec_batch_num = 4 )提升效率

推理引擎

程序通过动态加载 PPOCR.dll (C 接口),底层使用 Intel OpenVINO 推理引擎,支持:

  • • ONNX 模型格式直接加载
  • • CPU 推理
  • • 多线程推理( predictor_num = 4 )

支持的模型

模型名称检测模型识别模型方向分类说明PPOCRv5 MobilePP-OCRv5_mobile_detPP-OCRv5_mobile_rec支持轻量级,适合嵌入式场景PPOCRv5 ServerPP-OCRv5_server_detPP-OCRv5_server_rec不支持高精度,适合服务器部署PPOCRv6 TinyPP-OCRv6_tiny_detPP-OCRv6_tiny_rec不支持最小体积,速度最快PPOCRv6 SmallPP-OCRv6_small_detPP-OCRv6_small_rec不支持平衡精度与速度(推荐)

环境要求

项目要求操作系统Windows 10 / 11 x64编译工具链Visual Studio 2019 及以上(MSVC v142+)CMake 版本3.20 及以上C++ 标准C++17平台架构x64(必须)OpenCV 版本5.0(world 构建版本)推理引擎opencv5.0(已封装在 PPOCR.dll 内)

依赖文件

文件名说明PPOCR.dllOCR 推理核心 DLL(封装 OpenCV + PPOCR 算法)opencv_world500.dllOpenCV 5.0 运行时库inference/ 目录ONNX 模型文件及字典文件

安装步骤

1. 准备源码

cd C:\Users\Administrator\Downloads\code
# 确保 FIRC_CPP 目录已存在

2. 准备 lib 目录

在项目根目录下创建 lib/ 文件夹,放入以下文件:

FIRC_CPP/
└── lib/
    ├── PPOCR.dll
    └── inference/
        ├── PP-OCRv5_mobile_det_onnx.onnx
        ├── PP-OCRv5_mobile_rec_onnx.onnx
        ├── PP-OCRv5_mobile_cls_onnx.onnx
        ├── PP-OCRv5_server_det_infer.onnx
        ├── PP-OCRv5_server_rec_infer.onnx
        ├── PP-OCRv6_small_det.onnx
        ├── PP-OCRv6_small_rec.onnx
        ├── PP-OCRv6_small_rec_dict.txt
        ├── PP-OCRv6_tiny_det.onnx
        ├── PP-OCRv6_tiny_rec.onnx
        ├── PP-OCRv6_tiny_rec_dict.txt
        └── ppocrv5_dict.txt

3. 配置OpenCV路径

打开 CMakeLists.txt ,确认以下两处路径与本机实际路径一致:

set(OpenCV_DIR "D:\\lufiles\\opencv500\\build\\x64\\vc16\\lib")   # OpenCV .lib 所在目录
set(OPENCV_BIN_DIR "D:/lufiles/opencv500/build/x64/vc16/bin" ...) # OpenCV .dll 所在目录

4.CMake生成工程

cd C:\Users\Administrator\Downloads\code\FIRC_CPP
cmake -B build -G "Visual Studio 16 2019" -A x64
若使用 VS2022,将生成器替换为 "Visual Studio 17 2022" 。


5. 编译

cmake --build build --config Release

编译完成后,CMake post-build步骤会自动将以下文件复制到输出目录 build\Release\ :

  • • PPOCR.dll (从 lib/ )
  • • opencv_world500.dll (从 OpenCV bin 目录)
  • • inference/ 整个目录(从 lib/inference/ )

运行步骤

1. 启动程序

cd build\Release

# 交互模式(启动后手动输入图片路径)
.\FIRC_CPP.exe


### 2. 选择模型

程序启动后显示模型菜单:

===== 选择 OCR 模型 =====

[1] v5 mobile

[2] v5 server

[3] v6 small

[4] v6 tiny

请选择 (1-4,默认4):

输入数字选择模型,直接回车默认使用 **v6 tiny**。

### 3. 输入图片路径

请输入图片路径 (直接回车使用 3.jpg): test.jpg

程序自动识别并输出结果:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

耗时: 186.32 ms | 识别到 5 个文本区域

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[1] 你好世界 (score=0.97) box: (10,20) (200,20) (200,60) (10,60)

[2] Hello OCR (score=0.95) box: …

…

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

### 4. 循环识别

识别完成后程序不退出,可继续输入新的图片路径进行识别:

请输入图片路径 (回车重新识别当前图片,q 退出): another.jpg

- **直接回车**:重新识别当前图片
- **输入新路径**:识别新图片
- **输入 `q`**:退出程序,自动释放模型资源

---

## 注意事项

1. **必须使用 x64 平台**:`PPOCR.dll` 和 `opencv_world500.dll` 均为 64 位,不支持 x86。

2. **CMake 缓存问题**:修改 `CMakeLists.txt` 中的 `CACHE` 变量(如 `PPOCR_DIR`、`OPENCV_BIN_DIR`)后,需要删除 `build/` 目录重新生成,否则旧值会被缓存:
   ```powershell
   Remove-Item build -Recurse -Force
   cmake -B build -G "Visual Studio 16 2019" -A x64
  1. 1. 中文路径支持 :程序内置了中文路径兼容处理(先尝试 cv::imread ,失败后回退到二进制读取 + cv::imdecode ),但建议使用纯英文路径以避免潜在问题。
  2. 2. 控制台中文显示 :程序启动时调用 SetConsoleOutputCP(65001) 将控制台切换为 UTF-8 编码。推荐使用 Windows Terminal 运行,旧版 cmd.exe 的某些字体可能出现显示异常。
  3. 3. 模型文件完整性 : inference/ 目录下的 ONNX 模型和字典文件必须完整,缺失任一会导致对应模型初始化失败。
  4. 4. 内存占用 :Server 模型(v5 server)文件体积较大(约 170MB),加载时内存占用较高。内存不足时建议使用 Tiny 或 Small 模型。
  5. 5. CPU 推理性能 :默认使用 CPU 推理,大尺寸图片识别耗时较长。可通过修改 main.cpp 中的 limit_side_len 、 rec_batch_num 、 predictor_num 等参数调整性能。
  6. 6. DLL 加载失败排查 :若启动时提示"无法加载 PPOCR.dll",请确认:
  • • PPOCR.dll 已正确复制到 build\Release\ 目录
  • • opencv_world500.dll 与 PPOCR.dll 在同一目录
  • • 系统 PATH 中没有冲突的旧版本 OpenCV DLL

文件夹结构

FIRC_CPP/
├── CMakeLists.txt              # CMake 构建配置
├── src/
│   ├── main.cpp                # 控制台主程序入口
│   ├── ocr_engine.h            # OCREngine 封装类声明
│   ├── ocr_engine.cpp          # OCREngine 实现(动态加载 PPOCR.dll)
│   └── json_parser.h           # 极简 JSON 解析器(解析 OCR 结果)
├── lib/                        # 运行时依赖(需手动准备)
│   ├── PPOCR.dll               # OCR 推理核心 DLL
│   └── inference/              # ONNX 模型及字典文件
│       ├── PP-OCRv5_mobile_det_onnx.onnx
│       ├── PP-OCRv5_mobile_rec_onnx.onnx
│       ├── PP-OCRv5_mobile_cls_onnx.onnx
│       ├── PP-OCRv5_server_det_infer.onnx
│       ├── PP-OCRv5_server_rec_infer.onnx
│       ├── PP-OCRv6_small_det.onnx
│       ├── PP-OCRv6_small_rec.onnx
│       ├── PP-OCRv6_small_rec_dict.txt
│       ├── PP-OCRv6_tiny_det.onnx
│       ├── PP-OCRv6_tiny_rec.onnx
│       ├── PP-OCRv6_tiny_rec_dict.txt
│       └── ppocrv5_dict.txt
└── build/                      # CMake 构建输出(自动生成)
    └── Release/
        ├── FIRC_CPP.exe        # 编译输出可执行文件
        ├── PPOCR.dll           # 自动从 lib/ 复制
        ├── opencv_world500.dll # 自动从 OpenCV bin 复制
        └── inference/          # 自动从 lib/inference/ 复制

 

创作时间: