VS2022在Win10部署PaddleOCR

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复制到工程目录下;

在这里插入图片描述

5.3 运行推理

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值