ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PaddleOCR 通用 OCR 产线 C++ 本地部署(Windows 篇):从 OpenCV/Paddle Inference 编译到 ppocr.exe 实战

PaddleOCR 通用 OCR 产线 C++ 本地部署(Windows 篇):从 OpenCV/Paddle Inference 编译到 ppocr.exe 实战 PaddleOCR 通用 OCR 产线 C 本地部署Windows 篇从 OpenCV/Paddle Inference 编译到 ppocr.exe 实战【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR本文以 PaddleOCR 仓库中的 Windows C 部署官方指南为核心完整讲解在 Windows 平台上编译 OpenCV、编译/下载 Paddle Inference 预测库、通过 cmake-gui 构建ppocr.exe预测 demo以及模型准备、命令行运行、C API 集成与 FreeType 中文可视化渲染的完整链路。读者按本文操作可在 Visual Studio 2022 CMake 环境下从零编译出可用的通用 OCR 预测程序并将其嵌入自己的 C 工程。本文对应官方文档为 OCR_windows.en.md其主体逻辑与 Linux 版部署文档 保持一致——Windows 版负责如何编译编译完成后的模型准备、命令行参数与 API 集成部分与 Linux 完全相同。编译与运行所需的全部源码位于仓库 deploy/cpp_infer 目录。1. 认识通用 OCR 产线Pipeline在动手编译之前先明确通用 OCR 产线的构成。根据 Linux 部署文档 的说明它由以下五个模块串联而成文档图像方向分类模块可选doc_orientation_classify判断整页文档旋转角度0°/90°/180°/270°文本图像矫正模块可选doc_unwarping对弯曲、褶皱的文档图像做展平矫正文本行方向分类模块可选textline_orientation判断每个文本行是否倒置0°/180°文本检测模块text_detection定位图像中的文本区域文本识别模块text_recognition将检测到的文本行识别为字符串。从源码看产线的默认配置定义在 deploy/cpp_infer/src/configs/OCR.yamluse_doc_preprocessor: True、use_textline_orientation: True其中 DocPreprocessor 子产线又默认启用方向分类与矫正检测模型默认PP-OCRv6_medium_det、识别模型默认PP-OCRv6_medium_rec并内置limit_side_len: 64、thresh: 0.3、box_thresh: 0.6、unclip_ratio: 1.5等检测超参。入口程序为 deploy/cpp_infer/cli.cc其中定义了两种调用方式产线模式ocr、doc_preprocessor与单模块模式text_image_unwarping、doc_img_orientation_classification、textline_orientation_classification、text_detection、text_recognition即编译产物ppocr.exe后第一个位置参数即决定调用哪种模式。2. Windows 环境准备编译通用 OCR 产线 demo 需要如下环境以官方文档为准Windows 操作系统Visual Studio 2022CMake 3.29源码编译与运行所需的工程代码位于仓库 deploy/cpp_infer 目录。整个环境的准备分为两大块OpenCV 库与Paddle Inference 预测库二者都有直接下载预编译包和源码编译两种途径。2.1 编译 OpenCV 库目前仅支持 OpenCV 4.x 系列官方文档以 4.7.0 为例。2.1.1 直接下载预编译包推荐从 OpenCV 官网下载适用于 Windows 的.exe预编译安装包例如opencv-4.7.0-windows.exe。运行后会在当前文件夹解压出opencv/目录其中opencv/build即为预编译库后续编译通用 OCR 产线 demo 时此路径将作为 OpenCV 安装库路径OPENCV_DIR使用。2.1.2 源码编译 OpenCV若需自定义编译特性例如后文第 3.2 节的可视化渲染可下载 OpenCV 4.7.0 源码tgz 包并解压得到opencv-4.7.0/目录随后在 cmake-gui 中按以下四步操作Step 1 构建 Visual Studio 项目在 cmake-gui 中指定opencv-4.7.0源码路径编译生成目录设为opencv-4.7.0/build默认安装路径为opencv-4.7.0/build/install——此安装路径即为后续编译 demo 时使用的 OpenCV 路径Step 2 选择目标平台目标平台选择x64点击 FinishStep 3 生成 Visual Studio 项目搜索BUILD_opencv_world并勾选生成合并的opencv_world库依次点击 Configure → Generate → Open in Project 进入 VS 2022Step 4 执行编译点击生成解决方案完成编译后右键 INSTALL 并生成完成安装。作为参考Linux 版在仓库内提供了自动化编译脚本 deploy/cpp_infer/tools/build_opencv.sh其内部通过 cmake 参数-DCMAKE_INSTALL_PREFIX、-DBUILD_SHARED_LIBSOFF、-DWITH_JPEGON、-DWITH_PNGON、-DWITH_TIFFON等裁剪出仅含图像编解码的最小 OpenCVWindows 下手动配置时可参照这些开关理解哪些功能是 demo 运行所必需的。2.2 编译 / 下载 Paddle Inference 预测库2.2.1 直接下载预编译包推荐Paddle Inference 官网提供 Windows 预测库可根据自身需求选择合适的预编译包下载。解压后得到paddle_inference/目录其结构为paddle_inference ├── paddle # Paddle 核心库和头文件 ├── third_party # 第三方依赖库和头文件 └── version.txt # 版本和编译信息2.2.2 源码编译预测库也可选择自行编译预测库。源码编译可灵活配置各类功能和依赖以适应不同的硬件与软件环境但步骤较繁琐生产环境通常直接使用官方预编译包。3. 编译预测 demoppocr.exe3.1 cmake-gui 配置与编译步骤在编译预测 demo 前请确保已按第 2 节准备好 OpenCV 库和 Paddle Inference 预测库。随后按以下步骤在 cmake-gui 中操作以下以D:\PaddleOCR\deploy\cpp_infer作为示例源码路径Step 1 构建 Visual Studio 项目在 cmake-gui 中指定deploy\cpp_infer源码路径编译生成目录设为deploy\cpp_infer\build。首次点击 Configure 报错属正常现象在后续弹出的编译选项中补充 OpenCV 与 Paddle Inference 路径即可Step 2 选择目标平台选择 x64点击 FinishStep 3 配置 CMake 编译选项关键步骤OPENCV_DIR填写 OpenCV 安装路径OpenCV_DIR与OPENCV_DIR相同PADDLE_LIBPaddle Inference 预测库路径Step 4 生成 Visual Studio 项目依次点击 Configure → Generate → Open in Project进入 VS 2022 编译界面Step 5 执行编译生成解决方案前注意两点——① 将编译配置从Debug切换为Release② 下载dirent.h并拷贝到 VS 的 include 文件夹如C:\Program Files (x86)\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include。编译完成后可执行文件位于deploy/cpp_infer/build/Release/ppocr.exeStep 6 运行预测 demo将下列动态库拷贝到deploy\cpp_infer\build\Release\目录下随后按第 4、5 节即可运行paddle_inference\paddle\lib\paddle_inference.dllpaddle_inference\paddle\lib\common.dlldeploy\cpp_infer\build\bin\Release\abseil_dll.dlldeploy\cpp_infer\build\third_party\clipper_ver6.4.2\cpp\Release\polyclipping.dllopencv-4.7.0\build\install\x64\vc16\bin\opencv_world470.dll注abseil_dll.dll、polyclipping.dll等第三方库由 CMake 构建过程自动下载并编译——从 deploy/cpp_infer/CMakeLists.txt 的download_and_decompress逻辑可见abseil-cpp、clipper_ver6.4.2、nlohmann三个依赖包会在 Configure 阶段从 PaddleX 的 CDN 自动拉取并作为子目录参与构建。3.2 CMake 编译选项的源码级解读Windows 下虽然使用 cmake-gui 勾选配置但底层实际生效的就是 deploy/cpp_infer/CMakeLists.txt 中的 CMake 选项。读懂这些选项才能正确选择预编译包并排查编译错误选项作用默认值PADDLE_LIBPaddle Inference 预测库路径必填未设置会 FATAL_ERROR空OPENCV_DIROpenCV 安装路径必填Windows 下内部会拼接${OPENCV_DIR}/x64/vc16/lib再执行find_package(OpenCV)空WITH_GPU编译 GPU 版 demo需配合 GPU 版预测库Windows 下还需设置CUDA_LIB、CUDNN_LIBOFFWITH_MKL使用 MKL 数学库默认开启Windows 下会追加/openmp编译标志并链接mklml.lib、libiomp5md.libONWITH_STATIC_LIB以静态库方式链接 Paddle默认开启启用/MT并定义STATIC_LIB、YAML_CPP_STATIC_DEFINEONUSE_FREETYPE开启 FreeType 文字渲染可视化中文识别结果时需要见第 6.2 节OFF与 Linux 部署文档 中tools/build.sh的参数表OPENCV_DIR、LIB_DIR、CUDA_LIB_DIR、CUDNN_LIB_DIR、WITH_GPU一一对应。另外注意CMakeLists 中对 Windows 分支有特殊处理例如设置CMAKE_CONFIGURATION_TYPES为Debug;Release、Release 下使用/MT运行时库、将BUILD_opencv_world生成的opencv_world470.dll作为链接目标等因此选择 x64 Release是官方推荐路径。3.3 编译产物与依赖 DLL编译完成后ppocr.exe依赖上述 5 个 DLL 才能运行。其中paddle_inference.dll、common.dll来自预测库abseil_dll.dll来自 CMake 自动构建的 abseil-cpppolyclipping.dll来自 clipper 多边形裁剪库文本检测后处理的膨胀/收缩算法依赖opencv_world470.dll来自 OpenCV 的 world 合并库。务必全部拷贝到Release目录否则运行时会出现找不到 DLL错误。4. 准备模型Windows 文档明确模型准备部分与 Linux 完全一致参考 Linux 版文档 2.2 准备模型 小节。核心要点如下可直接下载 PaddleOCR 提供的官方推理模型下文表格中的链接为官方文档所列来源文档图像方向分类模块可选PP-LCNet_x1_0_doc_oriTop-1 精度 99.06%约 7 MB文本图像矫正模块可选UVDocCER 0.179约 30.3 MB文本行方向分类模块可选PP-LCNet_x1_0_textline_ori默认99.42%6.5 MB或PP-LCNet_x0_25_textline_ori98.85%0.96 MB文本检测模块PP-OCRv5_server_det默认Hmean 83.8%84.3 MB、PP-OCRv5_mobile_det79.0%4.7 MB、PP-OCRv4_server_det69.2%109 MB、PP-OCRv4_mobile_det63.8%4.7 MB文本识别模块PP-OCRv5_server_rec默认86.38%81 MB、PP-OCRv5_mobile_rec81.29%16 MB、PP-OCRv4_server_rec_doc86.58%182 MB、PP-OCRv4_mobile_rec78.74%10.5 MB、PP-OCRv4_server_rec85.19%173 MB。其中 PP-OCRv5_rec 是新一代识别模型用单一模型即可覆盖简体中文、繁体中文、英文、日文以及手写、竖排、拼音、生僻字等复杂文本场景在保证识别效果的同时兼顾推理速度与模型鲁棒性PP-OCRv4_server_rec_doc则基于 PP-OCRv4_server_rec 在中文文档数据混合集上训练增强了对部分繁体、日文与特殊字符的识别能力支持超过 15000 字符。也可自行将训练好的模型导出为推理模型参考 文本检测模块-模型导出 等各模块导出章节。推理模型的目录结构一般为PP-OCRv5_mobile_det |–inference.pdiparams # 模型权重文件 |–inference.json # 模型结构文件JSON 格式 |–inference.yml # 模型配置文件YAML 格式5. 运行预测 demo运行方式同样与 Linux 一致参考 Linux 版文档 2.3 运行预测 demo 小节。命令行入口位于 deploy/cpp_infer/cli.cc通用调用形式为./build/ppocr pipeline_or_module [--param1] [--param2] [...]注意Windows 下可执行文件为build/Release/ppocr.exe若运行中出现程序无响应、异常退出、内存资源耗尽或推理速度极慢等问题可尝试关闭不需要的功能模块或换用更轻量的模型来调整配置。5.1 核心命令行参数输入输出相关参数说明类型默认值input待预测的本地图片必填仅支持jpg、png、jpeg、bmp格式str无save_path推理结果保存路径JSON 结果文件与结果图片都会保存到该路径下str./output通用参数参数说明类型默认值device推理设备如cpu表示 CPU 推理gpu:0表示使用第一张 GPU不设置时使用产线默认值编译时若加-DWITH_GPUON优先使用本机 GPU 0否则用 CPUstr无precision计算精度如fp32、fp16strfp32enable_mkldnn是否开启 MKL-DNN 加速若 MKL-DNN 不可用或模型不支持即使开启也不会加速booltruemkldnn_cache_capacityMKL-DNN 缓存容量int10cpu_threadsPaddleInference CPU 加速库的线程数int8paddlex_configPaddleX 产线配置文件路径str无模块开关参数说明类型默认值use_doc_orientation_classify是否加载并使用文档方向分类模块booltrueuse_doc_unwarping是否加载并使用文本图像矫正模块booltrueuse_textline_orientation是否加载并使用文本行方向分类模块booltrue检测模型相关参数说明类型默认值text_detection_model_name文本检测模型名称传入的模型路径名称与产线默认配置不一致时必须指定strPP-OCRv5_server_dettext_detection_model_dir文本检测模型目录必填str无text_det_limit_side_len文本检测图像边长限制大于 0 的整数int64text_det_limit_type边长限制类型min表示保证图像最短边不小于limit_side_lenmax表示保证最长边不大于limit_side_lenstrmintext_det_thresh文本检测像素阈值输出概率图中得分大于该阈值的像素才被认为是文本像素float0.3text_det_box_thresh文本框阈值检测框内所有像素平均得分大于该阈值才认为是文本区域float0.6text_det_unclip_ratio文本检测区域扩张系数值越大扩张面积越大float1.5text_det_input_shape文本检测输入形状可设置 3 个值分别代表 C、H、Wstr方向分类器相关参数说明类型默认值doc_orientation_classify_model_name文档方向分类模型名称strPP-LCNet_x1_0_doc_oridoc_orientation_classify_model_dir文档方向分类模型目录当use_doc_orientation_classify false时可省略str无textline_orientation_model_name文本行方向分类模型名称strPP-LCNet_x1_0_textline_oritextline_orientation_model_dir文本行方向分类模型目录当use_textline_orientation false时可省略str无textline_orientation_batch_size文本行方向模型批大小int6识别模型相关参数说明类型默认值text_recognition_model_name文本识别模型名称传入的模型路径名称与产线默认识别模型不一致时必须指定strPP-OCRv5_server_rectext_recognition_model_dir文本识别模型目录必填str无text_recognition_batch_size文本识别模型批大小int6text_rec_score_thresh文本识别阈值得分大于该阈值的文本结果才会保留float0.0text_rec_input_shape文本识别输入形状可设置 3 个值分别代表 C、H、Wstr从 deploy/cpp_infer/cli.cc 的GetPipelineMoudleParams()实现可以看到上述所有命令行 flag 会被逐一解析并注入到PaddleOCRParams、TextDetectionParams、TextRecognitionParams等参数结构体中再分发到对应产线或模块完成推理——这就是命令行参数与 C API 参数完全对齐的底层原因。5.2 产线调用示例假设模型目录结构如下models |--PP-LCNet_x1_0_doc_ori_infer |--UVDoc_infer |--PP-LCNet_x1_0_textline_ori_infer |--PP-OCRv5_server_det_infer |--PP-OCRv5_server_rec_infer① 全流程串联文档方向分类 矫正 文本行方向 检测 识别./build/ppocr ocr --input ./general_ocr_002.png --save_path ./output/ \ --doc_orientation_classify_model_dir models/PP-LCNet_x1_0_doc_ori_infer \ --doc_unwarping_model_dir models/UVDoc_infer \ --textline_orientation_model_dir models/PP-LCNet_x1_0_textline_ori_infer \ --text_detection_model_dir models/PP-OCRv5_server_det_infer \ --text_recognition_model_dir models/PP-OCRv5_server_rec_infer \ --device cpu指定save_path后会在该路径下生成标准 JSON 预测结果文件与结果图片。输出示例{ input_path: ./general_ocr_002.png, doc_preprocessor_res: { model_settings: {use_doc_unwarping: true, use_doc_orientation_classify: true}, angle: 0 }, ..., dt_polys: [[[132, 6], [355, 6], [355, 64], [132, 64]], [[424, 9], [689, 9], [689, 59], [424, 59]], ..., [[664, 8], [867, 4], [868, 55], [665, 60]], [[31, 99], [173, 99], [173, 126], [31, 126]]], ..., rec_texts: [登机牌, BOARDING, GPASS, ..., ], ..., }② 文本检测 文本行方向分类 文本识别关闭方向分类与矫正./build/ppocr ocr --input ./general_ocr_002.png --save_path ./output/ \ --doc_orientation_classify_model_dir models/PP-LCNet_x1_0_doc_ori_infer \ --doc_unwarping_model_dir models/UVDoc_infer \ --textline_orientation_model_dir models/PP-LCNet_x1_0_textline_ori_infer \ --text_detection_model_dir models/PP-OCRv5_server_det_infer \ --text_recognition_model_dir models/PP-OCRv5_server_rec_infer \ --use_doc_orientation_classify False \ --use_doc_unwarping False \ --device cpu③ 仅文本检测 文本识别最简组合./build/ppocr ocr --input ./general_ocr_002.png --save_path ./output/ \ --doc_orientation_classify_model_dir models/PP-LCNet_x1_0_doc_ori_infer \ --doc_unwarping_model_dir models/UVDoc_infer \ --textline_orientation_model_dir models/PP-LCNet_x1_0_textline_ori_infer \ --text_detection_model_dir models/PP-OCRv5_server_det_infer \ --text_recognition_model_dir models/PP-OCRv5_server_rec_infer \ --use_doc_orientation_classify False \ --use_doc_unwarping False \ --use_textline_orientation False \ --device cpu5.3 单模块调用示例文档图像方向分类./build/ppocr doc_img_orientation_classification --input ./general_ocr_002.png --save_path ./output/ \ --doc_orientation_classify_model_dir models/PP-LCNet_x1_0_doc_ori_infer \ --device cpu文档图像矫正./build/ppocr text_image_unwarping --input ./general_ocr_002.png --save_path ./output/ \ --doc_unwarping_model_dir models/UVDoc_infer \ --device cpu文本行方向分类./build/ppocr textline_orientation_classification --input ./general_ocr_002.png --save_path ./output/ \ --textline_orientation_model_dir models/PP-LCNet_x1_0_textline_ori_infer \ --device cpu文本检测./build/ppocr text_detection --input ./general_ocr_002.png --save_path ./output/ \ --text_detection_model_dir models/PP-OCRv5_server_det_infer \ --device cpu文本识别./build/ppocr text_recognition --input ./general_ocr_rec_001.png --save_path ./output/ \ --text_recognition_model_dir models/PP-OCRv5_server_rec_infer \ --device cpu文本识别模块的 JSON 输出示例{ res: { input_path: ./general_ocr_rec_001.png, rec_text: 绿洲仕格维花园公寓, rec_score: 0.982409 }从 deploy/cpp_infer/cli.cc 的pred_map可见这 5 种单模块模式分别对应TextImageUnwarping、DocImgOrientationClassification、TextLineOrientationClassification、TextDetection、TextRecognition五个 API 类其实现位于 deploy/cpp_infer/src/api/models/。6. C API 集成命令行适合快速体验与查看结果实际工程中通常需要以代码方式集成。官方文档提供了基于PaddleOCR类的 API 示例详见 Linux 版文档 2.4 C API 集成。由于通用 OCR 产线配置参数较多实例化时使用结构体传参结构体命名规则为产线类名 Params通用 OCR 产线对应的类名为PaddleOCR参数结构体为PaddleOCRParams。#include src/api/pipelines/ocr.h int main(){ PaddleOCRParams params; params.doc_orientation_classify_model_dir models/PP-LCNet_x1_0_doc_ori_infer; // 文档方向分类模型路径 params.doc_unwarping_model_dir models/UVDoc_infer; // 文本图像矫正模型路径 params.textline_orientation_model_dir models/PP-LCNet_x1_0_textline_ori_infer; // 文本行方向分类模型路径 params.text_detection_model_dir models/PP-OCRv5_server_det_infer; // 文本检测模型路径 params.text_recognition_model_dir models/PP-OCRv5_server_rec_infer; // 文本识别模型路径 // params.device gpu; // 使用 GPU 推理需在编译时加 -DWITH_GPUON 选项否则使用 CPU // params.use_doc_orientation_classify false; // 不使用文档方向分类模型 // params.use_doc_unwarping false; // 不使用文本图像矫正模型 // params.use_textline_orientation false; // 不使用文本行方向分类模型 // params.text_recognition_model_name PP-OCRv5_server_rec // 使用 PP-OCRv5_server_rec 模型识别 // params.vis_font_dir your_vis_font_dir; // 编译时加 -DUSE_FREETYPEON 后必须提供对应 ttf 字体文件路径 auto infer PaddleOCR(params); auto outputs infer.Predict(./general_ocr_002.png); for (auto output : outputs) { output-Print(); output-SaveToImg(./output/); output-SaveToJson(./output/); } }从源码看PaddleOCR的构造函数会先执行CheckParams()见 deploy/cpp_infer/src/api/pipelines/ocr.cc当方向分类、矫正、文本行方向等可选模块的模型目录缺失且对应开关未被显式置为false时会返回NotFoundError并终止初始化随后CreatePipeline()内部通过ToOCRPipelineParams将 API 参数转换为产线内部参数OCRPipelineParams创建真正的OCRPipeline。Predict接口同时支持单张图片路径与std::vectorstd::string多图批量输入。7. 拓展功能7.1 多语种文字识别PP-OCRv5 提供覆盖韩语、西班牙语、法语、葡萄牙语、德语、意大利语、俄语、泰语、希腊语等 39 种语言的多语种识别能力详见 Linux 版文档 3.1 多语种文字识别。主要模型与支持语言如下模型支持语言PP-OCRv5_server_rec简体中文、繁体中文、英语、日语PP-OCRv5_mobile_rec简体中文、繁体中文、英语、日语korean_PP-OCRv5_mobile_rec韩语、英语latin_PP-OCRv5_mobile_rec英语、法语、德语、南非荷兰语、意大利语、西班牙语、波斯尼亚语、葡萄牙语、捷克语、威尔士语、丹麦语、爱沙尼亚语、爱尔兰语、克罗地亚语、乌兹别克语、匈牙利语、塞尔维亚语拉丁、印度尼西亚语、奥克语、冰岛语、立陶宛语、毛利语、马来语、荷兰语、挪威语、波兰语、斯洛伐克语、斯洛文尼亚语、阿尔巴尼亚语、瑞典语、斯瓦希里语、他加禄语、土耳其语、拉丁语eslav_PP-OCRv5_mobile_rec俄语、白俄罗斯语、乌克兰语、英语th_PP-OCRv5_mobile_rec泰语、英语el_PP-OCRv5_mobile_rec希腊语、英语en_PP-OCRv5_mobile_rec英语使用时只需在产线或模块命令中传入对应的识别模型即可例如用文本识别模块识别法语./build/ppocr text_recognition \ --input ./french.png \ --text_recognition_model_name latin_PP-OCRv5_mobile_rec \ --text_recognition_model_dir latin_PP-OCRv5_mobile_rec_infer \ --save_path ./output/更详细的多语种说明可参考 PP-OCRv5 多语种识别介绍即仓库内 docs/version3.x/algorithm/PP-OCRv5/PP-OCRv5_multi_languages.en.md。7.2 可视化文本识别结果FreeType 中文渲染OpenCV 默认不带字体渲染能力若要直接可视化中文识别结果需要使用 4.x 版本 opencv_contrib 模块中的FreeType进行字体渲染。为此需下载 OpenCV 与 opencv_contrib 源码并编译包含 FreeType 模块的 OpenCV两者版本必须一致。以下以 opencv-4.7.0 与 opencv_contrib-4.7.0 为例。Step 1编译 freetype 与 harfbuzzWindows 下需分别下载并编译 pkg-config、freetype2、harfbuzz 三个工具/库解压 pkg-config 后将bin目录添加到系统 PATH 环境变量编译 freetype 时在 cmake-gui 中手动指定安装路径Configure → Generate → Open Project 打开 VS 后在 VS 中构建ALL_BUILD与INSTALL会在构建目录的 install 下生成所需的 include 与 lib 文件随后将 freetype 安装路径添加至系统环境变量编译 harfbuzz 时同样手动指定安装路径设置完成后再次 Configure在Advanced Options中填写 freetype 安装路径最后将 harfbuzz 安装路径添加至系统环境变量。Step 2修改 opencv_contrib-4.7.0 下的modules/freetype/CMakeLists.txt由于 cmake 不自带find_package(HarfBuzz)需按如下方式显式指定 harfbuzz 的查找逻辑set(the_description FreeType module. It enables to draw strings with outlines and mono-bitmaps/gray-bitmaps.) find_package(Freetype REQUIRED) # find_package(HarfBuzz) is not included in cmake set(HARFBUZZ_DIR $ENV{HARFBUZZ_DIR} CACHE PATH HarfBuzz directory) find_path(HARFBUZZ_INCLUDE_DIRS NAMES hb-ft.h PATH_SUFFIXES harfbuzz HINTS ${HARFBUZZ_DIR}/include) find_library(HARFBUZZ_LIBRARIES NAMES harfbuzz HINTS ${HARFBUZZ_DIR}/lib) find_package_handle_standard_args(HARFBUZZ DEFAULT_MSG HARFBUZZ_LIBRARIES HARFBUZZ_INCLUDE_DIRS) if(NOT FREETYPE_FOUND) message(STATUS freetype2: NO) else() message(STATUS freetype2: YES) endif() if(NOT HARFBUZZ_FOUND) message(STATUS harfbuzz: NO) else() message(STATUS harfbuzz: YES) endif() if(FREETYPE_FOUND AND HARFBUZZ_FOUND) ocv_define_module(freetype opencv_core opencv_imgproc PRIVATE_REQUIRED ${FREETYPE_LIBRARIES} ${HARFBUZZ_LIBRARIES} WRAP python) ocv_include_directories(${FREETYPE_INCLUDE_DIRS} ${HARFBUZZ_INCLUDE_DIRS}) else() ocv_module_disable(freetype) endif()Step 3编译包含 FreeType 的 OpenCV在 cmake-gui 的 OpenCV 配置中设置OPENCV_EXTRA_MODULES_PATH填入 opencv-contrib-4.7.0 目录下的modules目录勾选WITH_FREETYPE必须先完成 freetype 与 harfbuzz 的编译在 OpenCV 的 CMake 配置中加入 freetype 的相关路径搜索 harfbuzz 相关选项并填入其路径再次 Configure确认无报错后 GenerateOpen Project 进入 VS将 Debug 切换为 Release右键ALL_BUILD执行 Build完成后右键INSTALL执行 Build。编译 demo 时的联动配置如果编译的是包含 FreeType 的 OpenCV那么在编译通用 OCR 产线 demo第 3.1 节 Step 3时需要勾选USE_FREETYPE编译选项以开启文字渲染功能运行 demo 时还需通过--vis_font_dir your_ttf_path提供相应 TTF 字体文件路径C API 中对应params.vis_font_dir。从 deploy/cpp_infer/CMakeLists.txt 可以看到底层校验逻辑开启USE_FREETYPE后CMake 会检查opencv_freetype是否在OpenCV_LIBS列表中若 OpenCV 未编译该模块会直接FATAL_ERROR并给出明确提示随后才会定义USE_FREETYPE宏供源码中的文字绘制逻辑使用。8. 常见问题FAQModel name mismatch, please input the correct model dir. model dir is xxx, but model name is xxx说明指定的模型名称与提供的模型不匹配。例如识别模型期望PP-OCRv5_server_rec但实际提供的是PP-OCRv5_mobile_rec。解决办法是调整模型名称或更换模型在上例中可指定--text_recognition_model_name PP-OCRv5_mobile_rec以匹配所提供的模型。Windows 控制台中文乱码可能是控制台默认字符编码GBK导致将其切换为 UTF-8 编码即可。9. 小结Windows 下的 PaddleOCR 通用 OCR 产线 C 部署核心路径可概括为准备 OpenCV预编译包或源码→ 准备 Paddle Inference 预测库 → cmake-gui 配置OPENCV_DIR/PADDLE_LIB并生成 VS 工程 → Release 编译得到ppocr.exe→ 拷贝 5 个依赖 DLL → 下载推理模型 → 命令行或 API 调用。整个流程与 Linux 版共用同一套 deploy/cpp_infer 源码唯一差异在于编译工具链与动态库组织方式编译完成后的模型准备、参数体系、API 集成与多语种扩展完全一致可无缝参考 Linux 版部署文档。如需在业务系统中集成建议直接使用第 6 节的PaddleOCRC API配合SaveToJson/SaveToImg完成结果的序列化输出。【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表