paddleOCR的CPU版本依赖的库还是比较少的。如下
1.opencv库。 本人配置的版本是opencv4.5.0
2.paddle_inference 推理库。该库解压后有version.txt文件,版本信息如下:
GIT COMMIT ID: a5cf2e305b744e3ebd2f2210341f88d349d4ec5e
WITH_MKL: ON
WITH_MKLDNN: ON
WITH_GPU: ON
WITH_ROCM: OFF
CUDA version: 10.2
CUDNN version: v7.6
CXX compiler version: 19.16.27045.0
WITH_TENSORRT: ON
TensorRT version: v7.0.0.11
上述就是全部依赖了。
一、用cmake构建Visual Studio项目
构建项目,如同官网教程一样,我的配置最终效果如下:
首先,打开cmake-gui填写上图中的1、2步骤,按cmake-gui中的configure按钮,出错。然后填写上图3、4、5步骤,注意填写自己安装的目录。然后再按configure。这一步,我出错了,错误如下(如果没有出错,直接按generate,项目应该能构建好,去所在的build目录打开vs项目进行下一步):
Could NOT find Git
主要是我安装了git,但是没有把git的bin目录加入系统目录中(用户目录也行)。完成添加后,再configure,然后按generate,构建项目成功。
二、vs2017编译
上一步成功后,这一步编译比较简单,直接按照官网教程就可运行。
但是,运行、二次开发是比较麻烦的。首先需要用vs编译好,然后在对应目录使用终端运行。不能直接使用vs2017运行、调试,非常不方便。所以为了方便开发,稍微折腾了下。
三、使用vs2017构建项目
首先新建一个vs2017空白项目,新建一个main.cpp文件,内容如下:
#include "opencv2/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <vector>
#include "args.h" // 原来的是: #include <include/args.h> 其他文件也有类似问题,直接去掉include即可,
#include "paddleocr.h" // 原来的是: #include <include/paddleocr.h>
#include <numeric>
using namespace PaddleOCR;
int main(int argc, char **argv) {
// Parsing command-line
std::vector<std::string> imgs;
imgs.push_back("./images/1.png");
PPOCR ocr = PPOCR();
std::vector<std::vector<OCRPredictResult>> ocr_results =
ocr.ocr(imgs, FLAGS_det, FLAGS_rec, FLAGS_cls);
for (int i = 0; i < imgs.size(); ++i) {
if (FLAGS_benchmark) {
cout << imgs[i] << '\t';
for (int n = 0; n < ocr_results[i].size(); n++) {
for (int m = 0; m < ocr_results[i][n].box.size(); m++) {
cout << ocr_results[i][n].box[m][0] << ' '
<< ocr_results[i][n].box[m][1] << ' ';
}
}
cout << endl;
}
else {
cout << imgs[i] << "\n";
Utility::print_result(ocr_results[i]);
if (FLAGS_visualize && FLAGS_det) {
cv::Mat srcimg = cv::imread(imgs[i], cv::IMREAD_COLOR);
if (!srcimg.data) {
std::cerr << "[ERROR] image read failed! image path: "
<< imgs[i] << endl;
exit(1);
}
std::string file_name = Utility::basename(imgs[i]);
Utility::VisualizeBboxes(srcimg, ocr_results[i],
FLAGS_output + "/" + file_name);
}
cout << "***************************" << endl;
}
}
int i;
cin >> i;
}
构建上述项目后,肯定会出现很多语法错误。主要是库没有添加进去。
上面错误是没有添加paddle_inference和opencv库。首先添加opencv库,这不是重点,不赘述,可参考。添加paddle_inference依赖库和第三方库,这里直接贴出添加的路径了(可以在新建项目属性表上,执行如下操作)。
添加include,如下:
添加库依赖,如下:
添加附加依赖项,如下(最后一个shlwapi.lib库,是用于解决"无法解析的外部符号 __imp__PathMatchSpec"问题的):
至此,依赖方面的就弄好了。现在应该还有paddleOCR源文件没有加入进来。即,将paddleOCR源文件和main.cpp文件同一路径,效果如下:
![]() | ![]() |
然后编译,会出现很多错误,大概是报
错误 LNK2001 无法解析的外部符号 “__declspec(dllimport) public: __cdecl google::LogMessage::~LogMessage(void)”
什么之类的错误。这是谷歌glog库预定义宏,添加如下:
GLOG_NO_ABBREVIATED_SEVERITIES
GOOGLE_GLOG_DLL_DECL=
还有如下错误:
error LNK2038: 检测到“RuntimeLibrary”的不匹配项 解决方法
解决方法如下:
多线程调试Dll (/MDd) 对应的是MD_DynamicDebug
多线程Dll (/MD) 对应的是MD_DynamicRelease
多线程(/MT) 对应的是MD_StaticRelease
多线程(/MTd)对应的是MD_StaticDebug
(注意呀,项目的文件结构改变了,有些include路径是错误的,需要改正,上面也提到了)右键项目点击生成,应该能生成成功,但是运行估计不行,应该报什么 LNK2007 无法链接什么外部符号的错误。最后需要添加dll文件所在目录到系统(用户目录也行)。如下(添加了路径最好是重启或注销一下电脑):
最后准备下载好模型文件运行,(注意,运行前paddleocr.cpp文件我也修改了,修改的部分如下)
最后的运行效果如下(开启了文字检测和识别)。
最开始的时候终端输出是乱码。这是因为中文识别的时候需要一个字典,字典的格式和系统的编码格式不同。用notepad将字典修的格式改成对应的中格式即可。