#pragma once // API for image process // // created on 2022-03-01 // #include "huagao/hgscanner_error.h" #include "common_setting.h" #include #include //#include "common_setting.h" namespace hg_imgproc { typedef struct _img_data { int img_fmt; // 图片格式(BMP、PNG……,暂时未用) int width; // 行宽度(像素数) int height; // 高度(像素数) int line_bytes; // 每行的字节数 int bits; // 每个像素的位深 bool is_bw; // 是否为黑白图片,由图像处理模块设置 unsigned bytes; // 图像数据字节数(buf中的字节数) void* ip_data; // 图像处理模块的自定义数据,调用者不要随意更改此值!!! void* buf; // 图像数据信息 }IMGDATA, *LPIMGDATA; // 用于释放图像处理模块返回的各种动态内存, mem[i] == NULL 时终止,下列相同参数均照此规则 void imgproc_free_memory(LPIMGDATA* mem); // 所有函数均返回“int”值,代表错误代码, 0为成功,其它错误码由图像处理模块开发者定义 // Function: 用于将原始数据(如图像文件内容),解码为target_fmt指定的图像格式 // // Parameters: raw - 原始的图像数据 // // bytes - raw中数据字节数 // // bits - 位深 // // out - 用于接收解码后的图像数据。由图像处理模块分配内存,调用者调用imgproc_free_memory释放 // // Return: 错误码 // // NOTE: 该函数返回的out结构体中,buf为图像处理的中间数据类型(如cv::mat*),要想获取最终的图片数据, // 需要再调用 imgproc_final 函数进行转换 int imgproc_decode(void* buf, unsigned bytes, int bits, LPIMGDATA** out); // Function: 将倾斜的文本校正 // // Parameters: raw - [in]: 原始的图像数据,*raw == NULL时终止 // // [out]: 最终的图像数据 // // out - 用于接收解码后的图像数据。由图像处理模块分配内存,调用者调用imgproc_free_memory释放 // // dpi - 图片DPI // // double_face - 是否双面 // // Return: 错误码 int imgproc_correct_text(LPIMGDATA** raw, int dpi, bool double_face); // 适用于raw从其它图像处理函数返回的情况 int imgproc_correct_text(LPIMGDATA* raw, LPIMGDATA** out, int dpi, bool double_face); // 适用于raw从文件或者内存中转换而来 // Function: 自动匹配颜色 // // Parameters: raw - [in]: 原始的图像数据,*raw == NULL时终止 // // [out]: 最终的图像数据 // // out - 用于接收解码后的图像数据。由图像处理模块分配内存,调用者调用imgproc_free_memory释放 // // double_face - 是否双面 // // Return: 错误码 int imgproc_auto_adjust_color(LPIMGDATA** raw, bool double_face); // 适用于raw从其它图像处理函数返回的情况 int imgproc_auto_adjust_color(LPIMGDATA* raw, LPIMGDATA** out, bool double_face); // 适用于raw从文件或者内存中转换而来 // Function: 图像拆分 // // Parameters: raw - [in]: 原始的图像数据,*raw == NULL时终止 // // [out]: 最终的图像数据 // // out - 用于接收解码后的图像数据。由图像处理模块分配内存,调用者调用imgproc_free_memory释放 // // Return: 错误码 int imgproc_split(LPIMGDATA** raw); // 适用于raw从其它图像处理函数返回的情况 int imgproc_split(LPIMGDATA* raw, LPIMGDATA** out); // 适用于raw从文件或者内存中转换而来 // Function: 多流输出 // // Parameters: raw - [in]: 原始的图像数据,*raw == NULL时终止 // // out - 用于接收解码后的图像数据。由图像处理模块分配内存,调用者调用imgproc_free_memory释放 // // dpi - 图片DPI // // double_face - 是否双面 // // Return: 错误码 int imgproc_multi_out(LPIMGDATA* raw, LPIMGDATA** out, int dpi, bool double_face); enum { TARGET_FORMAT_GRAY = 1 << 0, TARGET_FORMAT_BLACK_WHITE = 1 << 1, TARGET_FORMAT_RGB = 1 << 2, }; // Function: 用于将图像处理过程的中间态数据,转换为最终的图片数据 // // Parameters: raw - [in]: 原始的图像数据,*raw == NULL时终止,通常该变量是由其它图像处理函数返回的 // // [out]: 最终的图像数据 // // target_fmt - 预期解码到的格式,TARGET_FORMAT_xxx // // Return: 错误码 int imgproc_final(LPIMGDATA** raw, int target_fmt, int dpi); //////////////////////////////////////////////////////////////////////////////// // NEW,flow ... // // 1 - call init to initialize an image processing object handle HIMGPRC // // 2 - call load_buffer or load_file to load raw data // // 3 - call image-processing methods // // 4 - repeat step-3 // // 5 - call final to got outputing data // // 6 - call get_final_data to get outputing data, while return HG_ERR_NO_DATA // // 7 - call release to free the HIMGPRC handle // //////////////////////////////////////////////////////////////////////////////// typedef void* HIMGPRC; typedef struct _img_proc_param { int dpi; int bits; // 单分量位深 int channels; int color_mode; bool double_side; bool black_white; }IMGPRCPARAM, *LPIMGPRCPARAM; typedef struct _img_header { int width; // in pixel int height; // in pixel int bits; // per channel int channels; // RGB - 3; GRAY - 1; ... int line_bytes; // bytes of ONE line unsigned total_bytes;// total bytes }IMGHEAD, *LPIMGHEAD; HIMGPRC init(LPSCANCONF parameter,LPIMGPRCPARAM param,int pid); int load_buffer(HIMGPRC himg,std::shared_ptr> buff); int load_file(HIMGPRC himg, const char* path_file); //图像数据转换 int decode(HIMGPRC himg,int pid); int correct_text(HIMGPRC himg); //拆分 int split(HIMGPRC himg,int multioutputtype,bool is_msplit,bool is_multiout_red,int colortype,bool is_duplex); int fadeback(HIMGPRC himg,int range,bool is_duplex); int multi_out(HIMGPRC himg); int multi_out(HIMGPRC himg,int out_type); int multi_out_red(HIMGPRC himg); int auto_matic_color(HIMGPRC himg,int color_type); int auto_crop(HIMGPRC himg); int fillhole(HIMGPRC himg); int resolution_change(HIMGPRC himg); int croprect(HIMGPRC himg); int channel(HIMGPRC himg); int customgamma(HIMGPRC himg,bool is_custogamma,unsigned char* table,int tableLength); int antiInflow(HIMGPRC himg,int permeate_lv); int colorCorrection(HIMGPRC himg); int orentation(HIMGPRC himg); int textureRemove(HIMGPRC himg); int sharpenType(HIMGPRC himg); int nosieDetach(HIMGPRC himg); int errorextention(HIMGPRC himg); int discardBlank(HIMGPRC himg); int answerSheetFilterRed(HIMGPRC himg); int imgtypechange(HIMGPRC himg,std::string img_type_,void *buf,std::vector &bmpdata); int fold(HIMGPRC himg); int final(HIMGPRC himg); // pimh must not to be NULL, and pimh->total_bytes indicates the length of 'buf' // // if 'buf' was NULL, then return HG_ERR_INSUFFICIENT_MEMORY // // index is ZERO-base, if index is valid, fill the 'pimh' first, and copy data to buf if it was not NULL // return HG_ERR_NO_DATA if it was out of range // // return HG_ERR_OK if index has valid image data and buf is large enough int get_final_data(HIMGPRC himg, LPIMGHEAD pimh, void** buf, int index = 0); int get_final_data(HIMGPRC himg, LPIMGHEAD pimh, std::vector* buf, int index); void release(HIMGPRC himg); }