tx-gxx-linux/device/gxx-linux/scanner/imageusbhandler.cpp

263 lines
13 KiB
C++

#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 <iostream>
#include "ImageApplyAutoCrop.h"
#include "hgutils.h"
static const std::string loggername = "imageusbhandler";
ImageUsbHandler::ImageUsbHandler(std::shared_ptr<UsbImageProcQueue> 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<std::mutex> 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<cv::Mat> 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<MemoryPtr>
{
std::shared_ptr<IImageEncode> imageencode; //(new BmpImageEncode());
std::vector<MemoryPtr> 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<std::mutex> guard(mtx);
results.pop();
}
}
}
else{
while (results.size() >= 8)
{
results.front().get();
{
std::lock_guard<std::mutex> 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<std::mutex> 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;
}