You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
2.6 KiB
C

#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><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);
};
}