|
|
|
|
#pragma once
|
|
|
|
|
#include <string>
|
|
|
|
|
#include <vector>
|
|
|
|
|
#include "OCRConfig.h"
|
|
|
|
|
#include "OCRToolBox.h"
|
|
|
|
|
#include <opencv2/opencv.hpp>
|
|
|
|
|
#include <onnxruntime_cxx_api.h>
|
|
|
|
|
|
|
|
|
|
namespace uns
|
|
|
|
|
{
|
|
|
|
|
class EasyOCR_Recognizer
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
class NormalizePAD
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
struct Size3i // <20>Զ<EFBFBD><D4B6><EFBFBD>3ά<33>ߴ<EFBFBD><DFB4>ṹ<EFBFBD><E1B9B9><EFBFBD><EFBFBD>ʾͨ<CABE><CDA8><EFBFBD><EFBFBD><EFBFBD>߶ȡ<DFB6><C8A1><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
{
|
|
|
|
|
int d0, d1, d2;
|
|
|
|
|
|
|
|
|
|
Size3i operator=(const Size3i& obj);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
Size3i max_size; // <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>
|
|
|
|
|
int max_width_half; // <20><><EFBFBD><EFBFBD>һ<EFBFBD>룬<EFBFBD><EBA3AC><EFBFBD>ڿ<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD>IJü<C4B2><C3BC>ȹ<EFBFBD><C8B9><EFBFBD>
|
|
|
|
|
std::string PAD_type; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>֧<EFBFBD><D6A7>"right"<22><>"left"
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
NormalizePAD(Size3i max_size, const std::string& PAD_type = "right");
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
cv::Mat operator()(const cv::Mat& input_img) const;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class AlignCollate
|
|
|
|
|
{
|
|
|
|
|
private:
|
|
|
|
|
int imgH; // Ŀ<><C4BF>ͼ<EFBFBD><CDBC><EFBFBD>߶<EFBFBD>
|
|
|
|
|
int imgW; // Ŀ<><C4BF>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
bool keep_ratio_with_pad; // <20><><EFBFBD>ֳ<EFBFBD><D6B3><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>δʹ<CEB4>ã<EFBFBD>
|
|
|
|
|
double adjust_contrast; // <20>Աȶȵ<C8B6><C8B5><EFBFBD>Ŀ<EFBFBD><C4BF>ֵ
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
cv::Mat AdjustContrastGrey(const cv::Mat& img_in, double target = 0.4) const;
|
|
|
|
|
void ContrastGrey(const cv::Mat& img, double& contrast, int& high, int& low) const;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
AlignCollate(int imgH = 32, int imgW = 100, bool keep_ratio_with_pad = false, double adjust_contrast = 0.0);
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
cv::Mat operator()(const std::vector<cv::Mat>& batch) const;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
const OrtApi* ort;
|
|
|
|
|
|
|
|
|
|
Ort::Env ort_env;
|
|
|
|
|
Ort::Session* ort_cpu_session;
|
|
|
|
|
Ort::SessionOptions ort_session_options;
|
|
|
|
|
|
|
|
|
|
bool ort_inited;
|
|
|
|
|
std::wstring model_path;
|
|
|
|
|
|
|
|
|
|
IONames input_names, output_names;
|
|
|
|
|
IONamesStorage input_ns, output_ns;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
float CustomMean(const VecFloat& x);
|
|
|
|
|
cv::Mat Preprocess(const cv::Mat& img) const;
|
|
|
|
|
float CalculateRatio(int width, int height) const;
|
|
|
|
|
VecFloat SoftMAX(const float* logits, int C) const;
|
|
|
|
|
void PostprocessONNXOutput(const Ort::Value& outputs, int N, int T, int C, VecInt& out_indices, VecFloat& out_probs, const VecInt ignore_idx = {});
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
EasyOCR_Recognizer();
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
bool Init();
|
|
|
|
|
bool UnInit();
|
|
|
|
|
bool RecheckModelInfo();
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// EasyOCR <20>ı<EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="image"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>BGRͼ<52><CDBC><EFBFBD><EFBFBD></param>
|
|
|
|
|
/// <returns><3E>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD></returns>
|
|
|
|
|
EOCR_Result operator()(const cv::Mat& image);
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// EasyOCR <20>ı<EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="image"><3E><><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>BGRͼ<52><CDBC><EFBFBD><EFBFBD></param>
|
|
|
|
|
/// <param name="rects">EasyOCR_Detector<6F><72><EFBFBD><EFBFBD><E2B5BD><EFBFBD>ı<EFBFBD>λ<EFBFBD>þ<EFBFBD><C3BE><EFBFBD></param>
|
|
|
|
|
/// <returns><3E><><EFBFBD>ɸ<EFBFBD> [<5B>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD>] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
|
|
|
|
|
EOCR_ResultSet operator()(const cv::Mat& full_image, const EOCRD_Rects& rects);
|
|
|
|
|
};
|
|
|
|
|
}
|