paddleocr C++生成dll

devtools/2024/10/19 7:30:58/

目录

编译完成后修改内容:

ocr.h%E5%A4%B4%E6%96%87%E4%BB%B6-toc" style="margin-left:80px;">新建ppocr.h头文件

ocr.h%E9%9C%80%E8%A6%81%E5%86%8D%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%8C%85%E5%90%AB%E8%BF%9B%E5%8E%BB%E5%A4%B4%E6%96%87%E4%BB%B6-toc" style="margin-left:80px;">注释掉main.cpp内全部内容,将下面内容替换进去。ppocr.h需要再环境配置中包含进去头文件

然后更改配置信息,将exe换成dll

随后右击重新编译会在根目录生成dll,lib文件。

注意这些dll一个也不能少。生成dll后,重新在vs中新建一个C++项目 

内容如下:

相关的配置如下:

需要更改输出目录,添加连接器,并将项目里需要的内容一并放入输出目录中

 结果展示:

 结语:


paddeocr用cmake编译生成exe请查阅我的另一篇博客,这里只看如何在exe的基础上生成dll

借鉴博主:

humour9

 准备版本:release2.5

编译完成后修改内容:

ocr.h%E5%A4%B4%E6%96%87%E4%BB%B6">新建ppocr.h头文件

#pragma once
#include <vector>
#include <string>#ifndef IMAGE_API
#define IMAGE_APIstruct TextDetectionResult {std::vector<std::vector<int>> boxes;
};struct TextRecognitionResult {std::string text;double score;};extern "C" {// 图像推理__declspec(dllexport) void ImageProcess(const char* image_dir, TextDetectionResult*** detection_results, int* num_detection_results,TextRecognitionResult*** recognition_results, int* num_recognition_results);/*__declspec(dllexport) void FreeMemory(TextDetectionResult** detection_results, int num_detection_results,TextRecognitionResult** recognition_results, int num_recognition_results);*/
}
#endif

ocr.h%E9%9C%80%E8%A6%81%E5%86%8D%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%8C%85%E5%90%AB%E8%BF%9B%E5%8E%BB%E5%A4%B4%E6%96%87%E4%BB%B6">注释掉main.cpp内全部内容,将下面内容替换进去。ppocr.h需要再环境配置中包含进去头文件

