#pragma once #include #include #include "OCRConfig.h" #include "OCRToolBox.h" #include #include namespace uns { class EasyOCR_Recognizer { public: class NormalizePAD { public: struct Size3i // 自定义3维尺寸结构,表示通道、高度、宽度 { int d0, d1, d2; Size3i operator=(const Size3i& obj); }; private: Size3i max_size; // 最大尺寸 int max_width_half; // 宽度一半,用于可选的中心裁剪等功能 std::string PAD_type; // 填充类型,支持"right"或"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; // 目标图像高度 int imgW; // 目标图像宽度 bool keep_ratio_with_pad; // 保持长宽比并填充标志(暂未使用) double adjust_contrast; // 对比度调整目标值 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& 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(); /// /// EasyOCR 文本识别函数 /// /// 仅包含文本的图像(三通道BGR图像) /// 文本及其置信度 EOCR_Result operator()(const cv::Mat& image); /// /// EasyOCR 文本识别函数 /// /// 完整的待检测图像(三通道BGR图像) /// EasyOCR_Detector检测到的文本位置矩形 /// 若干个 [文本及其置信度] 的组合 EOCR_ResultSet operator()(const cv::Mat& full_image, const EOCRD_Rects& rects); }; }