VS2022在Win10部署PaddleOCR
1. 前置准备
1.1 下载PaddleOcr 2.6 源码和PaddleOcr推理模型
- https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.6?login=from_csdn
1.2 下载推理库paddle_inference(CPU版)
- https://www.paddlepaddle.org.cn/inference/v2.4/guides/install/download_lib.html#windows!
1.3 下载Cmake 3.26.3(window版)
- https://cmake.org/download/
1.4 下载OpenCV 4.6.0
1.5 整合资源文件
-
依赖项
- OpenCV 中的 opencv_world460.dll
- Paddle_inference中的 onnxruntime.dll、paddle_inference.dll、paddle2onnx.dll
-
模型文件
2. 开始CMake编译
2.1 CMake界面配置
- 在cpp_infer文件路径下创建一个空文件夹 build,用于编译;
- 配置源码路径;
- 选择VS版本以及x64类型;
2.2 点击 Configure
配置
-
首次点击 Configure 会编译失败,原因是此时还没有配置 OPENCV_DIR、OpenCV_DIR、PADDLE_LIB路径。
-
配置完再次点击 Configure,成功。
2.3 点击 Generator
生成
2.4 查看build文件夹新增编译生成文件
3. VS2022打开项目
3.1 点击 Open Project
打开项目,首次生成报错无法打开<dirent.h>源文件。
- 解决方法:将dirent.h文件放在C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.35.32215\include路径下,重新编译生成ppocr.exe文件。
- 下载链接:https://paddleocr.bj.bcebos.com/deploy/cpp_infer/cpp_files/dirent.h。
3.2 整合资源
3.3 修改配置
- 打开 args.cpp 文件修改以下配置。
- output:图片识别后的输出路径;
- image_dir:待识别的图片路径;
- det_model_dir、cls_model_dir、rec_model_dir 对应下载的3个推理模型路径;
- rec_char_dict_path:字典库;
3.4 重新生成,点击 ppocr.exe 运行
- 效果如下:
4. 封装 .dll 链接库
4.1 源码中添加接口文件
4.2 接口文件
- .h文件
#pragma once
#include <opencv2/core/cvstd.hpp>
#include <include/args.h>
#include "opencv2/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <include/paddleocr.h>
#include <include/paddlestructure.h>
#define DLL_API_EXPORT _declspec(dllexport)
struct OCRPredictResult {
std::vector<std::vector<int>> box;
std::string text;
float score = -1.0;
float cls_score;
int cls_label = -1;
};
static char buff[1024];
extern "C" DLL_API_EXPORT void SetImgDir(char* image_dir);
extern "C" DLL_API_EXPORT bool GetOcr(const cv::Mat& srcimg, std::vector<std::vector<PaddleOCR::OCRPredictResult>>& res);
- .cpp文件
#include "myAPI.h"
using namespace PaddleOCR;
using namespace std;
bool GetOcr(const cv::Mat& srcimg, std::vector<std::vector<PaddleOCR::OCRPredictResult>>& res) {
vector<cv::String> cv_all_img_names;
cv::glob(FLAGS_image_dir, cv_all_img_names);
// 创建对象
PPOCR ocr;
// 是否启用基准测试
if (FLAGS_benchmark) {
ocr.reset_timer();
}
vector<cv::Mat> img_list;
std::vector<cv::String> img_names;
cv::Mat img = srcimg.clone();
img_list.push_back(img);
// 执行OCR推理
res = ocr.ocr(img_list, FLAGS_det, FLAGS_rec, FLAGS_cls);
std::vector<PaddleOCR::OCRPredictResult> ocr_result;
std::string info;
// 处理OCR结果
for (int i = 0; i < img_list.size(); ++i) {
// 打印ocr结果
Utility::print_result(res[i]);
// 保存文本检测可视化结果
if (FLAGS_visualize && FLAGS_det) {
// std::string file_name = Utility::basename(img_names[i]);
std::string file_name = Utility::basename("temp.jpg");
cv::Mat srcimg = img_list[i].clone();
Utility::VisualizeBboxes(srcimg, res[i], FLAGS_output + "/" + file_name);
}
}
// 启用基准测试
if (FLAGS_benchmark) {
ocr.benchmark_log(cv_all_img_names.size());
}
if (res.size() > 0) {
return true;
}
return false;
}
void SetImgDir(char* image_dir) {
FLAGS_image_dir = image_dir;
}
4.3 属性修改
- 将配置类型修改为动态库(.dll)
4.4 动态库编译生成
5. 第三方使用动态库
5.1 创建测试工程 myOCR
- cpp源码
#include <iostream>
#include <opencv2/opencv.hpp>
#include <Windows.h>
using namespace std;
struct OCRPredictResult {
std::vector<std::vector<int>> box;
std::string text;
float score = -1.0;
float cls_score;
int cls_label = -1;
};
// 接收DLL中返回值为char* 没有参数的方法
// typedef char* (CALLBACK* FUN)();
typedef bool (CALLBACK* FUN)(cv::Mat, std::vector<std::vector<OCRPredictResult>>&);
// 接收DLL中没有返回值,参数为char*的方法
// typedef void (CALLBACK* V_FUN)(char* dir);
void GetOcr() {
HINSTANCE hDLL;
hDLL = LoadLibrary(L"ppocr.dll");
if (NULL != hDLL) {
// V_FUN v_fun = (V_FUN)GetProcAddress(hDLL, "SetImgDir");
// 调用方法
cv::Mat tmp = cv::imread("./images//1.png");
vector<vector<OCRPredictResult>> res;
FUN fun = (FUN)GetProcAddress(hDLL, "GetOcr");
// v_fun((char*)"./images//30.jpg");
bool ttt = fun(tmp, res);
cout << "res: " << ttt << endl;
// 释放DLL
FreeLibrary(hDLL);
}
}
int main() {
cout << "PaddleOCR 进行推理\n";
GetOcr();
system("pause");
}
5.2 整合资源
- 将步骤 4.1.4 中编译动态库生成的四个.dll 文件复制到测试项目工程目录下;
- 将步骤 3.1.2 中的 onnxruntime.dll、opencv_world460.dll、paddle_inference.dll、paddle2onnx.dll复制到工程目录下;