#include "imageusbhandler.h" #include "opencv2/opencv.hpp" #include "imgproc.h" #include "stringex.hpp" #include "memoryex.h" #include "usbimageprocqueue.h" #include "applog.h" #include "StopWatch.h" #include "jpeglib.h" #include "imageencode.h" #include #include "ImageApplyAutoCrop.h" #include "hgutils.h" static const std::string loggername = "imageusbhandler"; ImageUsbHandler::ImageUsbHandler(std::shared_ptr images) : pool(2), encodepools(4) { LOG_INIT(); this->images = images; m_dog.reset(new CImageApplyDogEarDetection(40,1.0,50)); m_sizedetect.reset(new CSizedetect(1)); initLut(); auto info= jsonconfig().getscannerinfo(); H_ratio =*((float*)(&info.H_ratio)); V_ratio =*((float*)(&info.V_ratio)); } static int num = 0; void ImageUsbHandler::add_image(void *data, int width, int height, int type, int scannnum) { StopWatch addsw; std::string ext = ".jpg"; { if( m_imgstatus.status!=NO_error) return; cv::Mat tmp; if(type == CV_8UC3) tmp = cv::Mat(height / 3 -1 , width * 9, CV_8UC1, data); else tmp = cv::Mat(height, width * 3, CV_8UC1, data); capture_data.push(tmp.clone()); StopWatch checktime; if(m_hgimgconfig.is_dogeardetection || m_hgimgconfig.en_sizecheck) { if(tmp.empty()) return ; auto mergemat = GetMergeMat(tmp, width, height, type); if(m_hgimgconfig.is_dogeardetection) { printf("is_dogeardetection"); if(!m_scanconfig.g200params.pc_correct) correctColor(mergemat, false); auto dogmat=mergemat(cv::Rect(mergemat.cols/2, 0, mergemat.cols/2, mergemat.rows)); m_dog->apply(dogmat,0); if(m_dog->getResult()) { m_imgstatus.status=Dog_error; m_imgstatus.sannum=scannnum; add_scanevent({.From=IMG,.Code=m_imgstatus.status,.Img_Index=m_imgstatus.sannum+1}); return; } } if(m_hgimgconfig.en_sizecheck) { auto sizemat=mergemat(cv::Rect(mergemat.cols/2, 0, mergemat.cols/2, mergemat.rows)); printf("en_sizecheck %d",m_scanconfig.g200params.paper); m_sizedetect->SetPapertype(m_scanconfig.g200params.paper); if(m_sizedetect->preprocess(sizemat,NULL)) { m_imgstatus.status=Size_error; m_imgstatus.sannum=scannnum; add_scanevent({.From=IMG,.Code=m_imgstatus.status,.Img_Index=m_imgstatus.sannum+1}); return; } } } //printf("\n dogear or sizecheck time %f", checktime.elapsed_ms()); std::lock_guard guard(mtx); results.emplace( pool.enqueue([this, width, height, type, ext,scannnum] { StopWatch sw; auto param = m_hgimgconfig; auto ials = m_ials; cv::Mat mat =capture_data.front(); capture_data.pop(); cv::Mat saveMat = GetMergeMat(mat, width, height, type); sw.reset(); if(!m_scanconfig.g200params.pc_correct) correctColor(saveMat, false); LOG_TRACE(string_format("correct time = %f\n", sw.elapsed_ms())); auto paper = (param.papertype == TwSS::A4 && param.paperAlign == PaperAlign::Rot270) ? PaperSize::G400_A4R : PaperSize::G400_AUTO; saveMat = flipRightHalf(saveMat, (int)paper); LOG_TRACE(string_format("correct flip time = %f\n", sw.elapsed_ms())); sw.reset(); if(H_ratio>1.2f ||H_ratio<0.8f) H_ratio=1.0f; if(V_ratio>1.2f || V_ratio <0.8f) V_ratio=1.0f; if((H_ratio != 1.0f) || (V_ratio != 1.0f)) cv::resize(saveMat,saveMat,cv::Size(),H_ratio,V_ratio); cv::Mat imageMat; std::vector imgs; int actwidth = saveMat.cols / 2; int actheight = saveMat.rows; for (int i = 0; i < 2; i++) { imageMat = saveMat(cv::Rect(i * actwidth, 0, actwidth, actheight)); if (!imageMat.empty()) { imgs.push_back(imageMat); //HG_SAVEIMG("/home/linaro/"+to_string(num++)+".jpg",imageMat); } } sw.reset(); auto rets = encodepools.enqueue([this, param ,&imgs, &ials]() -> std::vector { std::shared_ptr imageencode; //(new BmpImageEncode()); std::vector encodedata; if (!m_scanconfig.g200params.iscorrect_mode) { LOG_TRACE(string_format("ials size =%d", ials.size())); if (param.imageRotateDegree != 0.0 && param.imageRotateDegree != 180.0 && imgs.size()>1) { cv::flip(imgs[1], imgs[1], 0); cv::flip(imgs[1], imgs[1], 1); } if (param.is_switchfrontback && (imgs.size() > 1)) std::swap(imgs[0], imgs[1]); for (auto &ialsnode : ials) { ialsnode->apply(imgs, bool(param.is_duplex)); } if ((!param.is_duplex) && (imgs.size() > 1)) imgs.pop_back(); } for (auto &img : imgs) { cv::Mat enMat = img; if (!(enMat.empty() && (param.is_autodiscradblank_normal || param.is_autodiscradblank_vince))) { //cv::resize(enMat,enMat,cv::Size(),1.0,0.666666666667); if(m_scanconfig.g200params.iscorrect_mode) imageencode.reset(new JpegImageEncode(false)); else imageencode.reset(new JpegImageEncode(param.pixtype == 0)); encodedata.push_back(imageencode->encode(enMat)); } } return encodedata; }); auto mem = rets.get(); if (!mem.empty()) { for (auto &data : mem) { if (data.get()) images->push(data, true); else add_scanevent({.From = V4L2, .Code = 1}); } } //printf("imgproce time = %f\n", sw.elapsed_ms()); LOG_TRACE(string_format("imgproce time = %f\n", sw.elapsed_ms())); })); } if(m_hgimgconfig.resolution_dst>200.0 || m_hgimgconfig.papertype==52 || m_hgimgconfig.papertype == 54|| m_hgimgconfig.papertype==131) { while (results.size() >= 2) { results.front().get(); { std::lock_guard guard(mtx); results.pop(); } } } else{ while (results.size() >= 8) { results.front().get(); { std::lock_guard guard(mtx); results.pop(); } } } } void ImageUsbHandler::Set_ratio(u32 h_ratio,u32 v_ratio) { H_ratio =*((float*)(&h_ratio)); V_ratio =*((float*)(&v_ratio)); } void ImageUsbHandler::add_scanevent(HGIntInfo status) { // if(status.From != IMG) // { // VectorMemroyPtr mem = VectorMemroyPtr(new VectorMemroy()); // HGIntInfo info = status; // mem->resize(sizeof(info)); // memcpy(&mem->buf()[0], &info, sizeof(info)); // images->push(mem, false); // std::this_thread::sleep_for(std::chrono::milliseconds(500)); // } VectorMemroyPtr mem = VectorMemroyPtr(new VectorMemroy()); HGIntInfo info = status; mem->resize(sizeof(info)); memcpy(&mem->buf()[0], &info, sizeof(info)); images->push(mem, false); } void ImageUsbHandler::clear() { if (images.get()) images->clear(); while(results.size()>0) results.pop(); while(capture_data.size()>0) capture_data.pop(); } bool ImageUsbHandler::done() { std::lock_guard guard(mtx); //printf("\n results.size() %d ",results.size()); while (results.size() >= 1) { auto &fu_run = results.back(); // if(!(fu_run.valid() && (fu_run.wait_for(std::chrono::seconds(0)) != std::future_status::ready))) // { // //results.pop(); // //printf("\n results pop"); // continue; // } //return !(fu_run.valid() && (fu_run.wait_for(std::chrono::seconds(0)) != std::future_status::ready)); return !(fu_run.wait_for(std::chrono::seconds(0)) != std::future_status::ready); } //return true; return true; } void ImageUsbHandler::config_procparams(HGImgProcParms params) { LOG_TRACE("****ImageUsbHandler config_procparams****\n"); LOG_TRACE(string_format("HGImgProcParms.value = %d \n", params.value)); LOG_TRACE(string_format("HGImgProcParms.papertype = %d HGImgProcParms.scanside = %d \n", params.imgprocparams.papertype, params.imgprocparams.scanside)); LOG_TRACE(string_format("HGImgProcParms.res = %d HGImgProcParms.rotate = %d \n", params.imgprocparams.res, params.imgprocparams.rotate)); LOG_TRACE(string_format("HGImgProcParms.autodescrew = %d HGImgProcParms.fillbackground = %d \n", params.imgprocparams.autodescrew, params.imgprocparams.fillbackground)); LOG_TRACE(string_format("HGImgProcParms.filter = %d HGImgProcParms.enhancecolor = %d \n", params.imgprocparams.filter, params.imgprocparams.enhancecolor)); LOG_TRACE(string_format("HGImgProcParms.fillhole = %d \n", params.imgprocparams.fillhole)); m_procparams = params; }