1.添加答题卡除红算法处理;

2.调整锐化、二值化、答题卡除红的算法处理逻辑,适配全通、好分数、博冠;
3.添加答题卡除红相关参数变量;
4.开启答题卡除红采集彩色图像;
This commit is contained in:
lovelyyoung 2020-06-23 17:16:45 +08:00
parent cad96b6e21
commit d6b74c6807
4 changed files with 50 additions and 27 deletions

View File

@ -154,7 +154,9 @@ GScanO200::~GScanO200()
devState = DEV_STOP; devState = DEV_STOP;
m_threadUsb->join(); m_threadUsb->join();
m_threadUsb.reset(); m_threadUsb.reset();
//writelog("~GScanO200");
} }
} }
void GScanO200::open(int vid, int pid) void GScanO200::open(int vid, int pid)
@ -187,6 +189,7 @@ int GScanO200::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
devState = DEV_STOP; devState = DEV_STOP;
m_threadUsb->join(); m_threadUsb->join();
m_threadUsb.reset(); m_threadUsb.reset();
//writelog("aquire_bmpdata m_threadUsb.reset();");
} }
Stop_scan();//ֹͣɨÃè Stop_scan();//ֹͣɨÃè
ResetScanner(); ResetScanner();
@ -204,8 +207,8 @@ int GScanO200::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
if (m_pImages->valid()) { if (m_pImages->valid()) {
bmpdata = *(m_pImages->popBmpdata()); bmpdata = *(m_pImages->popBmpdata());
//static int aqimgindex = 0; //static int aqimgindex = 0;
//FileTools::write_log("1.txt", "aquireed image " + to_string(++aqimgindex)); ////FileTools::write_log("1.txt", "aquireed image " + to_string(++aqimgindex));
//FileTools::write_log("E:\\Users\\huago\\Desktop\\1.txt", "aquired image "+ to_string(++aqimgindex)); //FileTools::write_log("C:\\Users\\huagao\\Desktop\\out.txt", "aquired procced image "+ to_string(++aqimgindex));
#ifdef LOG_NORMAL #ifdef LOG_NORMAL
@ -242,7 +245,7 @@ std::string GScanO200::GetFWVersion()
std::string ver = fwVersion.substr((fwVersion.length() - 2), 2); std::string ver = fwVersion.substr((fwVersion.length() - 2), 2);
int verValue = atoi(ver.c_str()); int verValue = atoi(ver.c_str());
m_bread_fixed_ratio_fromDSP = verValue >= 15; m_bread_fixed_ratio_fromDSP = verValue >= 15;
writelog(m_bread_fixed_ratio_fromDSP ? "can get ratio from dsp" : "can not get dsp ratio"); //writelog(m_bread_fixed_ratio_fromDSP ? "can get ratio from dsp" : "can not get dsp ratio");
updateHVRatio(); updateHVRatio();
#endif // G200 #endif // G200
} }
@ -316,18 +319,6 @@ void GScanO200::Scanner_StartScan(UINT16 count)
devState = DEV_STOP; devState = DEV_STOP;
m_threadUsb->join(); m_threadUsb->join();
} }
#ifndef G200
USBCB paperstatus = { GET_PAPER_STATUS ,0,0 };
m_usb->write_bulk(&paperstatus, sizeof(paperstatus));
m_usb->read_bulk(&paperstatus, sizeof(paperstatus));
if (paperstatus.u32_Data == 0) {
m_pImages->setscanflags(false);
devState = DEV_WRONG;
Set_ErrorCode(NO_FEED);
return;
}
#endif // !G200
USBCB status = { GET_DSP_STATUS ,0,0 }; USBCB status = { GET_DSP_STATUS ,0,0 };
m_usb->write_bulk(&status, sizeof(status)); m_usb->write_bulk(&status, sizeof(status));
@ -353,6 +344,18 @@ void GScanO200::Scanner_StartScan(UINT16 count)
break; break;
} }
#ifndef G200
USBCB paperstatus = { GET_PAPER_STATUS ,0,0 };
m_usb->write_bulk(&paperstatus, sizeof(paperstatus));
m_usb->read_bulk(&paperstatus, sizeof(paperstatus));
if (paperstatus.u32_Data == 0) {
m_pImages->setscanflags(false);
devState = DEV_WRONG;
Set_ErrorCode(NO_FEED);
return;
}
#endif // !G200
if (gcap.is_duplex) if (gcap.is_duplex)
count = count == 65535 ? 65535 : count / 2; count = count == 65535 ? 65535 : count / 2;
USBCB usbcb = { START_COMMAND,(UINT32)count ,0 }; USBCB usbcb = { START_COMMAND,(UINT32)count ,0 };
@ -362,6 +365,11 @@ void GScanO200::Scanner_StartScan(UINT16 count)
m_threadUsb.reset(new std::thread(&GScanO200::usbmain, this)); m_threadUsb.reset(new std::thread(&GScanO200::usbmain, this));
m_pImages->run(); m_pImages->run();
} }
else
{
devState = DEV_WRONG;
Set_ErrorCode(USB_DISCONNECTED);
}
} }
void GScanO200::Stop_scan() void GScanO200::Stop_scan()
@ -447,9 +455,9 @@ void GScanO200::usbhotplug_callback(bool isconnect, void* userdata)
void GScanO200::usbhotplug(bool isleft) void GScanO200::usbhotplug(bool isleft)
{ {
if (isleft) { if (isleft) {
devState = DEV_WRONG; devState = DEV_WRONG;
Error_Code = USB_DISCONNECTED; Error_Code = USB_DISCONNECTED;
m_pImages->setscanflags(false); m_pImages->setscanflags(false);
} }
} }
@ -499,8 +507,12 @@ void GScanO200::usbmain()
imgData = Get_Img_Data(totalNum); imgData = Get_Img_Data(totalNum);
if (!imgData->size()) { if (!imgData->size()) {
Stop_scan(); Stop_scan();
writelog("imgData->size() error");
break;
} }
m_pImages->pushMat(std::shared_ptr<IDecode>(new G200Decode(imgData))); m_pImages->pushMat(std::shared_ptr<IDecode>(new G200Decode(imgData)));
/*static int rawdataindex = 0;
FileTools::write_log("C:\\Users\\huagao\\Desktop\\out.txt", "origin rawbuffer index " + std::to_string(++rawdataindex));*/
#ifdef LOG_NORMAL #ifdef LOG_NORMAL
static int rawdataindex = 0; static int rawdataindex = 0;
FileTools::write_log("out.txt", "Enquque rawbuffer index " + std::to_string(++rawdataindex)); FileTools::write_log("out.txt", "Enquque rawbuffer index " + std::to_string(++rawdataindex));
@ -561,6 +573,9 @@ USBCB GScanO200::Get_Scanner_Status()
std::shared_ptr<std::vector<char>> GScanO200::Get_Img_Data(int bufferSize) std::shared_ptr<std::vector<char>> GScanO200::Get_Img_Data(int bufferSize)
{ {
if (m_usb.get() && !m_usb->is_connected())
return std::shared_ptr<std::vector<char>>(new std::vector<char>());
std::shared_ptr<std::vector<char>> imData(new std::vector<char>(bufferSize)); std::shared_ptr<std::vector<char>> imData(new std::vector<char>(bufferSize));
StopWatch sw; StopWatch sw;
int readed = 0; int readed = 0;

View File

@ -123,8 +123,8 @@ void ImageMatQueue::clear()
void ImageMatQueue::setparam(const GScanCap& param) void ImageMatQueue::setparam(const GScanCap& param)
{ {
scanParam = param; scanParam = param;
scanParam.is_duplex = 0; //scanParam.is_duplex = 0;
scanParam.imageRotateDegree = 90.0f; //scanParam.imageRotateDegree = 90.0f;
#ifdef DEBUG #ifdef DEBUG
string outinfo = "autodescrew : " + to_string(scanParam.autodescrew) + "\n brightness : " + to_string(scanParam.brightness) + "\n contrast " + to_string(scanParam.contrast) + "\n enhance_color : " + to_string(scanParam.enhance_color) + "\n en_fold: " + to_string(scanParam.en_fold) string outinfo = "autodescrew : " + to_string(scanParam.autodescrew) + "\n brightness : " + to_string(scanParam.brightness) + "\n contrast " + to_string(scanParam.contrast) + "\n enhance_color : " + to_string(scanParam.enhance_color) + "\n en_fold: " + to_string(scanParam.en_fold)
+ "\n fillbackground : " + to_string(scanParam.fillbackground) + "\n is_fillhole : " + to_string(scanParam.fillhole.is_fillhole) + "\n fillholeratio : " + to_string(scanParam.fillhole.fillholeratio) + "\n filter : " + to_string(scanParam.filter) + "\n gamma : " + to_string(scanParam.gamma) + "\n fillbackground : " + to_string(scanParam.fillbackground) + "\n is_fillhole : " + to_string(scanParam.fillhole.is_fillhole) + "\n fillholeratio : " + to_string(scanParam.fillhole.fillholeratio) + "\n filter : " + to_string(scanParam.filter) + "\n gamma : " + to_string(scanParam.gamma)
@ -174,15 +174,19 @@ void ImageMatQueue::setparam(const GScanCap& param)
int contrast = (int)(param.contrast * 0.036);//[-36,36] 0.036=72.0/2000.0; int contrast = (int)(param.contrast * 0.036);//[-36,36] 0.036=72.0/2000.0;
m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplyAdjustColors(bright, contrast, param.gamma))); m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplyAdjustColors(bright, contrast, param.gamma)));
} }
//´ðÌ⿨³ýºì
if (param.pixtype == 0) //threshold if (scanParam.hsvcorrect)
m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplyBWBinaray(CImageApplyBWBinaray::ThresholdType::THRESH_BINARY))); {
m_iaList.push_back(shared_ptr<CImageApplyHSVCorrect>(new CImageApplyHSVCorrect(CImageApplyHSVCorrect::CorrectOption::Red_Removal)));
}
//Èñ»¯
if (param.sharpen) { if (param.sharpen) {
SharpenBlur sb = (SharpenBlur)param.sharpen; SharpenBlur sb = (SharpenBlur)param.sharpen;
m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplySharpen(sb))); m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplySharpen(sb)));
} }
//¶þÖµ»¯
if (param.pixtype == 0) //threshold
m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplyBWBinaray(CImageApplyBWBinaray::ThresholdType::THRESH_BINARY)));
if (param.resolution_dst != param.resolution_native) if (param.resolution_dst != param.resolution_native)
{ {
@ -200,6 +204,7 @@ void ImageMatQueue::setparam(const GScanCap& param)
} }
m_iaList.push_back(shared_ptr< CImageApply>(apply)); m_iaList.push_back(shared_ptr< CImageApply>(apply));
} }
if (scanParam.en_fold) if (scanParam.en_fold)
{ {
@ -271,7 +276,7 @@ void ImageMatQueue::proc()
for (auto& buf : buffs) { for (auto& buf : buffs) {
ImreadModes rm; ImreadModes rm;
if (scanParam.filter != 3 || scanParam.enhance_color) if (scanParam.filter != 3 || scanParam.enhance_color || scanParam.hsvcorrect)
rm = IMREAD_COLOR; rm = IMREAD_COLOR;
else else
rm = scanParam.pixtype == 2 ? IMREAD_COLOR : IMREAD_GRAYSCALE; rm = scanParam.pixtype == 2 ? IMREAD_COLOR : IMREAD_GRAYSCALE;

View File

@ -50,6 +50,7 @@ using namespace std;
#define MULTIOUTPUT "iMultiOutPut" #define MULTIOUTPUT "iMultiOutPut"
#define OUTHOLE "bOutHole" #define OUTHOLE "bOutHole"
#define OUTHOLERATIO "iOutHoleRatio" #define OUTHOLERATIO "iOutHoleRatio"
#define HSVCORRECT "bHsvCorrect"
//<!送纸选项卡 //<!送纸选项卡
#define ULTRADETECT "bUltrasonicDetect" #define ULTRADETECT "bUltrasonicDetect"
@ -95,6 +96,7 @@ typedef struct tagCONFIGPARAMS
bool EnOutHole; bool EnOutHole;
int OutHoleRatio; int OutHoleRatio;
bool EnMultiOutPutR; bool EnMultiOutPutR;
bool EnHsvCorrect;
/*送纸部分选项卡参数*/ /*送纸部分选项卡参数*/
bool EnUltrasonicDetect; bool EnUltrasonicDetect;
@ -182,6 +184,7 @@ struct GScanCap
byte is_switchfrontback; /**交换正反面*/ byte is_switchfrontback; /**交换正反面*/
byte autodescrew; /**< 自动纠偏*/ byte autodescrew; /**< 自动纠偏*/
byte multi_output_red; /*多流输出*/ byte multi_output_red; /*多流输出*/
byte hsvcorrect; /**<´ðÌ⿨³ýºì*/
byte filter; /**< 除色*/ byte filter; /**< 除色*/
byte sharpen; byte sharpen;
byte enhance_color; /**< 颜色增强*/ byte enhance_color; /**< 颜色增强*/

View File

@ -7,7 +7,7 @@ hgConfigClass::hgConfigClass(GScanCap param)
m_param = { 0 }; m_param = { 0 };
PaperStatus ps = { param.papertype,param.paperAlign }; PaperStatus ps = { param.papertype,param.paperAlign };
m_param.paper = ContainspaperTypesKey(ps) ? SupPaperTyps[ps] : 0; m_param.paper = ContainspaperTypesKey(ps) ? SupPaperTyps[ps] : 0;
if(param.filter!=3||param.enhance_color!=0) if(param.filter!=3||param.enhance_color!=0||param.hsvcorrect)
m_param.color = 1;//color m_param.color = 1;//color
else else
{ {