mirror of http://192.168.1.51:8099/lmh188/twain3.0
1.添加答题卡除红算法处理;
2.调整锐化、二值化、答题卡除红的算法处理逻辑,适配全通、好分数、博冠; 3.添加答题卡除红相关参数变量; 4.开启答题卡除红采集彩色图像;
This commit is contained in:
parent
cad96b6e21
commit
d6b74c6807
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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; /**< 颜色增强*/
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue