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/





免责声明:本文仅代表作者个人观点,与华纳网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。