Win10 环境下 VS2022 暴力编译PP-OCRv4

news2024/11/24 4:54:43

1 环境准备

  1. 下载PaddleOCR
    PaddleOCR
    C++ 部署代码位于 PaddleOCR\deploy\cpp_infer目录下
    在这里插入图片描述
    复制cpp_infer目录下include和src到项目目录下
  2. paddle_inference
    paddle_inference
    在这里插入图片描述
  3. opencv
    这里使用已经安装好的opencv4.5.5
  4. 下载dirent-master.zip
    下载dirent-master.zip, 解压并复制dirent.h文件到项目目录下
  5. 下载权重文件
    检测模型 ch_PP-OCRv4_det_infer
    方向分类器 ch_ppocr_mobile_v2.0_cls_infer
    识别模型 ch_PP-OCRv4_rec_infer

2 Visual Studio 2022 环境配置

属性 --> VC++ 目录 --> 包含目录

E:\opencv455\build\include
E:\cpp_code\PaddleOCR\paddle_inference\paddle\include
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\cryptopp\include
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\protobuf\include
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\glog\include
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\gflags\include
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\xxhash\include
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\onnxruntime\include
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\paddle2onnx\include
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\mklml\include
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\mkldnn\include
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\utf8proc\include
E:\cpp_code\PaddleOCR\ocr_cpu

属性 --> VC++ 目录 --> 库目录

E:\opencv455\build\x64\vc15\lib
E:\cpp_code\PaddleOCR\paddle_inference\paddle\lib
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\cryptopp\lib
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\protobuf\lib
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\glog\lib
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\gflags\lib
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\xxhash\lib
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\onnxruntime\lib
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\paddle2onnx\lib
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\mklml\lib
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\mkldnn\lib
E:\cpp_code\PaddleOCR\paddle_inference\third_party\install\utf8proc\lib

属性 --> 链接器 --> 输入 --> 附加依赖项

opencv_world455.lib
paddle_inference.lib
libpaddle_inference.lib
cryptopp-static.lib
gflags_static.lib
shlwapi.lib
glog.lib
mkldnn.lib
mklml.lib
libiomp5md.lib
onnxruntime.lib
paddle2onnx.lib
libprotobuf.lib
utf8proc_static.lib
xxhash.lib

将 opencv_world455.dll,paddle_inference.dll,paddle2onnx.dll 和 onnxruntime.dll复制到项目的x64\Release目录下

3 测试

修改 main.cpp文件

int main() {
    SetConsoleOutputCP(CP_UTF8);

    FLAGS_det_model_dir = "E:\\cpp_code\\weights\\PP-OCRv4\\ch_PP-OCRv4_det_infer";
    FLAGS_rec_model_dir = "E:\\cpp_code\\weights\\PP-OCRv4\\ch_PP-OCRv4_rec_infer";
    FLAGS_cls_model_dir = "E:\\cpp_code\\weights\\PP-OCRv4\\ch_ppocr_mobile_v2.0_cls_infer";
    FLAGS_rec_char_dict_path = "E:\\cpp_code\\paddle_compile\\PaddleOCR\\ppocr\\utils\\ppocr_keys_v1.txt";
    FLAGS_image_dir = "E:\\cpp_code\\images\\img_20230926_105631025.jpg";

    FLAGS_cpu_threads = 64;
    FLAGS_type = "ocr"; // "structure"
    FLAGS_output = ".\\output";


    std::vector<cv::String> cv_all_img_names;
    cv::glob(FLAGS_image_dir, cv_all_img_names);
    std::cout << "total images num: " << cv_all_img_names.size() << std::endl;

    if (FLAGS_type == "ocr") {
        ocr(cv_all_img_names);
    }
    else if (FLAGS_type == "structure") {
        structure(cv_all_img_names);
    }
    else {
        std::cout << "only value in ['ocr','structure'] is supported" << std::endl;
    }
}

在这里插入图片描述

遇到的问题和解决方法:

  1. error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”
