mirror of http://192.168.1.51:8099/lmh188/twain3.0
parent
c4a9dc06e7
commit
6add56a846
|
@ -14,7 +14,8 @@
|
||||||
static std::vector<CString> color_Modes = {
|
static std::vector<CString> color_Modes = {
|
||||||
_T("24位彩色"),
|
_T("24位彩色"),
|
||||||
_T("256级灰度"),
|
_T("256级灰度"),
|
||||||
_T("黑白")
|
_T("黑白"),
|
||||||
|
_T("颜色自动识别")
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,6 @@ void CImageProcPage::ImageProcPageUpdate(int val,bool is_Crop)
|
||||||
CButton* t_chMultiOutput = (CButton*)(GetDlgItem(IDC_CKMULTIOUTPUT));
|
CButton* t_chMultiOutput = (CButton*)(GetDlgItem(IDC_CKMULTIOUTPUT));
|
||||||
CComboBox* m_temp_sharpen = (CComboBox*)(GetDlgItem(IDC_CMBSHARPEN));
|
CComboBox* m_temp_sharpen = (CComboBox*)(GetDlgItem(IDC_CMBSHARPEN));
|
||||||
is_bw = val == 2 ? true : false;
|
is_bw = val == 2 ? true : false;
|
||||||
int ival = (val == 0 ? 0 : (val == 1 ? 1 : 2));
|
|
||||||
this->is_crop = is_Crop;
|
this->is_crop = is_Crop;
|
||||||
if (((CButton*)GetDlgItem(IDC_CKFILLBLACKRECT))->GetCheck() || ((CButton*)GetDlgItem(IDC_CKAUTODESKREW))->GetCheck() || is_crop)
|
if (((CButton*)GetDlgItem(IDC_CKFILLBLACKRECT))->GetCheck() || ((CButton*)GetDlgItem(IDC_CKAUTODESKREW))->GetCheck() || is_crop)
|
||||||
((CButton*)GetDlgItem(IDC_ADVANCEDSET))->EnableWindow(true);
|
((CButton*)GetDlgItem(IDC_ADVANCEDSET))->EnableWindow(true);
|
||||||
|
@ -64,7 +63,7 @@ void CImageProcPage::ImageProcPageUpdate(int val,bool is_Crop)
|
||||||
{
|
{
|
||||||
((CButton*)GetDlgItem(IDC_ADVANCEDSET))->EnableWindow(false);
|
((CButton*)GetDlgItem(IDC_ADVANCEDSET))->EnableWindow(false);
|
||||||
}
|
}
|
||||||
if (0 == ival)//彩色
|
if (0 == val)//彩色
|
||||||
{
|
{
|
||||||
m_temp->SetCurSel(0);
|
m_temp->SetCurSel(0);
|
||||||
m_temp->EnableWindow(FALSE);
|
m_temp->EnableWindow(FALSE);
|
||||||
|
@ -73,12 +72,11 @@ void CImageProcPage::ImageProcPageUpdate(int val,bool is_Crop)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_temp->SetCurSel(0);
|
|
||||||
m_temp->EnableWindow(TRUE);
|
m_temp->EnableWindow(TRUE);
|
||||||
t_chMultiOutput->SetCheck(FALSE);
|
t_chMultiOutput->SetCheck(FALSE);
|
||||||
t_chMultiOutput->EnableWindow(FALSE);
|
t_chMultiOutput->EnableWindow(FALSE);
|
||||||
}
|
}
|
||||||
if (ival == 2)
|
if (val == 2)
|
||||||
{
|
{
|
||||||
((CButton*)GetDlgItem(IDC_CHECKDETACHNOISE))->EnableWindow(true);
|
((CButton*)GetDlgItem(IDC_CHECKDETACHNOISE))->EnableWindow(true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,7 +153,7 @@ void CTwainUI::OnBnClickedBtnhelp()
|
||||||
void CTwainUI::UpdateUI()
|
void CTwainUI::UpdateUI()
|
||||||
{
|
{
|
||||||
//!< basic page
|
//!< basic page
|
||||||
m_pageBasic->m_cmBoxColorMode->SetCurSel(get_map_key_by_value(colorModes, settings->pixtype));//!< 颜色模式
|
m_pageBasic->m_cmBoxColorMode->SetCurSel(settings->automaticcolor ? 3 : get_map_key_by_value(colorModes, settings->pixtype));//!< 颜色模式
|
||||||
m_pageBasic->m_cmBoxResultion->SetCurSel(get_map_key_by_value(resolutions, settings->resolution_dst));//!< 分辨率
|
m_pageBasic->m_cmBoxResultion->SetCurSel(get_map_key_by_value(resolutions, settings->resolution_dst));//!< 分辨率
|
||||||
m_pageBasic->m_cmBoxDuplex->SetCurSel(getCmbDuplexIndex());//!< 单双面
|
m_pageBasic->m_cmBoxDuplex->SetCurSel(getCmbDuplexIndex());//!< 单双面
|
||||||
m_pageBasic->m_cmBoxSS->SetCurSel(getPaparSizeIndex(settings->papertype, settings->paperAlign)); //!< 纸张类型
|
m_pageBasic->m_cmBoxSS->SetCurSel(getPaparSizeIndex(settings->papertype, settings->paperAlign)); //!< 纸张类型
|
||||||
|
@ -232,7 +232,7 @@ void CTwainUI::UpdateUI()
|
||||||
|
|
||||||
void CTwainUI::UpdateFilterCmbx()
|
void CTwainUI::UpdateFilterCmbx()
|
||||||
{
|
{
|
||||||
if (settings->pixtype == TWPT_RGB)
|
if (settings->pixtype == 2)
|
||||||
{
|
{
|
||||||
m_pageImageProc->m_cmBoxFilter.SetCurSel(0);
|
m_pageImageProc->m_cmBoxFilter.SetCurSel(0);
|
||||||
m_pageImageProc->m_cmBoxFilter.EnableWindow(FALSE);
|
m_pageImageProc->m_cmBoxFilter.EnableWindow(FALSE);
|
||||||
|
@ -380,7 +380,7 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs)
|
||||||
{
|
{
|
||||||
//!< Page Basic
|
//!< Page Basic
|
||||||
m_pageBasic->UpdateData();
|
m_pageBasic->UpdateData();
|
||||||
configItem->Pixtype = m_pageBasic->m_cmBoxColorMode->GetCurSel();//!< 颜色模式 index
|
configItem->Pixtype = m_pageBasic->m_cmBoxColorMode->GetCurSel() == 3 ? 0 : m_pageBasic->m_cmBoxColorMode->GetCurSel();//!< 颜色模式 index
|
||||||
configItem->EnSizeCheck = m_pageBasic->m_enableSizeCheck;
|
configItem->EnSizeCheck = m_pageBasic->m_enableSizeCheck;
|
||||||
configItem->Resolution = m_pageBasic->m_cmBoxResultion->GetCurSel();//!< 分辨率 index
|
configItem->Resolution = m_pageBasic->m_cmBoxResultion->GetCurSel();//!< 分辨率 index
|
||||||
configItem->Duplex = m_pageBasic->m_cmBoxDuplex->GetCurSel();//!< 单双面
|
configItem->Duplex = m_pageBasic->m_cmBoxDuplex->GetCurSel();//!< 单双面
|
||||||
|
@ -435,8 +435,9 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs)
|
||||||
if (!updateDs)
|
if (!updateDs)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
settings->automaticcolor = m_pageBasic->m_cmBoxColorMode->GetCurSel() == 3 ? 1 : 0;
|
||||||
settings->pixtype = colorModes[configItem->Pixtype];
|
settings->pixtype = colorModes[configItem->Pixtype];
|
||||||
settings->hardwarecaps.capturepixtype = settings->pixtype;
|
settings->hardwarecaps.capturepixtype = settings->pixtype == 2 ? 2 : settings->pixtype;
|
||||||
|
|
||||||
PaperStatus paper = paperStatusMap[configItem->PaperSize];
|
PaperStatus paper = paperStatusMap[configItem->PaperSize];
|
||||||
settings->papertype = paper.Paper;
|
settings->papertype = paper.Paper;
|
||||||
|
|
|
@ -62,7 +62,6 @@ typedef enum tagUsbSupported {
|
||||||
UPDATE_SCAN_PARAMETER = 72,
|
UPDATE_SCAN_PARAMETER = 72,
|
||||||
// PC繁忙或出错
|
// PC繁忙或出错
|
||||||
PC_SCAN_BUSY_or_ERROR = 73,
|
PC_SCAN_BUSY_or_ERROR = 73,
|
||||||
|
|
||||||
//摺角
|
//摺角
|
||||||
DOG_EAR=74,
|
DOG_EAR=74,
|
||||||
//幅面检测错误
|
//幅面检测错误
|
||||||
|
|
|
@ -240,7 +240,7 @@ int GScanO200::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (m_pImages->empty()) {
|
if (m_pImages->empty()) {
|
||||||
//DoEvents();
|
DoEvents();
|
||||||
this_thread::sleep_for(chrono::milliseconds(1));
|
this_thread::sleep_for(chrono::milliseconds(1));
|
||||||
if (sw.elapsed_s() > 20.00)
|
if (sw.elapsed_s() > 20.00)
|
||||||
{
|
{
|
||||||
|
@ -276,7 +276,7 @@ int GScanO200::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
|
||||||
#endif // LOG
|
#endif // LOG
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
//DoEvents();
|
DoEvents();
|
||||||
this_thread::sleep_for(chrono::milliseconds(2));
|
this_thread::sleep_for(chrono::milliseconds(2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -585,16 +585,7 @@ void GScanO200::usbmain()
|
||||||
devState = haveError ? DevState::DEV_WRONG : DevState::DEV_STOP;
|
devState = haveError ? DevState::DEV_WRONG : DevState::DEV_STOP;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if(gcap.resolution_dst>200.0f)
|
||||||
if (gcap.resolution_dst == 200.0f)
|
|
||||||
{
|
|
||||||
if (m_pImages->orginimgcount() > 5)
|
|
||||||
{
|
|
||||||
this_thread::sleep_for(chrono::milliseconds(10));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(gcap.resolution_dst>200.0f)
|
|
||||||
{
|
{
|
||||||
if (m_pImages->orginimgcount() > 2)
|
if (m_pImages->orginimgcount() > 2)
|
||||||
{
|
{
|
||||||
|
|
|
@ -78,7 +78,7 @@ static std::map<PaperStatus, unsigned int> SupPaperTyps = {
|
||||||
static std::map<unsigned short, unsigned int> SupPixelTypes = {
|
static std::map<unsigned short, unsigned int> SupPixelTypes = {
|
||||||
{0, 0},//bw
|
{0, 0},//bw
|
||||||
{1, 0},//gray
|
{1, 0},//gray
|
||||||
{2, 1}//color
|
{2, 1},//color
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::map<float, unsigned int> SupResolutions = {
|
static std::map<float, unsigned int> SupResolutions = {
|
||||||
|
|
|
@ -146,15 +146,6 @@ 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
|
|
||||||
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 imageRotateDegree : " + to_string(scanParam.imageRotateDegree) + "\n is_autocrop : " + to_string(scanParam.is_autocrop) + "\n is_autodiscradblank_normal : " + to_string(scanParam.is_autodiscradblank_normal) + "\n is_autodiscradblank_vince : " + to_string(scanParam.is_autodiscradblank_vince)
|
|
||||||
+ "\n is_autotext : " + to_string(scanParam.is_autotext) + "\n is_backrotate180 : " + to_string(scanParam.is_backrotate180) + "\n is_duplex : " + to_string(scanParam.is_duplex) + "\n is_switchfrontback : " + to_string(scanParam.is_switchfrontback) + "\n multi_output_red : " + to_string(scanParam.multi_output_red)
|
|
||||||
+ "\n paperAlign : " + to_string(scanParam.paperAlign) + "\n papertype : " + to_string(scanParam.papertype) + "\n resolution_dst : " + to_string(scanParam.resolution_dst) + "\n scannum : " + to_string(scanParam.scannum) + "\n sharpen : " + to_string(scanParam.sharpen)+
|
|
||||||
"\n Pixtype : "+to_string(scanParam.pixtype);
|
|
||||||
FileTools::write_log("D:\\2.txt", outinfo);
|
|
||||||
#endif // DEBUG
|
|
||||||
|
|
||||||
m_iaList.clear();
|
m_iaList.clear();
|
||||||
if (scanParam.fillhole.is_fillhole) {
|
if (scanParam.fillhole.is_fillhole) {
|
||||||
|
@ -173,7 +164,6 @@ void ImageMatQueue::setparam(const GScanCap& param)
|
||||||
#endif
|
#endif
|
||||||
m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplyAutoCrop(islongcustomcrop ? islongcustomcrop : param.is_autocrop, param.autodescrew, param.fillbackground, cv::Size(fixedSize.cx, fixedSize.cy), param.is_convex,param.AutoCrop_threshold,param.noise,param.indent)));
|
m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplyAutoCrop(islongcustomcrop ? islongcustomcrop : param.is_autocrop, param.autodescrew, param.fillbackground, cv::Size(fixedSize.cx, fixedSize.cy), param.is_convex,param.AutoCrop_threshold,param.noise,param.indent)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (param.is_autodiscradblank_normal || param.is_autodiscradblank_vince) {
|
if (param.is_autodiscradblank_normal || param.is_autodiscradblank_vince) {
|
||||||
//m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplyDiscardBlank()));
|
//m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplyDiscardBlank()));
|
||||||
CImageApplyDiscardBlank* disBlank = new CImageApplyDiscardBlank();
|
CImageApplyDiscardBlank* disBlank = new CImageApplyDiscardBlank();
|
||||||
|
@ -249,6 +239,9 @@ void ImageMatQueue::setparam(const GScanCap& param)
|
||||||
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.automaticcolor)
|
||||||
|
m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplyColorRecognition(param.automaticcolortype==1? CImageApplyColorRecognition::ColorRecognitionMode::Color_Gray:CImageApplyColorRecognition::ColorRecognitionMode::Color_Mono)));
|
||||||
//¶þÖµ»¯
|
//¶þÖµ»¯
|
||||||
if (param.pixtype == 0) //threshold
|
if (param.pixtype == 0) //threshold
|
||||||
m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplyBWBinaray(CImageApplyBWBinaray::ThresholdType::THRESH_BINARY)));
|
m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplyBWBinaray(CImageApplyBWBinaray::ThresholdType::THRESH_BINARY)));
|
||||||
|
@ -410,16 +403,7 @@ void ImageMatQueue::proc()
|
||||||
for (int j = 0; j < m_iaList.size(); j++) {
|
for (int j = 0; j < m_iaList.size(); j++) {
|
||||||
m_iaList[j]->apply(mats, scanParam.is_duplex);
|
m_iaList[j]->apply(mats, scanParam.is_duplex);
|
||||||
}
|
}
|
||||||
//if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0)
|
static int index = 0;
|
||||||
//{
|
|
||||||
// //cv::flip(mats[0], mats[0], -1);
|
|
||||||
// transpose(mats[0], mats[0]);
|
|
||||||
// flip(mats[0], mats[0], 1);
|
|
||||||
// transpose(mats[1], mats[1]);
|
|
||||||
// flip(mats[1], mats[1], 0);
|
|
||||||
|
|
||||||
//}
|
|
||||||
|
|
||||||
for (int i = 0; i < mats.size(); i++) {
|
for (int i = 0; i < mats.size(); i++) {
|
||||||
if (!scanParam.is_duplex && i == 1) {
|
if (!scanParam.is_duplex && i == 1) {
|
||||||
mats[i].release();
|
mats[i].release();
|
||||||
|
@ -430,10 +414,14 @@ void ImageMatQueue::proc()
|
||||||
if (scanParam.pixtype == 1 && scanParam.hsvcorrect)
|
if (scanParam.pixtype == 1 && scanParam.hsvcorrect)
|
||||||
if (mats[i].channels() == 3)
|
if (mats[i].channels() == 3)
|
||||||
cvtColor(mats[i], mats[i], cv::COLOR_BGR2GRAY);
|
cvtColor(mats[i], mats[i], cv::COLOR_BGR2GRAY);
|
||||||
idata = scanParam.pixtype == 0 ? (IMat2Bmp)Mat2BmpBw(mats[i], scanParam.resolution_dst) : Mat2Bmp(mats[i], scanParam.resolution_dst);
|
idata = (scanParam.pixtype == 0 || ((scanParam.automaticcolortype == 0) && (mats[i].channels() == 1))) ? (IMat2Bmp)Mat2BmpBw(mats[i], scanParam.resolution_dst) : Mat2Bmp(mats[i], scanParam.resolution_dst);
|
||||||
if (!scanParam.multi_output_red)
|
if (!scanParam.multi_output_red)
|
||||||
mats[i].release();
|
mats[i].release();
|
||||||
|
|
||||||
auto data = idata.getBmpDataBuffer();
|
auto data = idata.getBmpDataBuffer();
|
||||||
|
//FILE* fd=fopen("D:\\0.bmp","w+");
|
||||||
|
//fwrite(data->data(), data->size(),1 , fd);
|
||||||
|
//fclose(fd);
|
||||||
EnqueueBmpBuffer(data);
|
EnqueueBmpBuffer(data);
|
||||||
data.reset();
|
data.reset();
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,8 @@ using namespace std;
|
||||||
|
|
||||||
//<!»ù±¾Ñ¡Ï
|
//<!»ù±¾Ñ¡Ï
|
||||||
#define PIXTYPE "iPixType"
|
#define PIXTYPE "iPixType"
|
||||||
|
#define AUTOMATICCOLOR "iautomaticcolor"
|
||||||
|
#define AUTOMATICCOLORTYPR "iautomaticcolortype"
|
||||||
#define PAPARSIZE "iPaparSize"
|
#define PAPARSIZE "iPaparSize"
|
||||||
#define ENSIZECHECK "iEnSizeCheck"
|
#define ENSIZECHECK "iEnSizeCheck"
|
||||||
#define PAPERALIGN "iPaperAlign"
|
#define PAPERALIGN "iPaperAlign"
|
||||||
|
@ -187,6 +189,8 @@ struct GScanCap
|
||||||
byte is_duplex; /**< True to use duplex false for simplex, ignored if flatbed*/
|
byte is_duplex; /**< True to use duplex false for simplex, ignored if flatbed*/
|
||||||
byte en_fold;
|
byte en_fold;
|
||||||
int pixtype; /**< type of pixels to transfer image as */
|
int pixtype; /**< type of pixels to transfer image as */
|
||||||
|
int automaticcolor; /**<顔色自動識別*/
|
||||||
|
int automaticcolortype; /**<顔色自動識別后非彩色上傳類型*/
|
||||||
//ScanRect scanrect;
|
//ScanRect scanrect;
|
||||||
float resolution_dst; /**< horizontal resolution */
|
float resolution_dst; /**< horizontal resolution */
|
||||||
float resolution_native;
|
float resolution_native;
|
||||||
|
|
|
@ -20,10 +20,11 @@ GScanCap GscanJsonConfig::GetDefaultGscancapValue()
|
||||||
|
|
||||||
/*< basic page setting*/
|
/*< basic page setting*/
|
||||||
gcap.pixtype = 2;//ĬÈϲÊÉ«
|
gcap.pixtype = 2;//ĬÈϲÊÉ«
|
||||||
|
gcap.automaticcolor = FALSE;
|
||||||
|
gcap.automaticcolortype = 1;
|
||||||
gcap.paperAlign = PaperAlign::Rot0;
|
gcap.paperAlign = PaperAlign::Rot0;
|
||||||
gcap.papertype = 0;//TwSS::NONE
|
gcap.papertype = 0;//TwSS::NONE
|
||||||
gcap.en_sizecheck = FALSE;
|
gcap.en_sizecheck = FALSE;
|
||||||
gcap.en_sizecheck = FALSE;
|
|
||||||
gcap.is_autocrop = TRUE;//ĬÈÏ×Ô¶¯²ÃÇÐ
|
gcap.is_autocrop = TRUE;//ĬÈÏ×Ô¶¯²ÃÇÐ
|
||||||
gcap.is_duplex = TRUE;
|
gcap.is_duplex = TRUE;
|
||||||
gcap.is_autodiscradblank_normal = FALSE;
|
gcap.is_autodiscradblank_normal = FALSE;
|
||||||
|
@ -80,6 +81,8 @@ void GscanJsonConfig::SaveGscanCapConfig(const GScanCap & gcap, const std::strin
|
||||||
|
|
||||||
outJson.AddEmptySubObject("Config");//header
|
outJson.AddEmptySubObject("Config");//header
|
||||||
outJson["Config"].Add(PIXTYPE, (int)gcap.pixtype);
|
outJson["Config"].Add(PIXTYPE, (int)gcap.pixtype);
|
||||||
|
outJson["Config"].Add(AUTOMATICCOLOR, (bool)gcap.automaticcolor,false);
|
||||||
|
outJson["Config"].Add(AUTOMATICCOLORTYPR, (int)gcap.automaticcolortype);
|
||||||
outJson["Config"].Add(PAPARSIZE, (int)(gcap.papertype));
|
outJson["Config"].Add(PAPARSIZE, (int)(gcap.papertype));
|
||||||
outJson["Config"].Add(PAPERALIGN, (int)(gcap.paperAlign));
|
outJson["Config"].Add(PAPERALIGN, (int)(gcap.paperAlign));
|
||||||
outJson["Config"].Add(ENSIZECHECK, (bool)(gcap.en_sizecheck), false);
|
outJson["Config"].Add(ENSIZECHECK, (bool)(gcap.en_sizecheck), false);
|
||||||
|
@ -137,6 +140,8 @@ void GscanJsonConfig::WriteJsonArrayToFile(std::vector<GScanCap> cfgArray, const
|
||||||
root.AddEmptySubObject("Config");
|
root.AddEmptySubObject("Config");
|
||||||
/*< basic setting*/
|
/*< basic setting*/
|
||||||
root["Config"].AddEmptySubArray(PIXTYPE);
|
root["Config"].AddEmptySubArray(PIXTYPE);
|
||||||
|
root["Config"].AddEmptySubArray(AUTOMATICCOLOR);
|
||||||
|
root["Config"].AddEmptySubArray(AUTOMATICCOLORTYPR);
|
||||||
root["Config"].AddEmptySubArray(PAPARSIZE);
|
root["Config"].AddEmptySubArray(PAPARSIZE);
|
||||||
root["Config"].AddEmptySubArray(PAPERALIGN);
|
root["Config"].AddEmptySubArray(PAPERALIGN);
|
||||||
root["Config"].AddEmptySubArray(ENSIZECHECK);
|
root["Config"].AddEmptySubArray(ENSIZECHECK);
|
||||||
|
@ -191,6 +196,8 @@ void GscanJsonConfig::WriteJsonArrayToFile(std::vector<GScanCap> cfgArray, const
|
||||||
for (int i = 0; i < cfgArray.size(); i++)
|
for (int i = 0; i < cfgArray.size(); i++)
|
||||||
{
|
{
|
||||||
root["Config"][PIXTYPE].Add((int)cfgArray[i].pixtype);
|
root["Config"][PIXTYPE].Add((int)cfgArray[i].pixtype);
|
||||||
|
root["Config"][AUTOMATICCOLOR].Add(i,(bool)cfgArray[i].automaticcolor);
|
||||||
|
root["Config"][AUTOMATICCOLORTYPR].Add((int)cfgArray[i].automaticcolortype);
|
||||||
root["Config"][PAPARSIZE].Add((int)cfgArray[i].papertype);
|
root["Config"][PAPARSIZE].Add((int)cfgArray[i].papertype);
|
||||||
root["Config"][PAPERALIGN].Add((int)cfgArray[i].paperAlign);
|
root["Config"][PAPERALIGN].Add((int)cfgArray[i].paperAlign);
|
||||||
root["Config"][ENSIZECHECK].Add(i, (bool)cfgArray[i].en_sizecheck);
|
root["Config"][ENSIZECHECK].Add(i, (bool)cfgArray[i].en_sizecheck);
|
||||||
|
@ -324,6 +331,10 @@ std::vector<GScanCap> GscanJsonConfig::parseJsonFromString(const std::string str
|
||||||
{
|
{
|
||||||
neb::CJsonObject itmPixType;
|
neb::CJsonObject itmPixType;
|
||||||
root["Config"].Get(PIXTYPE, itmPixType);
|
root["Config"].Get(PIXTYPE, itmPixType);
|
||||||
|
neb::CJsonObject itmautomaticcolor;
|
||||||
|
root["Config"].Get(AUTOMATICCOLOR, itmautomaticcolor);
|
||||||
|
neb::CJsonObject itmautomaticcolortype;
|
||||||
|
root["Config"].Get(AUTOMATICCOLORTYPR, itmautomaticcolortype);
|
||||||
neb::CJsonObject itmAutoCrop;
|
neb::CJsonObject itmAutoCrop;
|
||||||
root["Config"].Get(AUTOCROP, itmAutoCrop);
|
root["Config"].Get(AUTOCROP, itmAutoCrop);
|
||||||
neb::CJsonObject itmPaperAlign;
|
neb::CJsonObject itmPaperAlign;
|
||||||
|
@ -429,6 +440,10 @@ std::vector<GScanCap> GscanJsonConfig::parseJsonFromString(const std::string str
|
||||||
|
|
||||||
itmPixType.Get(i, i_value);
|
itmPixType.Get(i, i_value);
|
||||||
cfp.pixtype = i_value;
|
cfp.pixtype = i_value;
|
||||||
|
itmautomaticcolor.Get(i, b_value);
|
||||||
|
cfp.automaticcolor = b_value;
|
||||||
|
itmautomaticcolortype.Get(i, i_value);
|
||||||
|
cfp.automaticcolortype = i_value;
|
||||||
itmPaparSize.Get(i, i_value);
|
itmPaparSize.Get(i, i_value);
|
||||||
cfp.papertype = (byte)i_value;
|
cfp.papertype = (byte)i_value;
|
||||||
itmPaperAlign.Get(i, i_value);
|
itmPaperAlign.Get(i, i_value);
|
||||||
|
@ -538,6 +553,10 @@ std::vector<GScanCap> GscanJsonConfig::parseJsonFromString(const std::string str
|
||||||
|
|
||||||
root["Config"].Get(PIXTYPE, index);
|
root["Config"].Get(PIXTYPE, index);
|
||||||
cfp.pixtype = index;
|
cfp.pixtype = index;
|
||||||
|
root["Config"].Get(AUTOMATICCOLOR, bvalue);
|
||||||
|
cfp.automaticcolor = bvalue;
|
||||||
|
root["Config"].Get(AUTOMATICCOLORTYPR, index);
|
||||||
|
cfp.automaticcolortype = index;
|
||||||
root["Config"].Get(PAPARSIZE, index);
|
root["Config"].Get(PAPARSIZE, index);
|
||||||
cfp.papertype = index;
|
cfp.papertype = index;
|
||||||
root["Config"].Get(PAPERALIGN, index);
|
root["Config"].Get(PAPERALIGN, index);
|
||||||
|
|
|
@ -0,0 +1,126 @@
|
||||||
|
#include "ImageApplyColorRecognition.h"
|
||||||
|
#include "ImageApplyHeaders.h"
|
||||||
|
|
||||||
|
static CImageApplyBWBinaray m_bw;
|
||||||
|
static CImageApplyAdjustColors m_ac(0, 50, 1.0f);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 检测图像是否是彩色。当前逻辑仅针对红色像素进行判断,即存在红色像素则为彩色,否则为非彩色
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="image">待测图像</param>
|
||||||
|
/// <returns>true为彩色,false为非彩色</returns>
|
||||||
|
bool isColor(const cv::Mat& image)
|
||||||
|
{
|
||||||
|
if (image.channels() != 3) return false;
|
||||||
|
|
||||||
|
cv::Mat pDib_resize;
|
||||||
|
cv::resize(image, pDib_resize, cv::Size(image.cols / 9, image.rows / 9), 0, 0, cv::INTER_AREA);
|
||||||
|
|
||||||
|
cv::Mat hsv;
|
||||||
|
cv::cvtColor(pDib_resize, hsv, cv::COLOR_BGR2HSV_FULL);
|
||||||
|
std::vector<cv::Mat> hsv_channels;
|
||||||
|
cv::split(hsv, hsv_channels);
|
||||||
|
|
||||||
|
cv::Mat range_h1, range_h2, range_s, range_v;
|
||||||
|
cv::inRange(hsv_channels[0], 0, 85, range_h1);
|
||||||
|
cv::inRange(hsv_channels[0], 170, 255, range_h2);
|
||||||
|
cv::inRange(hsv_channels[1], 60, 255, range_s);
|
||||||
|
cv::inRange(hsv_channels[2], 100, 255, range_v);
|
||||||
|
|
||||||
|
cv::Mat thre = (range_h1 | range_h2) & range_s & range_v;
|
||||||
|
return cv::sum(thre)[0] > 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isGray(const cv::Mat& image)
|
||||||
|
{
|
||||||
|
if (image.channels() == 3) return true;
|
||||||
|
|
||||||
|
cv::Mat image_clone;
|
||||||
|
cv::resize(image, image_clone, cv::Size(), 0.25, 0.25);
|
||||||
|
int channels[] = { 0 };
|
||||||
|
int histsize[] = { 256 };
|
||||||
|
float range[] = { 0, 256 };
|
||||||
|
const float* histRanges[] = { range };
|
||||||
|
cv::Mat hist;
|
||||||
|
cv::calcHist(&image_clone, 1, channels, cv::Mat(), hist, 1, histsize, histRanges, true, false);
|
||||||
|
|
||||||
|
float pixel_count0 = hist.at<float>(0, 0);
|
||||||
|
float pixel_count255 = hist.at<float>(255, 0);
|
||||||
|
float total = image_clone.total();
|
||||||
|
|
||||||
|
return ((pixel_count0 + pixel_count255) / total) > 0.95;
|
||||||
|
}
|
||||||
|
|
||||||
|
CImageApplyColorRecognition::CImageApplyColorRecognition(ColorRecognitionMode mode)
|
||||||
|
: m_mode(mode)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
CImageApplyColorRecognition::~CImageApplyColorRecognition(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CImageApplyColorRecognition::apply(cv::Mat& pDib, int side)
|
||||||
|
{
|
||||||
|
//先判断是否需要判断是彩色
|
||||||
|
if (m_mode == AllColor || m_mode == Color_Gray || m_mode == Color_Mono)
|
||||||
|
{
|
||||||
|
//如果是彩色,直接退出
|
||||||
|
if (isColor(pDib))
|
||||||
|
{
|
||||||
|
m_result = Color;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pDib.channels() == 3)
|
||||||
|
cv::cvtColor(pDib, pDib, cv::COLOR_BGR2GRAY);
|
||||||
|
|
||||||
|
if (m_mode == Color_Gray)
|
||||||
|
{
|
||||||
|
m_result = Gray;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_mode == Color_Mono)
|
||||||
|
{
|
||||||
|
m_bw.apply(pDib, side);
|
||||||
|
m_result = Mono;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isGray(pDib))
|
||||||
|
m_result = Gray;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_bw.apply(pDib, side);
|
||||||
|
m_result = Mono;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CImageApplyColorRecognition::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
|
||||||
|
{
|
||||||
|
m_results.clear();
|
||||||
|
if (mats.empty()) return;
|
||||||
|
|
||||||
|
if (!mats[0].empty())
|
||||||
|
apply(mats[0], 0);
|
||||||
|
|
||||||
|
m_results.push_back(m_result);
|
||||||
|
|
||||||
|
if (isTwoSide && mats.size() > 1)
|
||||||
|
if (!mats[1].empty())
|
||||||
|
apply(mats[1], 1);
|
||||||
|
|
||||||
|
m_results.push_back(m_result);
|
||||||
|
}
|
||||||
|
|
||||||
|
CImageApplyColorRecognition::ColorType CImageApplyColorRecognition::getResult()
|
||||||
|
{
|
||||||
|
return m_result;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<CImageApplyColorRecognition::ColorType> CImageApplyColorRecognition::getResults()
|
||||||
|
{
|
||||||
|
return m_results;
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
* ====================================================
|
||||||
|
|
||||||
|
* 功能:色彩识别,将识别会“灰度”的24位图转化为256色8位图, 把识别为“黑白”图转化为二值化的8位图
|
||||||
|
* 作者:刘丁维
|
||||||
|
* 生成时间:2020/7/17
|
||||||
|
* 最近修改时间:2020/12/15
|
||||||
|
* 版本号:v1.0 2020/7/17
|
||||||
|
* v1.1 2020/12/15 调整策略,仅判断红色像素,存在红色像素为彩色,否则为灰度;删除输出结果,直接转换图像。
|
||||||
|
* v1.2 2020/12/16 增加颜色限制模式(输出结果只可能两种),增加结果访问接口
|
||||||
|
* ====================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IMAGE_APPLY_COLOR_RECOGNITION_H
|
||||||
|
#define IMAGE_APPLY_COLOR_RECOGNITION_H
|
||||||
|
|
||||||
|
#include "ImageApply.h"
|
||||||
|
|
||||||
|
class CImageApplyColorRecognition : public CImageApply
|
||||||
|
{
|
||||||
|
public :
|
||||||
|
|
||||||
|
//色彩识别模式
|
||||||
|
enum ColorRecognitionMode
|
||||||
|
{
|
||||||
|
AllColor, //全色模式 识别结果可能会是彩色、灰度、黑白
|
||||||
|
Color_Gray, //彩色灰度模式 识别结果只会是彩色或者灰度
|
||||||
|
Color_Mono, //彩色黑白模式 识别结果只会是彩色或者黑白
|
||||||
|
Gray_Mono //灰度黑白模式 识别结果只会是灰度或者黑白
|
||||||
|
};
|
||||||
|
|
||||||
|
//色彩类型
|
||||||
|
enum ColorType
|
||||||
|
{
|
||||||
|
Color, //彩色
|
||||||
|
Gray, //灰度
|
||||||
|
Mono //黑白
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
CImageApplyColorRecognition(ColorRecognitionMode mode = AllColor);
|
||||||
|
|
||||||
|
virtual ~CImageApplyColorRecognition(void);
|
||||||
|
|
||||||
|
virtual void apply(cv::Mat& pDib, int side);
|
||||||
|
|
||||||
|
virtual void apply(std::vector<cv::Mat>& mats, bool isTwoSide);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取图片色彩类型。配合void apply(cv::Mat&, int)接口使用
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>色彩类型</returns>
|
||||||
|
ColorType getResult();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取图片色彩类型。配合void apply(std::vector<cv::Mat>&, int)接口使用
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>色彩类型数组</returns>
|
||||||
|
std::vector<ColorType> getResults();
|
||||||
|
|
||||||
|
private:
|
||||||
|
ColorType m_result;
|
||||||
|
std::vector<ColorType> m_results;
|
||||||
|
ColorRecognitionMode m_mode;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // !IMAGE_APPLY_CONCATENATION_H
|
|
@ -16,5 +16,6 @@
|
||||||
#include "ImageApplyConcatenation.h"
|
#include "ImageApplyConcatenation.h"
|
||||||
#include "ImageApplyHSVCorrect.h"
|
#include "ImageApplyHSVCorrect.h"
|
||||||
#include "ImageApplyDetachNoise.h"
|
#include "ImageApplyDetachNoise.h"
|
||||||
|
#include "ImageApplyColorRecognition.h"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -722,6 +722,7 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
|
||||||
{
|
{
|
||||||
m_scanparam->filter = (byte)Filter::None;
|
m_scanparam->filter = (byte)Filter::None;
|
||||||
m_scanparam->enhance_color = (byte)Enchace_Color::Enhance_None;
|
m_scanparam->enhance_color = (byte)Enchace_Color::Enhance_None;
|
||||||
|
m_scanparam->automaticcolor = FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -739,6 +740,71 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
|
||||||
return capBadOperation();
|
return capBadOperation();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
m_query[CapType::IAutomaticColorEnabled] = msgSupportGetAllSetReset;
|
||||||
|
m_caps[CapType::IAutomaticColorEnabled] = [this](Msg msg, Capability& data)->Result {
|
||||||
|
switch (msg) {
|
||||||
|
case Msg::Get:
|
||||||
|
data = Capability::createEnumeration<Bool>(CapType::IAutomaticColorEnabled, { Bool(),Bool(true) }, Bool(m_scanparam->automaticcolor), FALSE);
|
||||||
|
return success();
|
||||||
|
case Msg::GetCurrent:
|
||||||
|
data = Capability::createOneValue<Bool>(CapType::IAutomaticColorEnabled, (Bool)m_scanparam->automaticcolor);
|
||||||
|
return success();
|
||||||
|
case Msg::Reset:
|
||||||
|
case Msg::GetDefault:
|
||||||
|
m_scanparam->automaticcolor = FALSE;
|
||||||
|
data = Capability::createOneValue<Bool>(CapType::IAutomaticColorEnabled, false);
|
||||||
|
return success();
|
||||||
|
case Msg::Set: {
|
||||||
|
auto mech = data.currentItem<CapType::IAutomaticColorEnabled>();
|
||||||
|
if (mech)
|
||||||
|
{
|
||||||
|
m_scanparam->automaticcolor = TRUE;
|
||||||
|
m_scanparam->pixtype = (int)PixelType::Rgb;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_scanparam->automaticcolor = FALSE;
|
||||||
|
return success();
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return capBadOperation();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
m_query[CapType::IAutomaticColorNonColorPixelType] = msgSupportGetAllSetReset;
|
||||||
|
m_caps[CapType::IAutomaticColorNonColorPixelType] = [this](Msg msg, Capability& data)->Result {
|
||||||
|
switch (msg) {
|
||||||
|
case Msg::Get:
|
||||||
|
data = Capability::createEnumeration<UInt16>(CapType::IAutomaticColorNonColorPixelType, { UInt16(TWPT_BW),UInt16(TWPT_GRAY) }, UInt16(m_scanparam->automaticcolortype), TWPT_GRAY);
|
||||||
|
return success();
|
||||||
|
case Msg::GetCurrent:
|
||||||
|
data = Capability::createOneValue<UInt16>(CapType::IAutomaticColorNonColorPixelType, (UInt16)m_scanparam->automaticcolortype);
|
||||||
|
return success();
|
||||||
|
|
||||||
|
case Msg::Reset:
|
||||||
|
case Msg::GetDefault:
|
||||||
|
m_scanparam->automaticcolortype = TWPT_GRAY;
|
||||||
|
data = Capability::createOneValue<UInt16>(CapType::IAutomaticColorNonColorPixelType, TWPT_GRAY);
|
||||||
|
return success();
|
||||||
|
|
||||||
|
case Msg::Set: {
|
||||||
|
auto mech = data.currentItem<CapType::IAutomaticColorNonColorPixelType>();
|
||||||
|
if (m_scanparam->automaticcolor == TRUE)
|
||||||
|
{
|
||||||
|
if ((UInt16)mech == 0 || (UInt16)mech == 1)
|
||||||
|
{
|
||||||
|
m_scanparam->automaticcolortype = (UInt16)mech;
|
||||||
|
return success();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return badValue();
|
||||||
|
}
|
||||||
|
return seqError();
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return capBadOperation();
|
||||||
|
}
|
||||||
|
};
|
||||||
//add------------------jpegÖÊÁ¿µÈ¼¶---------------------
|
//add------------------jpegÖÊÁ¿µÈ¼¶---------------------
|
||||||
m_query[CapType::IJpegQuality] = msgSupportGetAllSetReset;
|
m_query[CapType::IJpegQuality] = msgSupportGetAllSetReset;
|
||||||
m_caps[CapType::IJpegQuality] = [this](Msg msg, Capability& data)->Result {
|
m_caps[CapType::IJpegQuality] = [this](Msg msg, Capability& data)->Result {
|
||||||
|
@ -876,10 +942,10 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
|
||||||
(UInt16)PaperSize::IsoB5,(UInt16)PaperSize::IsoB6,(UInt16)PaperSize::UsLetter,
|
(UInt16)PaperSize::IsoB5,(UInt16)PaperSize::IsoB6,(UInt16)PaperSize::UsLetter,
|
||||||
(UInt16)PaperSize::UsLegal,(UInt16)PaperSize::None
|
(UInt16)PaperSize::UsLegal,(UInt16)PaperSize::None
|
||||||
#ifndef G300
|
#ifndef G300
|
||||||
#if define G200
|
#if defined G200
|
||||||
,(UInt16)PaperSize::UsLedger,(UInt16)PaperSize::IsoB4,
|
,(UInt16)PaperSize::UsLedger,(UInt16)PaperSize::IsoB4,
|
||||||
(UInt16)PaperSize::MaxSize,(UInt16)PaperSize::UsStatement
|
(UInt16)PaperSize::MaxSize,(UInt16)PaperSize::UsStatement
|
||||||
#elif define G400
|
#elif defined G400
|
||||||
,(UInt16)PaperSize::UsLedger,(UInt16)PaperSize::IsoB4
|
,(UInt16)PaperSize::UsLedger,(UInt16)PaperSize::IsoB4
|
||||||
#endif
|
#endif
|
||||||
#endif //
|
#endif //
|
||||||
|
@ -927,7 +993,6 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
|
||||||
m_autosize = (paper == (byte)PaperSize::None) ? (UInt16)AutoSize::Auto : (UInt16)AutoSize::None;
|
m_autosize = (paper == (byte)PaperSize::None) ? (UInt16)AutoSize::Auto : (UInt16)AutoSize::None;
|
||||||
m_autoboarderdetcet = paper == (byte)PaperSize::None;
|
m_autoboarderdetcet = paper == (byte)PaperSize::None;
|
||||||
m_scanparam->is_autocrop = paper == (byte)PaperSize::None ? 1 : 0;
|
m_scanparam->is_autocrop = paper == (byte)PaperSize::None ? 1 : 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
return success();
|
return success();
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Binary file not shown.
BIN
huagao/stdafx.h
BIN
huagao/stdafx.h
Binary file not shown.
Loading…
Reference in New Issue