#include <iostream>
#include <include/paddleocr.h>
#include <include/args.h>
#include "ppocr.h"using namespace PaddleOCR;// 处理图片的函数
void ImageProcess(const char* image_dir, TextDetectionResult*** detection_results, int* num_detection_results,TextRecognitionResult*** recognition_results, int* num_recognition_results)
{std::cout << "--------" << image_dir << "-------" << std::endl;std::string dir(image_dir);std::replace(dir.begin(), dir.end(), '/', '\\');std::cout << "--------" << dir << "-------" << std::endl;std::vector<cv::String> cv_all_img_names;cv::glob(image_dir, cv_all_img_names);std::cout << "total images num: " << cv_all_img_names.size() << endl;PPOCR ocr = PPOCR();std::cout << "begin process" << std::endl;std::vector<std::vector<OCRPredictResult>> ocr_results = ocr.ocr(cv_all_img_names, FLAGS_det, FLAGS_rec, FLAGS_cls);std::cout << "finish process" << std::endl;auto ocr_result = ocr_results[0];std::vector<TextDetectionResult> detectionResults;std::vector<TextRecognitionResult> recognitionResults;for (int i = 0; i < ocr_result.size(); i++) {if (ocr_result[i].score != -1.0) {TextDetectionResult detectionResult;detectionResult.boxes = ocr_result[i].box;TextRecognitionResult recognitionResult;recognitionResult.text = ocr_result[i].text;recognitionResult.score = ocr_result[i].score;detectionResults.push_back(detectionResult);recognitionResults.push_back(recognitionResult);}}*num_detection_results = detectionResults.size();*detection_results = new TextDetectionResult * [*num_detection_results];for (int i = 0; i < *num_detection_results; i++) {(*detection_results)[i] = new TextDetectionResult(detectionResults[i]);}*num_recognition_results = recognitionResults.size();*recognition_results = new TextRecognitionResult * [*num_recognition_results];for (int i = 0; i < *num_recognition_results; i++) {(*recognition_results)[i] = new TextRecognitionResult(recognitionResults[i]);}std::cout << "in the end" << std::endl;if (*num_recognition_results == 0) {std::cout << "result is null" << std::endl;}///*c*/onst char* img_dir = "E:\paddlepaddle\projects\PaddleOCR-release-2.5\deploy\cpp_infer\qt_project\qt4ocr\imgs\1.jpg";cv::Mat srcimg = cv::imread(dir, cv::IMREAD_COLOR);if (!srcimg.data) {std::cerr << "[ERROR] image read failed! image path: "<< endl;exit(1);}std::string file_name = Utility::basename(image_dir);Utility::VisualizeBboxes(srcimg, ocr_results[0],FLAGS_output + file_name);std::cout << "***************************" << endl;}void FreeMemory(TextDetectionResult** detection_results, int num_detection_results,TextRecognitionResult** recognition_results, int num_recognition_results)
{for (int i = 0; i < num_detection_results; i++) {delete detection_results[i];}delete[] detection_results;for (int i = 0; i < num_recognition_results; i++) {delete recognition_results[i];}delete[] recognition_results;
}

然后更改配置信息,将exe换成dll

随后右击重新编译会在根目录生成dll,lib文件。

注意这些dll一个也不能少。生成dll后,重新在vs中新建一个C++项目 

内容如下:

#include <iostream>
#include <vector>
#include <string>
#include <Windows.h>struct TextDetectionResult {std::vector<std::vector<int>> boxes;
};struct TextRecognitionResult {std::string text;double score;
};typedef void (*ImageProcessFunc)(const char* image_dir, TextDetectionResult*** detection_results, int* num_detection_results,TextRecognitionResult*** recognition_results, int* num_recognition_results);void FreeMemory(TextDetectionResult** detection_results, int num_detection_results,TextRecognitionResult** recognition_results, int num_recognition_results)
{for (int i = 0; i < num_detection_results; i++) {delete detection_results[i];}delete[] detection_results;for (int i = 0; i < num_recognition_results; i++) {delete recognition_results[i];}delete[] recognition_results;
}int main()
{system("chcp 65001");const char* image_dir = "C:\\Users\\lenovo\\source\\repos\\test_dll\\test_dll//1234.jpg";const char* dll_path = "C:\\Users\\lenovo\\source\\repos\\test_dll\\test_dll/ppocr.dll";HMODULE hModule = LoadLibraryA(dll_path);if (hModule == NULL) {std::cout << "Failed to load the DLL." << std::endl;return 1;}ImageProcessFunc ImageProcess = (ImageProcessFunc)GetProcAddress(hModule, "ImageProcess");if (ImageProcess == NULL) {std::cout << "Failed to get the function address." << std::endl;FreeLibrary(hModule);return 1;}TextDetectionResult** detection_results = nullptr;int num_detection_results = 0;TextRecognitionResult** recognition_results = nullptr;int num_recognition_results = 0;ImageProcess(image_dir, &detection_results, &num_detection_results, &recognition_results, &num_recognition_results);if (num_detection_results > 0) {std::cout << "get the result" << std::endl;for (int i = 0; i < num_detection_results; i++) {std::vector<std::vector<int>> boxes = detection_results[i]->boxes;std::cout << "det boxes: [";for (int n = 0; n < boxes.size(); n++) {std::cout << '[' << boxes[n][0] << ',' << boxes[n][1] << "]";if (n != boxes.size() - 1) {std::cout << ',';}}std::string recognitionResult = recognition_results[i]->text;std::cout << "] " << "  " << " recognition text : " << recognitionResult << std::endl;}}std::cout << "begin clear" << std::endl;// 释放内存FreeMemory(detection_results, num_detection_results, recognition_results, num_recognition_results);// 卸载 DLLFreeLibrary(hModule);std::cout << "clear over" << std::endl;return 0;
}