1>gflags_static.lib(gflags.cc.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”(ocr_cpu.obj 中)
1>gflags_static.lib(gflags_reporting.cc.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”(ocr_cpu.obj 中)
1>gflags_static.lib(gflags_completions.cc.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”(ocr_cpu.obj 中)
1>libcpmt.lib(locale0.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”(ocr_cpu.obj 中)
1>libcpmt.lib(cerr.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”(ocr_cpu.obj 中)
1>libcpmt.lib(locale.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”(ocr_cpu.obj 中)
1>libcpmt.lib(iosptrs.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”(ocr_cpu.obj 中)

解决方法: 属性 -> C/C++ -> 代码生成 -> 运行库
在这里插入图片描述

  1. error LNK2001: 无法解析的外部符号 “__declspec(dllimport) public: class std::basic_ostream<char,struct std::char_traits > & __cdecl google::LogMessage::stream(void)” (_imp?stream@LogMessage@google@@QEAAAEAV? b a s i c o s t r e a m @ D U ? basic_ostream@DU? basicostream@DU?char_traits@D@std@@@std@@XZ)
1>paddleocr.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl google::LogMessage::stream(void)" (__imp_?stream@LogMessage@google@@QEAAAEAV?$basic_ostream@DU?$char_traits@D@std@@@std@@XZ)
1>paddleocr.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl google::LogMessage::~LogMessage(void)" (__imp_??1LogMessage@google@@QEAA@XZ)
1>paddleocr.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl google::LogMessage::LogMessage(char const *,int)" (__imp_??0LogMessage@google@@QEAA@PEBDH@Z)
1>paddleocr.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::basic_ostream<char,struct std::char_traits<char> >::operator<<(bool)" (__imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_N@Z)

解决方法: 属性 ->C/C++ ->预处理器 ->预处理器定义:GOOGLE_GLOG_DLL_DECL=
在这里插入图片描述
3. gflags_static.lib(gflags.cc.obj) : error LNK2001: 无法解析的外部符号 __imp_PathMatchSpecA

解决方法:项目属性 -》链接器-》输入-》附加依赖项-》加上shlwapi.lib

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1091153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyLife - Docker安装Consul

Docker安装Consul 个人觉得像consul之类的基础设施在线上环境直接物理机安装使用可能会好些。但是在开发测试环境用docker容器还是比较方便的。这里学习下docker安装consul使用。 1. Consul 镜像库地址 Consul 镜像库地址&#xff1a;https://hub.docker.com/r/hashicorp/consu…

CleanMyMacX4.12.3最新免费版mac电脑管家

当我们收到一台崭新的mac电脑&#xff0c;第一步肯定是找到一款帮助我们管理电脑运行的“电脑管家”&#xff0c;监控内存运行、智能清理系统垃圾、清理Mac大文件旧文件、消除恶意软件、快速卸载更新软件、隐私保护、监控系统运行状况等。基本在上mac电脑防护一款CleanMyMac就够…

C/C++陷阱——变量名和函数名的冲突问题

C语言/C陷阱——变量名和函数名的冲突问题 先来看这两串代码&#xff1a; 代码一&#xff1a; #include <stdio.h> #include <stdlib.h>int rand 1;int main() {printf("%d\n", rand);return 0; }代码二&#xff1a; #include <stdio.h> #inc…

芯片设计:一颗芯片到底是如何诞生的(上)

目录 芯片设计整体流程 小故事&#xff1a;苹果的芯片设计路 需求分析 架构设计 逻辑设计 前端设计与验证 逻辑综合 DFT&#xff08;可测试性设计&#xff09; 物理实现 小结 芯片设计整体流程 一颗芯片&#xff0c;是如何诞生的呢&#xff1f;其实一颗芯片项目就是…

vue引入jQuery

配置 下载 npm install jquery --save在build的webpack.base.conf中 var webpackrequire("webpack")在module.exports中: plugins: [ //   new webpack.optimize.CommonsChunkPlugin(common.js),new webpack.ProvidePlugin({jQuery: "jquery",$: &quo…

三十五、【进阶】MySQL性能查看

1、基础语法 show global status like Com_______; 2、实际操作 &#xff08;1&#xff09;查看当前数据库sql语句的执行频率 show global status like Com_______; &#xff08;2&#xff09; 执行依次select语句 &#xff08;3&#xff09; 再次查看当前数据库sql语句的执…

GBJ2510-ASEMI电源控制柜专用GBJ2510

编辑&#xff1a;ll GBJ2510-ASEMI电源控制柜专用GBJ2510 型号&#xff1a;GBJ2510 品牌&#xff1a;ASEMI 封装&#xff1a;GBJ-4 恢复时间&#xff1a;&#xff1e;50ns 正向电流&#xff1a;25A 反向耐压&#xff1a;1000V 芯片个数&#xff1a;4 引脚数量&#xf…

python每日一练(7)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

【LeetCode热题100】--739.每日温度

739.每日温度 方法&#xff1a;单调栈 可以维护一个存储下标的单调栈&#xff0c;从栈底到栈顶的下标对应的温度列表中的温度依次递减。如果一个下标在单调栈里&#xff0c;则表示尚未找到下一次温度更高的下标。 正向遍历温度列表。对于温度列表中的每个元素 temperatures[i…

YOLOv5算法改进(11)— 主干网络介绍(MobileNetV3、ShuffleNetV2和GhostNet)

前言:Hello大家好,我是小哥谈。主干网络通常指的是深度学习中的主干模型,通常由多个卷积层和池化层组成,用于提取输入数据的特征。在训练过程中,主干网络的参数会被不断优化以提高模型的准确性。YOLOv5算法中的主干网络可以有多种替换方案,为了后面讲解的方便,本篇文章就…

C结构体内定义结构体,不能直接赋值。

现像&#xff1a; 如下代码&#xff1a; 头文件&#xff1a; typedef struct aBlinkGpioPinOutAbst_{void (*initAsOutput)(void);void (*high)(void);void (*low)(void); }aBlinkGpioPinOutAbst;typedef struct aBlinkGpioAbst_{ #if GPIO_CONFIG_PA0 GPIO_CONFIG_AS_OUTPU…

Jetson Orin NX 开发指南(9): MAVROS 的安装、配置与运行

一、前言 由于 Jetson 系列开发板常作为自主无人机的机载电脑&#xff0c;而无人机硬件平台如 PX4 和 ArduPilot 等通过 MAVLink 进行发布无人机状态和位姿等信息&#xff0c;要实现机载电脑与 MAVLink 的通信&#xff0c;必须借助 Mavros 功能包&#xff0c;因此&#xff0c;…

分页机制详解

分页机制详解 《操作系统真象还原》第五章笔记 内存不足&#xff0c;需要分页机制 我们所写的代码仅仅是完成了某件事的一部分而已&#xff0c;也许是大部分&#xff0c;还有一部分是 CPU 硬件上负责的&#xff0c;这部分咱们不用管&#xff0c;由 CPU 自动完成。比如&#x…

内网渗透——隧道代理

文章目录 代理代理使用场景VPS建立隧道frpMSF木马生成监听开启frp服务端和客户端执行exe木马文件 代理 实验环境&#xff1a; 攻击机kali&#xff1a;192.168.188.133&#xff08;NAT模式&#xff09; 模拟的公网服务器&#xff08;本机&#xff09;&#xff1a;10.9.75.239 …

Python学习基础笔记六十八——循环

循环是编程语言常见的流程控制。 Python语句要让计算机反复地做一些事情&#xff0c;就要用到循环语句。 有While和for循环。 while循环&#xff1a; command input("请输入命令:") while command ! exit:print(f输入的命令是{command})command input("请输…

15. Java反射和注解

Java —— 反射和注解 1. 反射2. 注解 1. 反射 动态语言&#xff1a;变量的类型和属性可以在运行时动态确定&#xff0c;而不需要在编译时指定 常见动态语言&#xff1a;Python&#xff0c;JavaScript&#xff0c;Ruby&#xff0c;PHP&#xff0c;Perl&#xff1b;常见静态语言…

SAP报错CX_SY DYN CALL PARAM MISSING

DYN CALL METH PARAM MISSING CX_SY DYN CALL PARAM MISSING 在 ABAP 中&#xff0c;当你定义一个方法时&#xff0c;可以选择将方法的参数标记为可选&#xff08;可选参数&#xff09;或必需&#xff08;必需参数&#xff09;。如果你不勾选可选参数选项&#xff0c;那么该参…

【AI视野·今日Sound 声学论文速览 第二十五期】Fri, 13 Oct 2023

AI视野今日CS.Sound 声学论文速览 Fri, 13 Oct 2023 Totally 8 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Impact of time and note duration tokenizations on deep learning symbolic music modeling Authors Nathan Fradet, Nicolas Gutowski,…

Sentinel-2 命名规则(Naming Convention)

下述命名规则是2019年12月6日颁布的&#xff0c;自此之后的L1C级别产品都按照这个规则命名&#xff08;其他级别的产品官网没说&#xff09;。 下载下来的文件是个zip&#xff0c;解压后是个与zip同名的 .SAFE 文件。 MMM_MSIXXX_YYYYMMDDHHMMSS_Nxxyy_ROOO_Tnnmab_<Produ…