基于 PaddleOCR v5/v6 的 Windows C++ 控制台 OCR 识别程序
项目简介
本项目是C++ 控制台实现,通过动态加载PPOCR.dll调用 PaddleOCR v5/v6 系列 ONNX 模型,在 Windows 平台使用 OpenCV DNN 推理引擎实现本地文字识别。程序以控制台交互方式运行,支持多套模型切换、循环批量识别,结构清晰、依赖简洁。
算法原理
整体 OCR 流水线
采用经典的三阶段 OCR 流水线架构:
输入图片 → 文字检测(Det) → 方向分类(Cls,可选) → 文字识别(Rec) → 输出结果1. 文字检测(Detection)
使用DB(Differentiable Binarization)算法检测文字区域:
- 将输入图片等比缩放至
limit_side_len = 960,保持长宽比 - 通过轻量级 CNN 骨干网络(MobileNetV3 / ResNet)提取多尺度特征
- 使用 FPN(Feature Pyramid Network)融合多尺度特征图
- 输出概率图,经阈值化(
det_db_thresh = 0.3)生成二值图 - 对二值图做轮廓检测,使用 Vatti 裁剪算法膨胀(
det_db_unclip_ratio = 1.6)得到最终文字区域多边形框 - 过滤置信度低于
det_db_box_thresh = 0.6的框
2. 方向分类(Classification,可选)
- 仅 PPOCRv5 Mobile 模型默认启用
- 使用轻量级分类模型判断文字区域是否需要旋转 180°
- 分类阈值
cls_thresh = 0.9
3. 文字识别(Recognition)
使用CRNN + CTC架构进行文字识别:
- 将检测到的文字区域裁剪并缩放到统一高度(
rec_img_h = 48) - 通过 CNN 提取视觉特征序列
- 使用 BiLSTM 编码序列上下文
- 通过 CTC(Connectionist Temporal Classification)解码输出文字
- 支持批量推理(
rec_batch_num = 4)提升效率
推理引擎
程序通过动态加载PPOCR.dll(C 接口),底层使用Intel OpenVINO推理引擎,支持:
- ONNX 模型格式直接加载
- CPU 推理
- 多线程推理(
predictor_num = 4)
支持的模型
| 模型名称 | 检测模型 | 识别模型 | 方向分类 | 说明 |
|---|---|---|---|---|
| PPOCRv5 Mobile | PP-OCRv5_mobile_det | PP-OCRv5_mobile_rec | 支持 | 轻量级,适合嵌入式场景 |
| PPOCRv5 Server | PP-OCRv5_server_det | PP-OCRv5_server_rec | 不支持 | 高精度,适合服务器部署 |
| PPOCRv6 Tiny | PP-OCRv6_tiny_det | PP-OCRv6_tiny_rec | 不支持 | 最小体积,速度最快 |
| PPOCRv6 Small | PP-OCRv6_small_det | PP-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.dll | OCR 推理核心 DLL(封装 OpenCV + PPOCR 算法) |
opencv_world500.dll | OpenCV 5.0 运行时库 |
inference/目录 | ONNX 模型文件及字典文件 |
安装步骤
1. 准备源码
cdC:\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.txt3. 配置 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中文路径支持:程序内置了中文路径兼容处理(先尝试
cv::imread,失败后回退到二进制读取 +cv::imdecode),但建议使用纯英文路径以避免潜在问题。控制台中文显示:程序启动时调用
SetConsoleOutputCP(65001)将控制台切换为 UTF-8 编码。推荐使用Windows Terminal运行,旧版 cmd.exe 的某些字体可能出现显示异常。模型文件完整性:
inference/目录下的 ONNX 模型和字典文件必须完整,缺失任一会导致对应模型初始化失败。内存占用:Server 模型(v5 server)文件体积较大(约 170MB),加载时内存占用较高。内存不足时建议使用 Tiny 或 Small 模型。
CPU 推理性能:默认使用 CPU 推理,大尺寸图片识别耗时较长。可通过修改
main.cpp中的limit_side_len、rec_batch_num、predictor_num等参数调整性能。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/ 复制