相关的配置如下:

需要更改输出目录,添加连接器,并将项目里需要的内容一并放入输出目录中

 

 结果展示:

 结语:

只提供解决方案,非无偿解答问题。

===================2024.4.28日修改==============

新增release2.7版本修改内容

mian.cpp内容    2.7及以后版本 ocr.ocr函数内容传参变为img_list, FLAGS_det, FLAGS_rec, FLAGS_cls。  所以将mian函数修改一下重新定义一个img_list 这个团队的源码里面也有。其他与之前的内容保持一致。

#include <iostream>
#include <include/paddleocr.h>
#include <include/args.h>
#include "ooccrr.h"using namespace PaddleOCR;
// 处理图片的函数
void ImageProcess(const char* image_dir, TextDetectionResult*** detection_results, int* num_detection_results,TextRecognitionResult*** recognition_results, int* num_recognition_results)
{std::cout << "--------" << image_dir << "-------" << std::endl;std::string dir(image_dir);std::replace(dir.begin(), dir.end(), '/', '\\');std::cout << "--------" << dir << "-------" << std::endl;std::vector<cv::String> cv_all_img_names;cv::glob(image_dir, cv_all_img_names);std::cout << "total images num: " << cv_all_img_names.size() << std::endl;PPOCR ocr = PPOCR();std::cout << "begin process" << std::endl;//PPOCR::ocr(std::vector<cv::Mat> img_list, bool det, bool rec, bool cls)std::vector<cv::Mat> img_list;std::vector<cv::String> img_names;for (int i = 0; i < cv_all_img_names.size(); ++i) {cv::Mat img = cv::imread(cv_all_img_names[i], cv::IMREAD_COLOR);if (!img.data) {std::cerr << "[ERROR] image read failed! image path: "<< cv_all_img_names[i] << std::endl;continue;}img_list.push_back(img);img_names.push_back(cv_all_img_names[i]);}std::vector<std::vector<OCRPredictResult>> ocr_results = ocr.ocr(img_list, FLAGS_det, FLAGS_rec, FLAGS_cls);std::cout << "finish process" << std::endl;auto ocr_result = ocr_results[0];std::vector<TextDetectionResult> detectionResults;std::vector<TextRecognitionResult> recognitionResults;for (int i = 0; i < ocr_result.size(); i++) {if (ocr_result[i].score != -1.0) {TextDetectionResult detectionResult;detectionResult.boxes = ocr_result[i].box;TextRecognitionResult recognitionResult;recognitionResult.text = ocr_result[i].text;recognitionResult.score = ocr_result[i].score;detectionResults.push_back(detectionResult);recognitionResults.push_back(recognitionResult);}}*num_detection_results = detectionResults.size();*detection_results = new TextDetectionResult * [*num_detection_results];for (int i = 0; i < *num_detection_results; i++) {(*detection_results)[i] = new TextDetectionResult(detectionResults[i]);}*num_recognition_results = recognitionResults.size();*recognition_results = new TextRecognitionResult * [*num_recognition_results];for (int i = 0; i < *num_recognition_results; i++) {(*recognition_results)[i] = new TextRecognitionResult(recognitionResults[i]);}std::cout << "in the end" << std::endl;if (*num_recognition_results == 0) {std::cout << "result is null" << std::endl;}///*c*/onst char* img_dir = "E:\paddlepaddle\projects\PaddleOCR-release-2.5\deploy\cpp_infer\qt_project\qt4ocr\imgs\1.jpg";cv::Mat srcimg = cv::imread(dir, cv::IMREAD_COLOR);if (!srcimg.data) {std::cerr << "[ERROR] image read failed! image path: "<< std::endl;exit(1);}std::string file_name = Utility::basename(image_dir);Utility::VisualizeBboxes(srcimg, ocr_results[0],FLAGS_output + file_name);std::cout << "***************************" << std::endl;}void FreeMemory(TextDetectionResult** detection_results, int num_detection_results,TextRecognitionResult** recognition_results, int num_recognition_results)
{for (int i = 0; i < num_detection_results; i++) {delete detection_results[i];}delete[] detection_results;for (int i = 0; i < num_recognition_results; i++) {delete recognition_results[i];}delete[] recognition_results;
}


http://www.ppmy.cn/devtools/28327.html

相关文章

【电路笔记】-石英晶体振荡器

石英晶体振荡器 文章目录 石英晶体振荡器1、概述2、石英晶体等效模型3、石英晶体振荡器示例14、Colpitts 石英晶体振荡器5、Pierce振荡器6、CMOS晶体振荡器7、微处理器水晶石英钟8、石英晶体振荡器示例21、概述 任何振荡器最重要的特性之一是其频率稳定性,或者换句话说,其在…

聚醚醚酮(Polyether Ether Ketone)PEEK在粘接使用时可以使用UV胶水吗?要注意哪些事项?

一般情况下&#xff0c;聚醚醚酮&#xff08;Polyether Ether Ketone&#xff0c;PEEK&#xff09;是一种难以黏附的高性能工程塑料&#xff0c;而UV胶水通常不是与PEEK进行粘接的首选方法。PEEK表面的化学性质和高温性能使得它对常规胶水的附着性较低。然而&#xff0c;有一些…

【JavaScript】使用 AbortController 对象中断 fetch 的文本流传输

AbortController 正如我们所知道的&#xff0c;fetch 返回一个 promise。JavaScript 通常并没有“中止” promise 的概念。那么我们怎样才能取消一个正在执行的 fetch 呢&#xff1f;例如&#xff0c;如果用户在我们网站上的操作表明不再需要某个执行中的 fetch。 为此有一个…

acwing算法提高之数学知识--筛质数、分解质因数和快速幂

目录 1 介绍2 训练 1 介绍 本博客用来记录筛质数、分解质因数和快速幂相关的题目。 2 训练 题目1&#xff1a;1292哥德巴赫猜想 C代码如下&#xff0c; #include <iostream> #include <cstring> #include <algorithm> #include <set>using namesp…

模型训练中的过拟合和欠拟合

基本概念 我们知道&#xff0c;所谓的神经网络其实就是一个复杂的非线性函数&#xff0c;网络越深&#xff0c;这个函数就越复杂&#xff0c;相应的表达能力也就越强&#xff0c;神经网络的训练则是一个拟合的过程。   当模型的复杂度小于真实数据的复杂度&#xff0c;模型表…

Dynamic-Programming

目录 前言 引入 1) Fibonacci 2) 最短路径 - Bellman-Ford 3) 不同路径-Leetcode 62 4) 0-1 背包问题 降维 5) 完全背包问题 降维 6) 零钱兑换问题-Leetcode322 降维 零钱兑换 II-Leetcode 518 7) 钢条切割问题 降维 类似题目 Leetcode-343 整数拆分 8) 最长…

018、Python+fastapi,第一个Python项目走向第18步:ubuntu24.04 安装cuda和pytorch环境

一、说明 我们安装了pytorch环境之后&#xff0c;会用yolo v9 来测试一下&#xff0c;看8g 显存能不能跑下来&#xff0c;上次用无影云电脑&#xff0c;4cpu8g内存直接爆了&#xff0c;云电脑也死机了&#xff0c;提示一直占用内存不释放&#xff0c;我自己的云电脑不能占用内…

C++:现代类型转换

C&#xff1a;现代类型转换 C/C的旧式类型转换C的现代类型转换静态类型转换 static_cast重新解释转换 reinterpret_cast常量类型转换 const_cast动态类型转换 dynamic_cast C/C的旧式类型转换 在C语言中&#xff0c;类型转换被分为显式和隐式&#xff0c;常见的类型转换如下&a…