#ifndef REMOVE_BORDER_H
#define REMOVE_BORDER_H

#include <opencv2/opencv.hpp>
#include <string>
#include <vector>
#include "../common.h"
#include "../image_utilities.h"

using namespace std;

/**
 * 偏移参数结构体
 * 对应Python中的offset元组(tx, ty, ws, hs, ta)
 */
struct Offset {
    float tx; // x方向平移
    float ty; // y方向平移
    float ws; // 宽度缩放
    float hs; // 高度缩放
    float ta; // 角度调整
    
    Offset(float tx = 0.0f, float ty = 0.0f, float ws = 0.0f, float hs = 0.0f, float ta = 0.0f)
        : tx(tx), ty(ty), ws(ws), hs(hs), ta(ta) {}
};

/**
 * 根据边框内边缘获取去除边框所用掩膜
 * 
 * args:
 *     imgshape: 图片宽高信息
 *     shapeType: 印章形状信息
 *     filter_border: 边框内边缘
 * returns:
 *     filterMask: 除边框外的印章掩码
 */
cv::Mat get_filterBorderMask(const cv::Size& imgshape, const string& shapeType, const cv::RotatedRect& filter_border);

/**
 * 枚举offsets，找到最合适的边界
 * 
 * args:
 *     img: 图
 *     shapeType: 形状类型
 *     mrect: 一个最小包围矩形
 *     offsets: 平移变换组合
 *     inverse: True以背景点数量最大时为最佳，False以前景点数量最大时为最佳
 *     bg_val: 背景值
 * returns:
 *     best_mrect: 最佳边界，是一个最小包围矩形
 */
cv::RotatedRect _find_bestfit(const cv::Mat& img, const string& shapeType, const cv::RotatedRect& mrect, 
                              const vector<Offset>& offsets, bool inverse = false, int bg_val = 255);

/**
 * 获取去除边框所用掩膜
 * 
 * args:
 *     img: 图
 *     shapeinfo: 形状信息
 *     bg_val: 图片背景色
 * returns:
 *     filterMask: 用来去掉边框的掩膜mask
 *     new_shapeinfo: 新形状信息
 *     inner_border: 边框内边缘
 */
cv::Mat _getFilterMask(const cv::Mat& img, const ShapeInfo& shapeinfo, cv::RotatedRect& inner_border, int bg_val = 255);

/**
 * 去除边框
 * 
 * args:
 *     img: 图片
 *     shapeinfo: 形状信息
 *     bg_val: 图片的背景颜色，默认是白底黑字, 如果是黑底白字的二值图，请设置bg_val为0
 * returns:
 *     img1: 去掉边框后的图片
 *     mask: 去掉边框所用掩膜
 *     new_shapeinfo: 拟合得更好的形状
 *     inner_border: 边框内边缘
 */
cv::Mat remove_border(const cv::Mat& img, const ShapeInfo& shapeinfo, cv::Mat& mask, ShapeInfo& new_shapeinfo, cv::RotatedRect& inner_border, int bg_val = 255);

#endif // REMOVE_BORDER_H