2022-12-19
来源:华纳网
责任编辑:王双双
人气:
核心提示:本节,我们使用C++来调用Paddle进行OCR并且这个OCR是可以离线使用的经谷雨老师测试,完全可以用于实用的以下是部分核心代码
大家好,欢迎来到谷雨课堂
本节,
我们使用C++来调用Paddle进行OCR
并且这个OCR是可以离线使用的
经谷雨老师测试,
完全可以用于实用的
以下是部分核心代码
#include "glog/logging.h"
#include "omp.h"
#include "opencv2/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include <chrono>
#include <iomanip>
#include <iostream>
#include <ostream>
#include <vector>
#include <cstring>
#include <fstream>
#include <numeric>
#include <include/config.h>
#include <include/ocr_det.h>
#include <include/ocr_rec.h>
#include <include/JsonLite.h>
using namespace std;
using namespace cv;
using namespace PaddleOCR;
static OCRConfig* pconfig = NULL;
extern "C" __declspec(dllexport) bool LoadModel(DBDetector * *pdet, Classifier * *pcls, CRNNRecognizer * *prec);
__declspec(dllexport) bool LoadModel(DBDetector** pdet, Classifier** pcls, CRNNRecognizer** prec)
{
OCRConfig config("config.txt");
config.PrintConfigInfo();
*pdet = new DBDetector(config.det_model_dir, config.use_gpu, config.gpu_id,
config.gpu_mem, config.cpu_math_library_num_threads,
config.use_mkldnn, config.max_side_len, config.det_db_thresh,
config.det_db_box_thresh, config.det_db_unclip_ratio,
config.visualize, config.use_tensorrt, config.use_fp16);
*pcls = nullptr;
if (config.use_angle_cls == true) {
*pcls = new Classifier(config.cls_model_dir, config.use_gpu, config.gpu_id,
config.gpu_mem, config.cpu_math_library_num_threads,
config.use_mkldnn, config.cls_thresh,
config.use_tensorrt, config.use_fp16);
}
*prec = new CRNNRecognizer(config.rec_model_dir, config.use_gpu, config.gpu_id,
config.gpu_mem, config.cpu_math_library_num_threads,
config.use_mkldnn, config.char_list_file,
config.use_tensorrt, config.use_fp16);
//std::cout << "00000" << std::endl;
return (pdet != NULL);
}
/*
1.���ؿ�ѡ���壻
2.���ؽ����ַ���
*/
extern "C" __declspec(dllexport) void Rec(DBDetector * pdet, Classifier * pcls, CRNNRecognizer * prec, char* input, int width, int height, char** result);
__declspec(dllexport) void Rec(DBDetector* pdet, Classifier* pcls, CRNNRecognizer* prec, char* input, int width, int height, char** result)
{
JsonObjectBuilder builder;
cv::Mat srcimg(height, width, CV_8UC3, input);
//std::cout << "00000" << std::endl;
auto start = std::chrono::system_clock::now();
std::vector<std::vector<std::vector<int>>> boxes;
// ���
(*pdet).Run(srcimg, boxes);
// ʶ��
(*prec).Run(boxes, srcimg, pcls, builder);
JString cs = builder.Build();
std::cout << cs << std::endl;
*result = new char[cs.GetLength()+10];
strcpy(*result, cs);
auto end = std::chrono::system_clock::now();
auto duration =
std::chrono::duration_cast<std::chrono::microseconds>(end - start);
std::cout << "Cost "
<< double(duration.count()) *
std::chrono::microseconds::period::num /
std::chrono::microseconds::period::den
<< "s" << std::endl;
//return new cv::Mat(srcimg);
}
完整的源代码可以登录【华纳网】下载。
https://www.worldwarner.com/
免责声明:本文仅代表作者个人观点,与华纳网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
本节,
我们使用C++来调用Paddle进行OCR
并且这个OCR是可以离线使用的
经谷雨老师测试,
完全可以用于实用的
以下是部分核心代码
#include "glog/logging.h"
#include "omp.h"
#include "opencv2/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include <chrono>
#include <iomanip>
#include <iostream>
#include <ostream>
#include <vector>
#include <cstring>
#include <fstream>
#include <numeric>
#include <include/config.h>
#include <include/ocr_det.h>
#include <include/ocr_rec.h>
#include <include/JsonLite.h>
using namespace std;
using namespace cv;
using namespace PaddleOCR;
static OCRConfig* pconfig = NULL;
extern "C" __declspec(dllexport) bool LoadModel(DBDetector * *pdet, Classifier * *pcls, CRNNRecognizer * *prec);
__declspec(dllexport) bool LoadModel(DBDetector** pdet, Classifier** pcls, CRNNRecognizer** prec)
{
OCRConfig config("config.txt");
config.PrintConfigInfo();
*pdet = new DBDetector(config.det_model_dir, config.use_gpu, config.gpu_id,
config.gpu_mem, config.cpu_math_library_num_threads,
config.use_mkldnn, config.max_side_len, config.det_db_thresh,
config.det_db_box_thresh, config.det_db_unclip_ratio,
config.visualize, config.use_tensorrt, config.use_fp16);
*pcls = nullptr;
if (config.use_angle_cls == true) {
*pcls = new Classifier(config.cls_model_dir, config.use_gpu, config.gpu_id,
config.gpu_mem, config.cpu_math_library_num_threads,
config.use_mkldnn, config.cls_thresh,
config.use_tensorrt, config.use_fp16);
}
*prec = new CRNNRecognizer(config.rec_model_dir, config.use_gpu, config.gpu_id,
config.gpu_mem, config.cpu_math_library_num_threads,
config.use_mkldnn, config.char_list_file,
config.use_tensorrt, config.use_fp16);
//std::cout << "00000" << std::endl;
return (pdet != NULL);
}
/*
1.���ؿ�ѡ���壻
2.���ؽ����ַ���
*/
extern "C" __declspec(dllexport) void Rec(DBDetector * pdet, Classifier * pcls, CRNNRecognizer * prec, char* input, int width, int height, char** result);
__declspec(dllexport) void Rec(DBDetector* pdet, Classifier* pcls, CRNNRecognizer* prec, char* input, int width, int height, char** result)
{
JsonObjectBuilder builder;
cv::Mat srcimg(height, width, CV_8UC3, input);
//std::cout << "00000" << std::endl;
auto start = std::chrono::system_clock::now();
std::vector<std::vector<std::vector<int>>> boxes;
// ���
(*pdet).Run(srcimg, boxes);
// ʶ��
(*prec).Run(boxes, srcimg, pcls, builder);
JString cs = builder.Build();
std::cout << cs << std::endl;
*result = new char[cs.GetLength()+10];
strcpy(*result, cs);
auto end = std::chrono::system_clock::now();
auto duration =
std::chrono::duration_cast<std::chrono::microseconds>(end - start);
std::cout << "Cost "
<< double(duration.count()) *
std::chrono::microseconds::period::num /
std::chrono::microseconds::period::den
<< "s" << std::endl;
//return new cv::Mat(srcimg);
}
完整的源代码可以登录【华纳网】下载。
https://www.worldwarner.com/
免责声明:本文仅代表作者个人观点,与华纳网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。