#define _CRT_SECURE_NO_WARNINGS

#ifndef __InferNetOnnxPaddleOcrAngCls_H__
#define __InferNetOnnxPaddleOcrAngCls_H__

#include <iostream>
#include <fstream>
#include <numeric>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <onnxruntime_cxx_api.h>
#include "../TextBlock.h"

#include <locale>
#include <codecvt>

using namespace cv;
using namespace std;
using namespace Ort;

class InferNetOnnxPaddleOcrAngCls
{
public:
    InferNetOnnxPaddleOcrAngCls();

    void LoadNetwork(const void* modelData, size_t modelDataLength);

    int Process(cv::Mat imageCv);
    int PostProcess(float* pdataIn);
    void Dispose();
private:

    Mat preprocess(Mat srcimg);
    void normalize_(Mat img);
    int inpWidth = 192;
    int inpHeight = 48;
    int numOut;
    std::vector<float> input_image_;

    Env env = Env(ORT_LOGGING_LEVEL_ERROR, "Angle classify");

    Ort::Session* ort_session = nullptr;
    SessionOptions sessionOptions = SessionOptions();
    std::vector<char*> inputNames;
    std::vector<char*> outputNames;
    std::vector<std::vector<int64_t>> inputNodeDims; // >=1 outputs
    std::vector<std::vector<int64_t>> outputNodeDims; // >=1 outputs

    volatile bool _modelLoaded = false;
};

#endif