#pragma once #include "commondef.h" #include "ImageApplyHeaders.h" #include "CSizedetect.h" #include #include #include using namespace std; static std::map papersize{ {A3, Size{297, 420}}, {A4, Size{210, 297}}, {A5, Size{148, 210}}, {A6, Size{105, 148}}, {B4, Size{250, 353}}, {B5, Size{176, 250}}, {B6, Size{125, 176}}, {MaxSize, Size{297, 420 * 2}}, {USStatement, Size{297, (long)(420 * 1.5)}}, {USLetter, Size{216, 279}}, {USLegal, Size{216, 356}}, {USLedger, Size{279, 432}}, {None, Size{297, 420}}, {K8, Size{270, 390}}, {K16, Size{190, 270}}, {Trigeminy, Size{270, 560}}, }; class IImageHandler { public: virtual ~IImageHandler() {} virtual void add_image(void *data, int width, int height, int type,int scannnum) = 0; virtual void config_procparams(HGImgProcParms params) = 0; virtual void add_scanevent(HGIntInfo status) = 0; virtual void clear() = 0; virtual bool done() = 0; virtual void Set_ratio(u32 h_ratio,u32 v_ratio) = 0; ImgStatus getimgstatus() { return m_imgstatus;} void resetimgstatus() { m_imgstatus={.status=NO_error,.sannum=0};} Size GetPaperSize(std::uint32_t paperType, float dpi, int orentation) { if (papersize.find((TwSS)paperType) != papersize.end() && (dpi > 99 && dpi < 601)) { Size resize{2338, 3307}; if (orentation == 0) { resize.x = papersize[(TwSS)paperType].x * dpi / 25.4; resize.y = papersize[(TwSS)paperType].y * dpi / 25.4; return resize; } else { resize.y = papersize[(TwSS)paperType].x * dpi / 25.4; resize.x = papersize[(TwSS)paperType].y * dpi / 25.4; return resize; } } return Size{2338, 3307}; } void set_scanconfig(HGScanConfig config) { m_scanconfig = config; } bool set_config(GScanCap config) { m_hgimgconfig = config; m_ials.clear(); if(m_dog.get()) { if(m_hgimgconfig.dogeardistabce>=10 && m_hgimgconfig.dogeardistabce <=300) m_dog->setDistance(m_hgimgconfig.dogeardistabce); else m_dog->setDistance(50); } if(config.fillhole.is_fillhole) { float ratio=config.fillhole.fillholeratio/100.0; m_ials.push_back(std::shared_ptr(new CImageApplyOutHole(200.0f,ratio,50.0))); } bool islongcustomcrop = config.papertype == 52; //bool isautocrop = config.papertype == TwSS::None; Size fixedSize; printf(" \nconfig.papertype=%d", config.papertype); printf(" \nconfig.AutoCrop_threshold=%d", config.AutoCrop_threshold); printf(" \nconfig.autodescrew=%d", config.autodescrew); printf(" \nconfig.automaticcolor=%d", config.automaticcolor); printf(" \nconfig.brightness=%f", config.brightness); printf(" \nconfig.contrast=%f", config.contrast); printf(" \nconfig.detachnoise=%d", config.detachnoise); printf(" \nconfig.en_fold=%d", config.en_fold); printf(" \nconfig.en_sizecheck=%d", config.en_sizecheck); printf(" \nconfig.enhance_color=%d", config.enhance_color); printf(" \nconfig.fillbackground=%d", config.fillbackground); printf(" \nconfig.filter=%d", config.filter); printf(" \nconfig.fillhole.is_fillhole=%d", config.fillhole.is_fillhole); printf(" \nconfig.gamma=%f", config.gamma); printf(" \nconfig.hardwarecaps.capturepixtype=%d", config.hardwarecaps.capturepixtype); printf(" \nconfig.hardwarecaps.en_doublefeed=%d", config.hardwarecaps.en_doublefeed); printf(" \nconfig.hsvcorrect=%d", config.hsvcorrect); printf(" \nconfig.imageRotateDegree=%d", config.imageRotateDegree); printf(" \nconfig.indent=%d", config.indent); printf(" \nconfig.is_autocontrast=%d", config.is_autocontrast); printf(" \nconfig.is_autocrop=%d", config.is_autocrop); printf(" \nconfig.is_autodiscradblank_normal=%d", config.is_autodiscradblank_normal); printf(" \nconfig.is_autodiscradblank_vince=%d", config.is_autodiscradblank_vince); printf(" \nconfig.is_autotext=%d", config.is_autotext); printf(" \nconfig.is_backrotate180=%d", config.is_backrotate180); printf(" \nconfig.is_convex=%d", config.is_convex); printf(" \nconfig.is_duplex=%d", config.is_duplex); printf(" \nconfig.is_switchfrontback=%d", config.is_switchfrontback); printf(" \nconfig.is_dogeardetection=%d", config.is_dogeardetection); printf(" \nconfig.fillhole.multi_output_red=%d", config.multi_output_red); printf(" \nconfig.noise=%d", config.noise); printf(" \nconfig.hardwarecaps.paperAlign=%d", config.paperAlign); printf(" \nconfig.hardwarecaps.pixtype=%d", config.pixtype); printf(" \nconfig.resolution_dst=%d", config.resolution_dst); printf(" \nconfig.resolution_native=%d", config.resolution_native); printf(" \nconfig.scannum=%d", config.scannum); printf(" \nconfig.sharpen=%d", config.sharpen); printf(" \nconfig.is_dogeardetection=%d", config.is_dogeardetection); fixedSize = GetPaperSize(config.papertype, 200.0f, config.paperAlign); // m_ials.push_back(shared_ptr(new CImageApplyAutoCrop(islongcustomcrop ? islongcustomcrop : config.is_autocrop, // config.autodescrew, config.fillbackground, cv::Size(fixedSize.x, fixedSize.y), config.is_convex,false,config.AutoCrop_threshold,config.noise,config.indent))); if (config.is_autodiscradblank_normal || config.is_autodiscradblank_vince) { //m_ials.push_back(shared_ptr(new CImageApplyDiscardBlank())); CImageApplyDiscardBlank *disBlank = new CImageApplyDiscardBlank(); //跳过空白页阈值 int area = 200; int intensity = 15; int maxHeight = 3307; //A3 height //页面最大高度获取 if (config.papertype == 54) maxHeight = 6614; //阈值参数赋值 if (config.discardblank_percent < 10) { area = 70 + (int)((config.discardblank_percent - 1) * 13.33); intensity = 8 + config.discardblank_percent / 2; } else if (config.discardblank_percent < 20) { area = 190 + (config.discardblank_percent - 10) * 14; intensity = 15; } else if (config.discardblank_percent < 40) { area = 400 + (config.discardblank_percent - 20) * 10; intensity = 20; } else if (config.discardblank_percent < 60) { area = 600 + (config.discardblank_percent - 40) * 20; intensity = 20; } else if (config.discardblank_percent < 80) { area = 1000 + (config.discardblank_percent - 60) * 55; intensity = 30; } else { area = 2100 + (config.discardblank_percent - 80) * (maxHeight - 2100) / 20; intensity = 40; } //判断是否为跳过空白页发票 if (config.is_autodiscradblank_vince) { area *= 1.5; intensity *= 1.5; } //设置参数阈值 // disBlank->setMinArea(area); // disBlank->setIntensity(intensity); printf("\n area =%d,intensity =%d ",area,intensity); m_ials.push_back(shared_ptr(disBlank)); //m_ials.push_back(shared_ptr(new CImageApplyDiscardBlank(config.areanum,config.devnmax))); } m_ials.push_back(shared_ptr(new CImageApplyAutoCrop(islongcustomcrop ? islongcustomcrop : config.is_autocrop, config.autodescrew, config.fillbackground, cv::Size(fixedSize.x, fixedSize.y), config.is_convex,false,config.AutoCrop_threshold,config.noise,config.indent))); //除底色 if(config.fadeback && config.pixtype == 2) m_ials.push_back(shared_ptr(new CImageApplyFadeBackGroudColor(100,0,config.fadebackrange))); //自定义裁切 if(config.cropRect.enable &&!config.is_autocrop) { printf("\n 自定义裁切"); m_ials.push_back(shared_ptr(new CImageApplyCustomCrop(cv::Rect(config.cropRect.x,config.cropRect.y,config.cropRect.width,config.cropRect.height)))); } // if (config.customGamma.enable) // { // m_iaList.push_back(shared_ptr(new CImageApplyCustomGamma(imgparams.customGamma.table, imgparams.customGamma.tableLength))); // } //filter 0 r 1 g 2 b 3 none enhance color 0 none 1 r 2 g 3 b if (config.filter != 3 || config.enhance_color) { int channel = 0; //filter none r g b enhance none r g b if (config.filter != 3) { channel = config.filter; } else { channel = config.enhance_color + 4; } m_ials.push_back(shared_ptr(new CImageApplyChannel(static_cast(channel)))); } if (config.brightness != 0 || config.contrast != 0 || config.gamma != 1.0) { double aa = (254 / 2000.0) * config.brightness + 0.5; int bright = ceil(aa); //[-127,128] 0.128=256.0/2000.0 int contrast = 0.0; //= (int)(config.contrast * 0.036);;//[-36,36] 0.036=72.0/2000.0; if (config.contrast < 0.0) // 暂不修改对比度,彩色文稿色偏 contrast = (int)(config.contrast * 0.036); else contrast = (int)(config.contrast * 0.018); m_ials.push_back(shared_ptr(new CImageApplyAdjustColors(bright, contrast, config.gamma))); } //答题卡除红 if (config.hsvcorrect && config.pixtype==2) { printf("\n 答题卡除红"); m_ials.push_back(shared_ptr(new CImageApplyHSVCorrect(CImageApplyHSVCorrect::CorrectOption::Red_Removal))); } //防止渗透 if (config.refuseInflow) { printf("\n 防止渗透"); m_ials.push_back(shared_ptr(new CImageApplyRefuseInflow())); } //色彩校正 if (config.colorCorrection && config.pixtype != 0) { printf("\n 色彩校正"); m_ials.push_back(shared_ptr(new CImageApplyAutoContrast())); } //除摩尔纹 除网纹 if (config.textureRemove ||config.removeMorr) { printf("\n 除摩尔纹 除网纹"); m_ials.push_back(shared_ptr(new CImageApplyTextureRemoval())); } //锐化 if (config.sharpen) { CImageApplyFilter::FilterMode sb = (CImageApplyFilter::FilterMode)config.sharpen; m_ials.push_back(shared_ptr(new CImageApplyFilter(sb))); } //自动颜色识别 // if (config.automaticcolor) // m_ials.push_back(shared_ptr(new CImageApplyColorRecognition(config.automaticcolortype==1? CImageApplyColorRecognition::ColorRecognitionMode::Color_Gray:CImageApplyColorRecognition::ColorRecognitionMode::Color_Mono))); //缩放 if (config.resolution_dst != config.resolution_native) { CImageApplyResize *apply; bool islongcustomcrop = false; if (config.papertype == 52 || config.normalCrop) islongcustomcrop = true; if (config.is_autocrop || islongcustomcrop) { double ratio = config.resolution_dst / 200.0; // apply = new CImageApplyResize(CImageApplyResize::ResizeType::RATIO, cv::Size(0, 0), ratio, ratio); } else { Size dSize = GetPaperSize(config.papertype, config.resolution_dst, config.paperAlign); apply = new CImageApplyResize(CImageApplyResize::ResizeType::DSIZE, cv::Size(dSize.x, dSize.y), 1.0, 1.0); } m_ials.push_back(shared_ptr(apply)); } //二值化 if (config.pixtype == 0) //threshold { if(config.errorExtention) m_ials.push_back(shared_ptr(new CImageApplyBWBinaray(CImageApplyBWBinaray::ThresholdType::ERROR_DIFFUSION))); else { //m_ials.push_back(shared_ptr(new CImageApplyResize(CImageApplyResize::ResizeType::RATIO,cv::Size(0,0),600.0/(double(config.resolution_dst)),600.0/(double(config.resolution_dst))))); m_ials.push_back(shared_ptr(new CImageApplyBWBinaray(CImageApplyBWBinaray::ThresholdType::THRESH_BINARY,30,37,19))); //m_ials.push_back(shared_ptr(new CImageApplyResize(CImageApplyResize::ResizeType::RATIO,cv::Size(0,0),(double(config.resolution_dst))/600.0,(double(config.resolution_dst))/600.0))); } //黑白降噪优化 if (config.detachnoise.is_detachnoise) { m_ials.push_back(shared_ptr(new CImageApplyDetachNoise(config.detachnoise.detachnoise))); } } if (config.en_fold) { m_ials.push_back(shared_ptr(new CImageApplyConcatenation(CImageApplyConcatenation::horizontal, cv::Scalar(255, 255, 255)))); } if (config.imageRotateDegree != 0.0 || config.is_backrotate180) { CImageApplyRotation::RotationType type; if (config.imageRotateDegree > 89.0f && config.imageRotateDegree < 91.0f) type = CImageApplyRotation::RotationType::Rotate_90_clockwise; else if (config.imageRotateDegree > 269.0f && config.imageRotateDegree < 271.0f) type = CImageApplyRotation::RotationType::Rotate_90_anti_clockwise; else if (config.imageRotateDegree > 179.0f && config.imageRotateDegree < 181.0f) type = CImageApplyRotation::RotationType::Rotate_180; else type = CImageApplyRotation::RotationType::Invalid; m_ials.push_back(shared_ptr(new CImageApplyRotation(type, config.is_backrotate180, config.resolution_dst, NULL))); } return true; } protected: GScanCap m_hgimgconfig; HGScanConfig m_scanconfig; ImgStatus m_imgstatus; std::vector> m_ials; std::shared_ptr m_dog; std::shared_ptr m_sizedetect; };