windows部署C++ paddleocr + 打包为dll供其他项目调用

一、软件环境安装
Visual studio
Cmake
CUDA

二、任意目录下创建文件夹projets,作为项目地址。
下载C++预测库,选择合适的版本,下载地址:下载安装windows预测库 — Paddle-Inference documentation (paddlepaddle.org.cn)
下载后解压到projects文件夹下。
在这里插入图片描述

配置opencv
官网下载opencv,下载到后解压…/projects/cpp/opencv

下载ppadleocr源码
官网选择dygraph版本,下载后解压…/projects/cpp/PaddleOCR
在这里插入图片描述

三、Cmake构建生成项目
安装cmake后,打开cmake-gui程序;
源码路径:…/projects/cpp/PaddleOCR/deploy/cpp
编译路径:…/projects/cpp/PaddleOCR/deploy/cpp/build
在这里插入图片描述

点击Configure
会显示如下画面,按照以下图片操作
在这里插入图片描述
之后会出现以下画面:
在这里插入图片描述
gpu版本需要填写:
OPENCV_DIR:填写opencv lib文件夹所在位置
OpenCV_DIR:同填写opencv lib文件夹所在位置
PADDLE_LIB:paddle_inference文件夹所在位置
CUDA_LIB: CUDA地址,如 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\lib\x64
CUDA_LIB: CUDA地址,如 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\lib\x64
TENSORRT_DIR:TRT下载后解压缩的位置,如 D:\TensorRT-8.0.1.6
WITH_GPU: 打钩
WITH_TENSORRT:打勾
之后点击Congigure配置。配置后点击Generate生成项目。自此,项目构建完成。

四、运行项目
用visual studio打开所生成的项目。
解决配置方案修改为realse
在这里插入图片描述

之后:
下载dirent.h,并拷贝到 Visual Studio 的 include 文件夹下,如C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\VS\include。
点击生成->生成解决方案,即可在build/Release/文件夹下看见ppocr.exe文件。

运行之前,将下面文件拷贝到build/Release/文件夹下
paddle_inference/paddle/lib/paddle_inference.dll
paddle_inference/third_party/install/onnxruntime/lib/onnxruntime.dll
paddle_inference/third_party/install/paddle2onnx/lib/paddle2onnx.dll
opencv/build/x64/vc15/bin/opencv_world455.dll

开始运行:
进入:…\projects\cpp\PaddleOCR\deploy\cpp_infer
执行预测;
.\build\Release\ppocr.exe system --det_model_dir=D:\projects\cpp\ch_PP-OCRv2_det_slim_quant_infer --rec_model_dir=D:\projects\cpp\ch_PP-OCRv2_rec_slim_quant_infer --image_dir=D:\projects\cpp\PaddleOCR\doc\imgs\11.jpg

运行成功:dll

=============================================================================
接上文:
Paddleocr部署已经完成,如何把paddleocr函数打包供其他函数调用呢???
官网下载 检测 方向分类器 识别模型
放在…/projects/cpp/PaddleOCR/deploy/cpp/build/Realase/目录下
在这里插入图片描述

找到args.cpp函数,修改参数
修改,图片路径,检测 分类器 识别路径,字典路径rec_char_dict_path
在这里插入图片描述

二、将main函数注释
Ppocr项目下下面新建API.cpp API.h文件
目录结构如下
在这里插入图片描述

API.cpp
#include
#include <Windows.h>
#include
#include

#include “API.h”
#include
using namespace PaddleOCR;

char* getOcr(char* nameplace) {
PPOCR ocr;
if (FLAGS_benchmark) {
ocr.reset_timer();
}
cv::Mat img = cv::imread(nameplace, cv::IMREAD_COLOR);
std::vector ocr_results = ocr.ocr(img, FLAGS_det, FLAGS_rec, FLAGS_cls);

std::string concatenated_result;
for (const auto& result : ocr_results) {
    concatenated_result += result.text + ";";
    for (const auto& box : result.box) {
        concatenated_result += "[";
        for (int i = 0; i < box.size(); ++i) {
            concatenated_result += std::to_string(box[i]);
            if (i < box.size() - 1) {
                concatenated_result += ", ";
            }
        }
        concatenated_result += "] ";
    }
    concatenated_result += "\n";
}

// Convert concatenated result to char* and return
char* result_str = new char[concatenated_result.size() + 1];
std::strcpy(result_str, concatenated_result.c_str());
return result_str;

}
为什么注释掉mian函数?我认为一个项目只能有一个入口。
我们只需要main函数中的ocr函数
这个getocr函数就是根据mian函数中的ocr方法修改的。
Getocr只传入一个图片的地址。若想传入一批次的图片地址,可以自行修改。
API.h函数
#pragma once
#include “opencv2/core.hpp”
#include “opencv2/imgcodecs.hpp”
#include “opencv2/imgproc.hpp”
#include
#include

#include <include/args.h>
#include <include/paddleocr.h>
#include <include/paddlestructure.h>
#include
#include <include/ppocr.h>
using namespace std::chrono;
using namespace PaddleOCR;
using namespace std;

//#define DLL_API_EXPORT __declspec(dllexport)

static char buff[1024];

//extern “C” DLL_API_EXPORT char* getOcr();

extern “C” __declspec(dllexport) char* getOcr(char* nameplace);

之后ppocr属性,点击以下两个,修改为dll
在这里插入图片描述
在这里插入图片描述

之后点击ppocr重新生成。

生成后,会看到…/projects/cpp/PaddleOCR/deploy/cpp/build/Realase/目录下有ppocr.dll

三、新建一个项目paddleocr_rec
四、将…/projects/cpp/PaddleOCR/deploy/cpp/build/Realase/下面的文件全部复制到…/paddleocr_rec下面

新建一个cpp文件
#include
#include <Windows.h>
#include
#include

using namespace std;
typedef char* (CALLBACK* V_FUN)(char* dir);

int main() {
HINSTANCE hDLL = LoadLibrary(L"ppocr.dll");

V_FUN v_fun = (V_FUN)GetProcAddress(hDLL, "getOcr");
char* result = v_fun((char*)"E:/yuan.jpg");

std::cout << result << std::endl;

return 0;

}
运行
在这里插入图片描述

调用成功

  • 15
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值