diff --git a/CImageMerge.cpp b/CImageMerge.cpp index f802c2e..a172bed 100644 --- a/CImageMerge.cpp +++ b/CImageMerge.cpp @@ -11,8 +11,8 @@ CImageMerge::~CImageMerge() cv::Mat CImageMerge::MergeImage(cv::Mat &srcMat, int dstwidth, int dstheight,int mode) { cv::Mat dst(srcMat.rows, srcMat.cols / (mode == 0 ? 1:3), CV_8UC(mode == 0 ? 1 : 3)); - return dst; - auto graymerge = [](cv::Mat& src,cv::Mat dst)->cv::Mat{ + auto graymerge = [](cv::Mat& src,cv::Mat dst)->cv::Mat + { int width_block = src.cols / 12; int heigh_block = src.rows; diff --git a/CorrectParam.cpp b/CorrectParam.cpp index 40a5752..43729a8 100644 --- a/CorrectParam.cpp +++ b/CorrectParam.cpp @@ -9,35 +9,35 @@ using namespace std; #define JSONPATH "/mnt/conf-disk/huago/cameraparam.json" -#define TEXTLUT200COLORPATH "/usr/local/huago/Textlut200clr.bmp" -#define LUT200COLORPATH "/usr/local/huago/lut200clr.bmp" -#define LUT200_COLOR_BLACKPATH "/usr/local/huago/lut200clrbw.bmp" -#define LUT200_COLOR_WHITEPATH "/usr/local/huago/lut200clrwhite.bmp" +#define TEXTLUT200COLORPATH "/mnt/conf-disk/huago/Textlut200clr.bmp" +#define LUT200COLORPATH "/mnt/conf-disk/huago/lut200clr.bmp" +#define LUT200_COLOR_BLACKPATH "/mnt/conf-disk/huago/lut200clrbw.bmp" +#define LUT200_COLOR_WHITEPATH "/mnt/conf-disk/huago/lut200clrwhite.bmp" -#define TEXTLUT200GRAYPATH "/usr/local/huago/Textlut200gray.bmp" -#define LUT200GRAYPATH "/usr/local/huago/lut200gray.bmp" -#define LUT200_GRAY_BLACKPATH "/usr/local/huago/lut200graybw.bmp" -#define LUT200_GRAY_WHITEPATH "/usr/local/huago/lut200graywhite.bmp" +#define TEXTLUT200GRAYPATH "/mnt/conf-disk/huago/Textlut200gray.bmp" +#define LUT200GRAYPATH "/mnt/conf-disk/huago/lut200gray.bmp" +#define LUT200_GRAY_BLACKPATH "/mnt/conf-disk/huago/lut200graybw.bmp" +#define LUT200_GRAY_WHITEPATH "/mnt/conf-disk/huago/lut200graywhite.bmp" -#define TEXTLUT300COLORPATH "/usr/local/huago/Textlut300clr.bmp" -#define LUT300COLORPATH "/usr/local/huago/lut300clr.bmp" -#define LUT300_COLOR_BLACKPATH "/usr/local/huago/lut300clrbw.bmp" -#define LUT300_COLOR_WHITEPATH "/usr/local/huago/lut300clrwhite.bmp" +#define TEXTLUT300COLORPATH "/mnt/conf-disk/huago/Textlut300clr.bmp" +#define LUT300COLORPATH "/mnt/conf-disk/huago/lut300clr.bmp" +#define LUT300_COLOR_BLACKPATH "/mnt/conf-disk/huago/lut300clrbw.bmp" +#define LUT300_COLOR_WHITEPATH "/mnt/conf-disk/huago/lut300clrwhite.bmp" -#define TEXTLUT300GRAYPATH "/usr/local/huago/Textlut300gray.bmp" -#define LUT300GRAYPATH "/usr/local/huago/lut300gray.bmp" -#define LUT300_GRAY_BLACKPATH "/usr/local/huago/lut300graybw.bmp" -#define LUT300_GRAY_WHITEPATH "/usr/local/huago/lut300graywhite.bmp" +#define TEXTLUT300GRAYPATH "/mnt/conf-disk/huago/Textlut300gray.bmp" +#define LUT300GRAYPATH "/mnt/conf-disk/huago/lut300gray.bmp" +#define LUT300_GRAY_BLACKPATH "/mnt/conf-disk/huago/lut300graybw.bmp" +#define LUT300_GRAY_WHITEPATH "/mnt/conf-disk/huago/lut300graywhite.bmp" -#define LUT600COLORPATH "/usr/local/huago/lut600clr.bmp" -#define TEXTLUT600COLORPATH "/usr/local/huago/Textlut600clr.bmp" -#define LUT600_COLOR_BLACKPATH "/usr/local/huago/lut600clrbw.bmp" -#define LUT600_COLOR_WHITEPATH "/usr/local/huago/lut600clrwhite.bmp" +#define LUT600COLORPATH "/mnt/conf-disk/huago/lut600clr.bmp" +#define TEXTLUT600COLORPATH "/mnt/conf-disk/huago/Textlut600clr.bmp" +#define LUT600_COLOR_BLACKPATH "/mnt/conf-disk/huago/lut600clrbw.bmp" +#define LUT600_COLOR_WHITEPATH "/mnt/conf-disk/huago/lut600clrwhite.bmp" -#define LUT600GRAYPATH "/usr/local/huago/lut600gray.bmp" -#define TEXTLUT600GRAYPATH "/usr/local/huago/Textlut600gray.bmp" -#define LUT600_GRAY_BLACKPATH "/usr/local/huago/lut600graybw.bmp" -#define LUT600_GRAY_WHITEPATH "/usr/local/huago/lut600graywhite.bmp" +#define LUT600GRAYPATH "/mnt/conf-disk/huago/lut600gray.bmp" +#define TEXTLUT600GRAYPATH "/mnt/conf-disk/huago/Textlut600gray.bmp" +#define LUT600_GRAY_BLACKPATH "/mnt/conf-disk/huago/lut600graybw.bmp" +#define LUT600_GRAY_WHITEPATH "/mnt/conf-disk/huago/lut600graywhite.bmp" CorrectParam::CorrectParam() { diff --git a/HCamDevice.cpp b/HCamDevice.cpp index 4f6dbb7..324d9c8 100644 --- a/HCamDevice.cpp +++ b/HCamDevice.cpp @@ -56,12 +56,28 @@ typedef struct ADC_82V38_Timing #endif #ifdef ADC_82V48 +typedef union CIS_ADC_NEW +{ + struct adcTiming + { + uint32_t regData : 8; + uint32_t : 2; + uint32_t regAddr : 5; + uint32_t rwbit : 1; + uint32_t regData1 : 8; + uint32_t : 2; + uint32_t regAddr1 : 5; + uint32_t rwbit1 : 1; + }bit; + uint32_t value; +}; + struct adcTiming { - uint32_t regData : 8; + uint32_t regData : 8; //数据区 uint32_t : 2; - uint32_t regAddr : 5; - uint32_t rwbit : 1; + uint32_t regAddr : 5; //寄存器地址 + uint32_t rwbit : 1; //读写 1读 0写 uint32_t regData1 : 8; uint32_t : 2; uint32_t regAddr1 : 5; @@ -84,7 +100,7 @@ HCamDevice::HCamDevice() videofd = 0; v4lWidth = 5184;//@300dpi 5184 @600dpi 5184*2 - v4lHeight = 512 ;//* 3;//color_h/gray_h = 3 比如:目标复原图像高度为128 则灰度需要FPGA采集128 彩色采集128*3 + v4lHeight = 513 ;//* 3;//color_h/gray_h = 3 比如:目标复原图像高度为128 则灰度需要FPGA采集128 彩色采集128*3 v4lBufferCount = 10; v4l2buftype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; nplanes = 1; // only use one plane @@ -110,7 +126,9 @@ HCamDevice::HCamDevice() HtCamGetFrameCnt(val1); //HtCamSwitchSampleModes(0); //测试数据 - // HtCamChangeExposureValue(500); //曝光 + unsigned int i[3]={100 ,200 ,300}; + HtCamChangeExposureValueF(i); //曝光 + HtCamChangeExposureValueB(i); // start sample camera_dbg("ST SP : %d , VSNP : %d \r\n" , ST_SP , VSNP); @@ -853,44 +871,95 @@ void HCamDevice::HtCamSwitchSampleModes(uint8_t mode) pCamCtrlReg[4] |= (0x00020000); } -void HCamDevice::HtCamChangeExposureValueF(uint32_t value) +void HCamDevice::HtCamChangeExposureValueF(uint32_t* value) { if (virBaseAddr == NULL) { return ; } uint32_t *pCamCtrlReg = virBaseAddr; + pCamCtrlReg[5] = value[0]; - // pCamCtrlReg[3] |= (uint32_t)(0x00006000); - pCamCtrlReg[5] = 0x00000000; - pCamCtrlReg[6] = 0x00000000; - - pCamCtrlReg[5] |= (uint32_t)(value); // RED - pCamCtrlReg[5] |= (uint32_t)(value << 16); - pCamCtrlReg[6] |= (uint32_t)(value); // GREEN - pCamCtrlReg[6] |= ((uint32_t)value << 16); // BLUE - - + CamZ_Reg_2Short rgb; + rgb.value = HtCamReadFpgaRegs(0x06); + rgb.NShort[0] = value[1]; + rgb.NShort[1] = value[2]; + HtCamWriteFpgaRegs(0x06,rgb.value); + printf("曝光F R:%d G:%d B:%d \r\n",value[0],value[1],value[2]); } -void HCamDevice::HtCamChangeExposureValueB(uint32_t value) +void HCamDevice::HtCamChangeExposureValueB(uint32_t* value) { if (virBaseAddr == NULL) { return ; } uint32_t *pCamCtrlReg = virBaseAddr; + pCamCtrlReg[11] = value[0]; - // pCamCtrlReg[3] |= (uint32_t)(0x00006000); - pCamCtrlReg[11] = 0x00000000; - pCamCtrlReg[12] = 0x00000000; - - pCamCtrlReg[11] |= (uint32_t)(value); // RED - pCamCtrlReg[11] |= (uint32_t)(value << 16); - pCamCtrlReg[12] |= (uint32_t)(value); // GREEN - pCamCtrlReg[12] |= ((uint32_t)value << 16); // BLUE - + CamZ_Reg_2Short rgb; + rgb.value = HtCamReadFpgaRegs(0x0C); + rgb.NShort[0] = value[1]; + rgb.NShort[1] = value[2]; + HtCamWriteFpgaRegs(0x0C,rgb.value); + printf("曝光B R:%d G:%d B:%d \r\n",value[0],value[1],value[2]); } + + + +void HCamDevice::HtCamWriteADCReg_ALL(bool is_gain,bool is_adc1,uint8_t addr, uint8_t data) +{ + if (virBaseAddr == NULL) + return ; + + if (is_gain) + { + addr++; + addr *= 2; //增益 + } + else + addr += 0x0e; //偏移 + + printf("%s 地址 :%d 值%d \r\n",is_gain?"增益":"偏移",addr,data); + + uint32_t *pCamCtrlReg = virBaseAddr; + uint32_t AdcRegFrame = 0x0000; + + uint32_t EnableAdc1Write = 0x2000; //adc1使能 + uint32_t EnableAdc2Write = 0x4000; //adc2使能 + adcTiming *pAdcRegFrame = (adcTiming *)&AdcRegFrame; + + // if (addr > 20) + // return; + pADCReg[addr] = data; + pAdcRegFrame->rwbit = 0; + pAdcRegFrame->regAddr = addr; + pAdcRegFrame->regData = data; + + pAdcRegFrame->rwbit1 = 0; + pAdcRegFrame->regAddr1 = addr; + pAdcRegFrame->regData1 = data; + + if (is_adc1) //adc 1 + { + pCamCtrlReg[7] = (uint32_t)AdcRegFrame; + + pCamCtrlReg[4] &= ~(EnableAdc1Write); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + pCamCtrlReg[4] |= (EnableAdc1Write); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + else // adc2 + { + pCamCtrlReg[0] = (uint32_t)AdcRegFrame; + + pCamCtrlReg[4] &= ~(EnableAdc2Write); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + pCamCtrlReg[4] |= (EnableAdc2Write); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } +} + void HCamDevice::HtCamWriteADCReg(uint8_t addr, uint8_t data) { if (virBaseAddr == NULL) @@ -929,6 +998,41 @@ void HCamDevice::HtCamWriteADCReg(uint8_t addr, uint8_t data) std::this_thread::sleep_for(std::chrono::milliseconds(1)); } + + +// void HCamDevice::HtCamReadADCReg_ALL(booluint8_t addr, uint8_t *data) +// { +// if (virBaseAddr == NULL) +// { +// return ; +// } + +// uint32_t *pCamCtrlReg = virBaseAddr; +// uint32_t AdcRegFrame = 0x0000; +// uint32_t EnableAdcWrite = (1 << 14); +// uint32_t tempData; +// adcTiming *pAdcRegFrame = (adcTiming *)&AdcRegFrame; + +// // if (addr > 0x14) +// // return; +// pAdcRegFrame->rwbit = 1; +// pAdcRegFrame->regAddr = addr; +// pAdcRegFrame->regData = 0; +// pAdcRegFrame->rwbit1 = 1; +// pAdcRegFrame->regAddr1 = addr; +// pAdcRegFrame->regData1 = 0; + +// pCamCtrlReg[7] = (uint32_t)AdcRegFrame; +// pCamCtrlReg[4] &= ~(EnableAdcWrite); +// std::this_thread::sleep_for(std::chrono::milliseconds(5)); +// pCamCtrlReg[4] |= (EnableAdcWrite); +// std::this_thread::sleep_for(std::chrono::milliseconds(10)); + +// tempData = pCamCtrlReg[2]; +// uint8_t value = (tempData >> 4) & (0xFF); +// (*data) = value; +// } + void HCamDevice::HtCamReadADCReg(uint8_t addr, uint8_t *data) { if (virBaseAddr == NULL) @@ -940,26 +1044,27 @@ void HCamDevice::HtCamReadADCReg(uint8_t addr, uint8_t *data) uint32_t AdcRegFrame = 0x0000; uint32_t EnableAdcWrite = (1 << 14); uint32_t tempData; - adcTiming *pAdcRegFrame = (adcTiming *)&AdcRegFrame; + CIS_ADC_NEW pAdcRegFrame ; // if (addr > 0x14) // return; - pAdcRegFrame->rwbit = 1; - pAdcRegFrame->regAddr = addr; - pAdcRegFrame->regData = 0; - pAdcRegFrame->rwbit1 = 1; - pAdcRegFrame->regAddr1 = addr; - pAdcRegFrame->regData1 = 0; + pAdcRegFrame.bit.rwbit = 1; + pAdcRegFrame.bit.regAddr = addr; + pAdcRegFrame.bit.regData = 0; + pAdcRegFrame.bit.rwbit1 = 1; + pAdcRegFrame.bit.regAddr1 = addr; + pAdcRegFrame.bit.regData1 = 0; - pCamCtrlReg[7] = (uint32_t)AdcRegFrame; + pCamCtrlReg[7] = pAdcRegFrame.value; pCamCtrlReg[4] &= ~(EnableAdcWrite); std::this_thread::sleep_for(std::chrono::milliseconds(5)); pCamCtrlReg[4] |= (EnableAdcWrite); std::this_thread::sleep_for(std::chrono::milliseconds(10)); - tempData = pCamCtrlReg[2]; - uint8_t value = (tempData >> 4) & (0xFF); - (*data) = value; + pAdcRegFrame.value = HtCamReadFpgaRegs(0x07); + printf("pAdcRegFrame->value:%0x\r\n",pAdcRegFrame.value); + printf("pAdcRegFrame->regData :%d\r\n",pAdcRegFrame.bit.regData); + } uint8_t HCamDevice::getADCReg(int addr) @@ -1004,12 +1109,12 @@ uint32_t HCamDevice::HtCamReadFpgaRegs(uint8_t reg_addr) return pCamCtrlReg[reg_addr] ; } -void HCamDevice::HtCamSetSpTime(uint32_t reg_value) +void HCamDevice::HtCamSetSpTime(uint32_t reg_value,uint32_t val) { CamZ_Reg_2Short sp_time; sp_time.value = HtCamReadFpgaRegs(0x03); sp_time.NShort[1] = reg_value; - sp_time.NShort[0] = reg_value-100; + sp_time.NShort[0] = val; HtCamWriteFpgaRegs(0x03 , sp_time.value); } void HCamDevice::HtCamGetSpTime(uint32_t ®_value) @@ -1025,7 +1130,7 @@ void HCamDevice::HtCamSetStSp(int start_smaple) //sp_time.NShort[1] = 0x00C8;//彩色 CamZ_Reg_2Short st_sp; st_sp.value = HtCamReadFpgaRegs(0x0d); - st_sp.NShort[0] = 0x0200; + //st_sp.NShort[0] = 0x0200; // if (color) // st_sp.NShort[1] = 0x00C8; //彩色 // else @@ -1033,7 +1138,7 @@ void HCamDevice::HtCamSetStSp(int start_smaple) st_sp.NShort[1] = start_smaple; //灰色 2023-8-3 - //HtCamWriteFpgaRegs(0x0d , st_sp.value); + HtCamWriteFpgaRegs(0x0d , st_sp.value); } void HCamDevice::HtCamGetStSp(uint32_t &start_smaple) @@ -1224,6 +1329,8 @@ void HCamDevice::HtCamWriteAllADC() for (int index = 0; index < adcRegSize; index++) { HtCamWriteADCReg(index, pADCReg[index]); + //HtCamWriteADCRegA(index, pADCReg[index]); + //HtCamWriteADCRegB(index, pADCReg[index]); } } @@ -1265,14 +1372,19 @@ void HCamDevice::HtCamInitADCReg() /* gain */ pADCReg[2] = 0x90; pADCReg[3] = 0x00; + pADCReg[4] = 0x90; pADCReg[5] = 0x00; + pADCReg[6] = 0x90; pADCReg[7] = 0x00; + pADCReg[8] = 0x90; pADCReg[9] = 0x00; + pADCReg[0xa] = 0x90; pADCReg[0xb] = 0x00; + pADCReg[0xc] = 0x90; pADCReg[0xd] = 0x00; /* offset */ diff --git a/HCamDevice.h b/HCamDevice.h index 74f360b..12c5ee3 100644 --- a/HCamDevice.h +++ b/HCamDevice.h @@ -56,21 +56,39 @@ public: void HtCamSetFrameCnt(uint32_t val);//设置需要采集的帧数 uint32_t HtCamReadFpgaRegs(uint8_t reg_addr); //读取寄存器值 - void HtCamSetSpTime(uint32_t reg_value);//0x03 //内触发间隔 //影响到图像得拉伸 + void HtCamSetSpTime(uint32_t reg_value,uint32_t val);//0x03 //内触发间隔 //影响到图像得拉伸 void HtCamGetSpTime(uint32_t ®_value); //获取当前sptime void HtCamSetStSp(int start_sample);//0x0d //更具不同的颜色模式设置不同的st_sp //影响到图像的偏移 void HtCamGetStSp(uint32_t &start_sample); void HtCamSetVsnpTime(int color); - void HtCamChangeExposureValueF(unsigned int value); //曝光值设置 - void HtCamChangeExposureValueB(unsigned int value); //曝光值设置 + void HtCamChangeExposureValueF(uint32_t* value); //曝光值设置 + void HtCamChangeExposureValueB(uint32_t* value); //曝光值设置 + //void HtCamWriteADCReg(uint8_t addr,uint8_t data); //写adc寄存器 + //void HtCamReadADCReg(uint8_t addr, uint8_t *data); //读adc寄存器 + + + ////////////////ADC 寄存器0x00 - 0x14/////////////////// + /////////////// 0x00 - 0xdh暂时只需要写高位,低位不用写 + // 1、adc参数配置寄存器分为两个 0x00 和 0x07 + // 2、每个adc参数配置又分32位宽 ,前八个位宽为adc值 + + // is_gain == true 设置增益 + // is_gain == false 设置偏移 + // is_adc1 == true 设置adc1 + // is_adc1 == false 设置adc2 + // addr adc 寄存器地址 + // adc 寄存器数据 + void HtCamWriteADCReg_ALL(bool is_gain,bool is_adc1,uint8_t addr, uint8_t data); + + void stopFPGAScan();//暂时无用 2023 -8 -2 + void startFPGAScan();//暂时无用 2023 -8 -2 private: int init_fpga(); //初始化 寄存器基地址 int uninit_fpga(); - void stopFPGAScan();//暂时无用 2023 -8 -2 - void startFPGAScan();//暂时无用 2023 -8 -2 + int HtCamWaitVideoCapture(int msTimeout); //等待图像信号 void HtCamWriteFpgaRegs(uint8_t reg_addr, uint32_t reg_value); //写寄存器 diff --git a/MultiFrameCapture.cpp b/MultiFrameCapture.cpp index 74b924d..7665755 100644 --- a/MultiFrameCapture.cpp +++ b/MultiFrameCapture.cpp @@ -21,9 +21,8 @@ const int vsp_A = 45; const int vsp_B = 45; // using namespace cv; -MultiFrameCapture::MultiFrameCapture(ScannerGlue glue, - std::shared_ptr fpga, - CISVendor vendor) : reset_pin(new GpioOut(Fpga_Reset)), +MultiFrameCapture::MultiFrameCapture(ScannerGlue glue,std::shared_ptr fpga, CISVendor vendor) + :reset_pin(new GpioOut(Fpga_Reset)), fpgaLoad(new Gpio(Fpga_Load)), fpga_conf_initn(new Gpio(Fpga_InitN)), snaped_index(0), @@ -122,9 +121,6 @@ void MultiFrameCapture::stopsnap(bool autosize) video->HtCamStopSampling(); b_stop_snap = true; } - - //b_stop_snap =false; - //video->HtCamStopVideoCapturing(); } void MultiFrameCapture::close() @@ -136,7 +132,7 @@ void MultiFrameCapture::close() int MultiFrameCapture::read(int addr) { - return m_capFpageregs->read(addr); + } void *MultiFrameCapture::readFrameTest(int timeout) @@ -185,13 +181,13 @@ void MultiFrameCapture::UpdateScanParam(HG_ScanConfiguration config) video->HtCamSetDpi(resolution_); printf(" -----------------------snap dpi = %d resolution = %d------------------\r\n",config.params.dpi, config.params.isColor); FPGAConfigParam fpgaparam = GetFpgaparam(config.params.dpi, config.params.isColor); - video->HtCamSetSpTime(fpgaparam.Sp); // 2344 灰色 //2023-8-10 最新2650 + video->HtCamSetSpTime(fpgaparam.Sp,fpgaparam.MaxExp); // 2344 灰色 //2023-8-10 最新2650 // fpgaparam.Sp=0; // video->HtCamGetSpTime(fpgaparam.Sp); - printf(" -----------------------HtCamSetSpTime%d------------------ \r\n",fpgaparam.Sp); + printf(" -----------------------fpgaparam.Sp[1]%d fpgaparam.MaxExp[0]:%d------------------ \r\n",fpgaparam.Sp,fpgaparam.MaxExp); video->HtCamSetStSp(fpgaparam.MaxBright); printf(" -----------------------HtCamSetStSp%d------------------\r\n",fpgaparam.MaxBright); - + configFPGAParam(0, 1); { int val = config.params.dpi == 3 ? 600 :(config.params.dpi == 2?300:200); @@ -259,44 +255,6 @@ void MultiFrameCapture::fpgaReload() bool MultiFrameCapture::capturerImage() { - // if (m_config.params.pageSize == (int)PaperSize::G400_AUTO || - // m_config.params.pageSize == (int)PaperSize::G400_MAXAUTO || - // m_config.params.pageSize == (int)PaperSize::G400_MAXSIZE) - // { - // } - // else - // { - // int color = this->color(); - // int channels = color ? 3 : 1; - // int width = this->width() * channels * 6; - // int dpi = m_config.params.dpi; - // for (int i = 0; i < frame_count; i++) - // { - // V4L2_DATAINFO_Ex frame_info; - // StopWatch sw_read; - // auto data = video->read_frame(150); - // printf("!!!!!!!!!!! read frame[%d] = %.2f \n", i, sw_read.elapsed_ms()); - // frame_info.lost_frame = data ? false : true; - // frame_info.last_frame = (i == (frame_count - 1)); - // frame_info.frame_index = i; - // if (data) - // { - // printf("+++++++ success: read frame[%d] \n", i); - // cv::Mat mat(FRAME_HEIGHT, width, CV_8UC1, data); - // StopWatch sw_clone; - // frame_info.mat = mat.clone(); - // printf("!!!!!!!!!! Clone time = %0.3f \n",sw_clone.elapsed_ms()); - // frame_info.pixtype = color; - // frame_info.dpi = dpi; - // frame_info.width = frame_info.height = 0; // 从mat信息中获取宽高信息 - // } - // else - // { - // printf("------- error: lost frame[%d] \n", i); - // } - // m_frameinfos.Put(frame_info); - // } - // } return true; } @@ -376,108 +334,23 @@ void MultiFrameCapture::reload_fpga() printf("reload done \n"); } -void MultiFrameCapture::set_gain(int ix, int val) -{ - for (int i = 0; i < 6; i++) - { - if (ix) - m_capFpageregs->setAGain(i, val); - else - m_capFpageregs->setBGain(i, val); - } -} - -void MultiFrameCapture::set_offset(int ix, int val) -{ - for (int i = 0; i < 6; i++) - { - if (ix) - m_capFpageregs->setAOffset(i, val); - else - m_capFpageregs->setBOffset(i, val); - - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } -} - -void MultiFrameCapture::set_expo(int ix, int val) -{ - switch (ix) - { - case 0: - m_capFpageregs->setAExposureR(val); - break; - case 1: - m_capFpageregs->setAExposureG(val); - break; - case 2: - m_capFpageregs->setAExposureB(val); - break; - case 3: - m_capFpageregs->setBExposureR(val); - break; - case 4: - m_capFpageregs->setBExposureG(val); - break; - case 5: - m_capFpageregs->setBExposureB(val); - break; - default: - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); -} void MultiFrameCapture::configFPGAParam(int mode, int dpi) { FPGAConfigParam fpgaparam = GetFpgaparam(dpi, mode); - // m_capFpageregs->resetADC(); - // std::this_thread::sleep_for(std::chrono::milliseconds(50)); - int value_a, value_b; + + video->HtCamChangeExposureValueF(fpgaparam.ExposureF); + video->HtCamChangeExposureValueB(fpgaparam.ExposureB); + for (int i = 0; i < 6; i++) { - if (i < 3) - { - set_expo(i, fpgaparam.ExposureF[i]); - LOG("fpgaparam.ExposureF[%d] = %d \n", i, fpgaparam.ExposureF[i]); - } - else - { - set_expo(i, fpgaparam.ExposureB[i % 3]); - LOG("fpgaparam.ExposureB[%d] = %d\n", i % 3, fpgaparam.ExposureB[i % 3]); - } - int A_value, B_value; - std::this_thread::sleep_for(std::chrono::milliseconds(3)); - m_capFpageregs->setAOffset(i, fpgaparam.OffsetF[i]); - LOG("fpgaparam.setAOffset[%d] = %d \n", i, fpgaparam.OffsetF[i]); + video->HtCamWriteADCReg_ALL(true,true,i,fpgaparam.GainF[i]); + video->HtCamWriteADCReg_ALL(false,true,i,fpgaparam.OffsetF[i]); - std::this_thread::sleep_for(std::chrono::milliseconds(3)); - m_capFpageregs->getAOffset(i, A_value, B_value); - LOG("fpgaparam.getAOffset[%d] = A_value = %d B_value = %d \n", i, A_value, B_value); - - std::this_thread::sleep_for(std::chrono::milliseconds(3)); - m_capFpageregs->setBOffset(i, fpgaparam.OffsetB[i]); - LOG("fpgaparam.setBOffset[%d] = %d \n", i, fpgaparam.OffsetB[i]); - - std::this_thread::sleep_for(std::chrono::milliseconds(3)); - m_capFpageregs->getBOffset(i, A_value, B_value); - LOG("fpgaparam.getBOffset[%d] = A_value = %d B_value = %d \n", i, A_value, B_value); - - std::this_thread::sleep_for(std::chrono::milliseconds(3)); - m_capFpageregs->setAGain(i, fpgaparam.GainF[i]); - LOG("fpgaparam.GainF[%d] = %d\n", i, fpgaparam.GainF[i]); - std::this_thread::sleep_for(std::chrono::milliseconds(3)); - m_capFpageregs->setBGain(i, fpgaparam.GainB[i]); - LOG("fpgaparam.GainB[%d] = %d\n", i, fpgaparam.GainB[i]); - std::this_thread::sleep_for(std::chrono::milliseconds(3)); - - // m_capFpageregs->getAGain(i,A_value,B_value); - // LOG("fpgaparam.getAGain[%d] = A_value = %d B_value = %d \n", i, A_value,B_value); - // std::this_thread::sleep_for(std::chrono::milliseconds(3)); - // m_capFpageregs->getBGain(i,A_value,B_value); - // LOG("fpgaparam.getBGain[%d] = A_value = %d B_value = %d \n", i, A_value,B_value); - // std::this_thread::sleep_for(std::chrono::milliseconds(3)); + video->HtCamWriteADCReg_ALL(true,false,i,fpgaparam.GainB[i]); + video->HtCamWriteADCReg_ALL(false,false,i,fpgaparam.OffsetB[i]); } + }; int MultiFrameCapture::width() { @@ -496,10 +369,6 @@ int MultiFrameCapture::color() // return m_capFpageregs->getColorMode(); } -// int MultiFrameCapture::imageProcessCurrentFrame() -// { - -// } #include "bmp.h" static int cnt = 0; @@ -516,7 +385,7 @@ void MultiFrameCapture::snaprun() return ret; } - uint32_t sendLine = video->HtCamReadFpgaRegs(0x000e); + uint32_t sendLine = video->HtCamReadFpgaRegs(0x000e);////0x000e 取出来的实际行数 printf("--------------fpga send line ------------:%d\r\n",sendLine); if (data) { @@ -525,7 +394,7 @@ void MultiFrameCapture::snaprun() else frame_info.first_frame = false; - frame_info.last_frame = num == ret+1 ? true:false; + frame_info.last_frame = num == ret + 1 ? true:false; printf("获取数据 width:%d height:%d is_first:%d is_last:%d\r\n",frame_info.width,frame_info.height,frame_info.first_frame,frame_info.last_frame); cv::Mat mat = cv::Mat(frame_info.height, frame_info.width, CV_8UC1, data, cv::Mat::AUTO_STEP); @@ -537,7 +406,6 @@ void MultiFrameCapture::snaprun() // } frame_info.mat = mat.clone(); m_frameinfos.Put(frame_info); - } return ret; }; @@ -548,29 +416,27 @@ void MultiFrameCapture::snaprun() m_cv_snap.wait(lock); V4L2_DATAINFO_Ex frame_info; - int channels = 1; - + frame_info.pixtype = color_mode_; frame_info.dpi = resolution_; frame_info.width = pixels_width_; frame_info.height = pixels_height_; - frame_info.error_code = 0; - frame_info.snaped_index = snaped_index; frame_info.first_frame = false; frame_info.last_frame = false; + int channels = color_mode_ == 1 ? 3 : 1; int color_mode = video->HtCamGetColorMode(); - int count = 1; + int func_sig = 0; + int time_out = color_mode == 1 ? 1000 : 800; + int time_out_cnt = 0; + uint32_t frame_num = 0; uint32_t frame_cnt = 0; video->HtCamGetFrameCnt(frame_cnt); frame_info.frame_index = frame_cnt; - int func_sig = 0; - int time_out = color_mode_ == 1 ? 800 : 800; - int time_out_cnt = 0; printf("--------------------- frame_info.width ------------------ :%d\r\n",frame_info.width ); printf("--------------------- frame_info.height ------------------ :%d\r\n",frame_info.height ); @@ -581,9 +447,7 @@ void MultiFrameCapture::snaprun() for (size_t i = 1; i <= frame_cnt; i++) { printf("***********设置的帧数:%d 正在采集第[%d]帧************\r\n",frame_cnt,i); - frame_info.last_frame = frame_cnt == i ? true : false; - //frame_info.frame_index = i; func_sig = snap_func(frame_info, channels,frame_cnt,time_out); if (func_sig == -1 ) //当前帧取图超时,在取一次!!! 一直超时 不就卡死了??? 这个地方还是需要加个时间限制几秒内一帧未取出就退了,返回异常状态吧? @@ -621,9 +485,7 @@ void MultiFrameCapture::snaprun() } } - video->HtCamStopVideoCapturing(); - //iImageremain++; printf("----------停止采集图像 ----------\r\n"); m_cv_snapdone.notify_all(); @@ -661,18 +523,14 @@ void MultiFrameCapture::procimage() info.last_frame = frame.last_frame; info.index_frame = frame.frame_index; info.data_type = 0; - //info.DataLength = frame.width *frame.height; info.width = frame.width; info.height = frame.height; - // cv::Mat mat = frame.mat.clone(); - printf("获取数据2222 width:%d height:%d is_first:%d is_last:%d DataLength:%d\r\n",frame.width,frame.height,info.first_frame,info.last_frame,info.DataLength); + + printf("获取数据 width:%d height:%d is_first:%d is_last:%d DataLength:%d\r\n",frame.width,frame.height,info.first_frame,info.last_frame,info.DataLength); - cv::imwrite("/home/root/opencv"+to_string(cnt_++)+".bmp",frame.mat); + //cv::imwrite("/home/root/opencv"+to_string(cnt_++)+".bmp",frame.mat); m_glue.m_imageready(info); - - - //iImageremain--; } continue; } @@ -680,268 +538,295 @@ void MultiFrameCapture::procimage() bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) { - // int config_dpi = dpi == 1 ? 2 : dpi; - // const int offset_indexs[] = {0, 1, 2, 5, 4, 3, 3, 4, 5, 2, 1, 0}; - // int channels = mode == IMAGE_COLOR ? 3 : 1; - // int height = 60; - // int width = config_dpi == 0x02 ? 864 : (config_dpi == 0x03 ? 1728 : 864); - // int orgimgwidth = width * 2 * 3 * channels; - // int dstwidth = width * 2 * 3; - // bool isNeedSave = true; - // string log; - // void *data = video->read_frame(1000); - // if (data == NULL) - // { - // isNeedSave = false; - // log = "WARNNING WARNNING WARNNING FAILDED TO READ IMAGE DATA !!!!!!!!!!!!!!!!!!!\r\n"; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); - // return isNeedSave; - // } + int config_dpi = dpi == 1 ? 2 : dpi; + const int offset_indexs[] = {3, 4, 5, 2, 1, 0,0, 1, 2, 5, 4, 3}; + int channels = mode == IMAGE_COLOR ? 3 : 1; + int height = 60; + int width = config_dpi == 0x02 ? 864 : (config_dpi == 0x03 ? 1728 : 864); + int orgimgwidth = width * 2 * 3 * channels; - // cv::Mat src(height, orgimgwidth, CV_8UC1, data); - // CImageMerge t_marge; - // cv::Mat mrgmat = t_marge.MergeImage(src, dstwidth, height, mode); - // printf("mrgmat width = %d height = %d \n", mrgmat.cols, mrgmat.rows); - // static int inx = 0; - // //imwrite(to_string(++inx)+".jpg",mrgmat); - // // return 0; - // FPGAConfigParam param = GetFpgaparam(dpi, mode); - // if (black) // 暗场 - // { - // volatile double offValues[12]{0}; - // int blockcount = 12; - // int bandwidth = mrgmat.cols / blockcount; - // for (int n = 0; n < blockcount; n++) - // { - // cv::Mat img = mrgmat(cv::Rect(bandwidth * n, 10, bandwidth, mrgmat.rows - 10)).clone(); - // cv::Scalar mean = cv::mean(img); - // // printf("band[%d] mean = %0.2f bandwidth = %d \n", n, mean.val[0],bandwidth); - // offValues[n] = mean.val[0]; - // } + int dstwidth = width * 2 * 3; + + bool isNeedSave = true; + string log; - // for (int s = 0; s < 2; s++) - // { - // unsigned int offsets[6]; // = (int *)(s == 0 ? ¶m.OffsetF[0] : ¶m.OffsetB[0]); - // memcpy(offsets, (s == 0 ? ¶m.OffsetF[0] : ¶m.OffsetB[0]), sizeof(param.OffsetF)); - // for (int j = 0; j < 6; j++) - // { - // int k = s * 6 + j; - // // double diff = BLACK_DIFF(offValues[k]); - // double diff = 8 - offValues[k]; - // double step = radio * diff; - // // int preStep = offsetStep[k]; - // // if (step * preStep < 0) - // // { - // // //step = 0 - preStep / 2; - // // step /= 2; - // // } - // // else - // // { - // // radio = 1; - // // } + unsigned char *data = NULL; + int ret = video->HtCamReadCaptureFrame((void **)&data, 1000); - // if (step < 1 && step > 0.5) - // step = 1; - // if (step < -0.5 && step > -1) - // step = -1; - // // FMT_STEP(step); - // bool isMinStep = abs(step) == 1 && step == offsetStep[k]; - // bool isOutBounds = offsets[j] >= 255 && step > 0; - // isOutBounds |= offsets[j] <= 0 && step < 0; - // log += " 暗场校正 :" + std::to_string(k) + ";diff:" + std::to_string(diff) + ";light:" + std::to_string(offValues[k]) + ";offset:" + std::to_string(offsets[j]) + ";step:" + std::to_string(step) + "\r\n"; - // if (isOutBounds) - // log += " 第" + std::to_string(k) + "条带暗场校正异常,暗场值无法降低 \r\n"; - // else if (abs(step) > 1 || isMinStep) - // { - // offsetStep[k] = (int)(step); - // printf(" k = %d offsets[%d] = %d step = %f mean = %f\n", k, offset_indexs[k], offsets[offset_indexs[k]], step, offValues[k]); - // offsets[offset_indexs[k]] += step; - // log += "offsetStep" + std::to_string(k) + " = " + std::to_string(offsetStep[k]) + ", offset_indexs" + std::to_string(k) + " =" + std::to_string(offset_indexs[k]) + "\r\n"; + if (data == NULL) + { + isNeedSave = false; + log = "WARNNING WARNNING WARNNING FAILDED TO READ IMAGE DATA !!!!!!!!!!!!!!!!!!!\r\n"; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); + return isNeedSave; + } - // if (offsets[offset_indexs[k]] < 1) - // offsets[offset_indexs[k]] = 1; - // if (offsets[offset_indexs[k]] > 255) - // offsets[offset_indexs[k]] = 255; - // isNeedSave = false; - // } - // log += (s == 0 ? "彩色正面" : "彩色背面"); - // log += "偏移值:" + std::to_string(offsets[0]) + "," + std::to_string(offsets[1]) + "," + std::to_string(offsets[2]) + "," + std::to_string(offsets[3]) + "," + std::to_string(offsets[4]) + "," + std::to_string(offsets[5]) + "\r\n"; - // // log += (s == 0 ? "彩色正面暗场校正完成 \r\n" : "彩色背面暗场校正完成 \r\n"); - // // ftt.append_log(log); - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); - // log = ""; - // } - // memcpy((s == 0 ? ¶m.OffsetF[0] : ¶m.OffsetB[0]), offsets, sizeof(param.OffsetF)); - // // memset(¶m.OffsetF[0],0,sizeof(param.OffsetF)); - // // memset(¶m.OffsetB[0],0,sizeof(param.OffsetF)); - // // param.OffsetB[5] =255; - // // param.OffsetF[4] =255; - // } + cv::Mat src(height, orgimgwidth, CV_8UC1, data); + CImageMerge t_marge; + cv::Mat mrgmat = src;//t_marge.MergeImage(src, dstwidth, height, mode); - // if (isNeedSave) - // { - // printf("Save LUT image path :%s \n", param.Flat_BwPath.c_str()); - // log = "暗场校正完成 \r\n"; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); - // log = ""; - // imwrite(param.Flat_BwPath, mrgmat); - // } - // } - // else // 明场 - // { - // if (mode == IMAGE_COLOR) - // { - // volatile double values[2][3]; - // cv::Scalar a = mean(mrgmat(Rect(0, 0, mrgmat.cols / 2, mrgmat.rows))); - // cv::Scalar b = mean(mrgmat(Rect(mrgmat.cols / 2, 0, mrgmat.cols / 2, mrgmat.rows))); - // for (char j = 0; j < 3; j++) - // { - // values[0][j] = a.val[j]; - // values[1][j] = b.val[j]; - // printf("values[0][%d] = %.2f values[1][%d] = %.2f\n", j,values[0][j], j,values[1][j]); - // } + printf("mrgmat width = %d height = %d \n", mrgmat.cols, mrgmat.rows); + static int inx = 0; + imwrite(to_string(++inx)+".bmp",mrgmat); + return 1; - // log = "开始彩色明场校正 \r\n"; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); - // for (int s = 0; s < 2; s++) - // { - // volatile int exposures[3]; // = (int *)(s == 0 ? param.ExposureF : param.ExposureB); - // memcpy((void *)exposures, (s == 0 ? ¶m.ExposureF[0] : ¶m.ExposureB[0]), sizeof(param.ExposureB)); - // for (int x = 0; x < 3; x++) - // { - // int k = (3 * s + x); - // //int diff = LIGHT_DIFF(*((double *)values + k)); - // int diff = param.MaxBright - *((double *)values + k); - // log += " 明场:" + std::to_string(k) + ";diff:" + std::to_string(diff) + "\r\n"; + FPGAConfigParam param = GetFpgaparam(dpi, mode); + if (black) // 暗场 + { + volatile double offValues[12]{0}; + double offValues_min[12]{0}; + int blockcount = 12; + int bandwidth = mrgmat.cols / blockcount; + for (int n = 0; n < blockcount; n++) + { + cv::Mat img = mrgmat(cv::Rect(bandwidth * n, 10, bandwidth, mrgmat.rows - 10)).clone(); + cv::Scalar mean = cv::mean(img); + offValues[n] = mean.val[0]; + if(mode) + { + auto tmp = *std::min_element(img.begin(), + img.end(),[](cv::Vec3b a,cv::Vec3b b)->bool{return (a[0]+a[1]+a[2]) < (b[0]+b[1]+b[2]) ;}); + offValues_min[n] = (tmp[0]+tmp[1]+tmp[2])/3.0; + } + else + { + offValues_min[n] = *std::min_element(img.begin(), + img.end(),[](std::uint8_t a,std::uint8_t b)->bool{return a < b;}); + } + printf("band[%d] mean = %0.2f bandwidth = %d offValues_min [%d] = %.2f \n", n, mean.val[0],bandwidth,n,offValues_min[n] ); + } + //return 0; - // double step = diff * radio; - // int preStep = *((int *)expStep + k); - // if (step * preStep < 0) - // { - // step = 0 - preStep / 2; - // } - // if (step < 1 && step > 0) - // step = 1; - // if (step < 0 && step > -1) - // step = -1; + for (int s = 0; s < 2; s++) + { + unsigned int offsets[6]; // = (int *)(s == 0 ? ¶m.OffsetF[0] : ¶m.OffsetB[0]); + memcpy(offsets, (s == 0 ? ¶m.OffsetF[0] : ¶m.OffsetB[0]), sizeof(param.OffsetF)); + for (int j = 0; j < 6; j++) + { + int k = s * 6 + j; + // double diff = BLACK_DIFF(offValues[k]); + //double diff = 8 - offValues[k]; + double diff = 3-offValues_min[k]; + if(offValues[k] > 25) + { + diff = 25 -offValues[k]; + } + double step = radio * diff; + // int preStep = offsetStep[k]; + // if (step * preStep < 0) + // { + // //step = 0 - preStep / 2; + // step /= 2; + // } + // else + // { + // radio = 1; + // } - // bool isMinStep = abs(step) <= 2 && step == *((int *)expStep + k); - // bool isOutBounds = exposures[x] >= (param.Sp - 5) && step > 0; - // isOutBounds |= exposures[x] <= 0 && step < 0; - // if (isOutBounds) - // log += " 第" + to_string(x) + "个明场校正异常 \r\n"; - // else if (abs(diff) >= 1 || isMinStep) - // { - // *((int *)expStep + k) = (int)(step); - // exposures[x] += step; - // if (exposures[x] > (param.Sp - 5)) - // { - // exposures[x] = (param.Sp - 5); - // } - // if (exposures[x] < 0) - // exposures[x] = 0; - // isNeedSave = false; - // } - // log += " 曝光值:" + to_string(exposures[x]) + "\r\n"; - // log += " 调整步长:" + to_string(*((int *)expStep + k)) + "\r\n"; - // } - // memcpy((s == 0 ? ¶m.ExposureF[0] : ¶m.ExposureB[0]), (void *)exposures, sizeof(param.ExposureB)); - // } - // // ftt.append_log(log); - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); + if (step < 1 && step > 0.5) + step = 1; + if (step < -0.5 && step > -1) + step = -1; + // FMT_STEP(step); + bool isMinStep = abs(step) == 1 && step == offsetStep[k]; + bool isOutBounds = offsets[j] >= 255 && step > 0; - // if (isNeedSave) - // { - // log = "彩色明场校正完成\r\n"; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); - // log = ""; - // imwrite(param.Flat_WhitePath, mrgmat); - // } - // } - // else - // { - // double values[2]; - // values[0] = cv::mean(mrgmat(cv::Rect(0, 0, mrgmat.cols / 2, mrgmat.rows))).val[0]; - // values[1] = cv::mean(mrgmat(cv::Rect(mrgmat.cols / 2, 0, mrgmat.cols / 2, mrgmat.rows))).val[0]; - // printf("values[0] = %.2f values[1] = %.2f\n", values[0], values[1]); - // log = "-----开始灰色明场校正-----\r\n"; - // log += " 灰色扫描灰度明场均值:" + to_string(values[0]) + "," + to_string(values[1]) + "\r\n"; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); - // for (int s = 0; s < 2; s++) - // { - // int *exposures = (int *)(s == 0 ? param.ExposureF : param.ExposureB); - // //int diff = LIGHT_DIFF(values[s]); - // int diff = param.MaxBright - values[s]; - // double step = diff * radio; - // log += " 明场:" + to_string(s) + ";diff:" + to_string(diff) + "\r\n"; - // int preStep = expStep[s][0]; - // if (step * preStep < 0) - // { - // step = 0 - preStep / 2; - // } - // else - // { - // radio = 1; - // } - // if (step < 1 && step > 0) - // step = 1; - // if (step < 0 && step > -1) - // step = -1; + printf("\r\n"); + isOutBounds |= offsets[j] <= 0 && step < 0; + log += " 暗场校正 :" + std::to_string(k) + ";diff:" + std::to_string(diff) + ";light:" + std::to_string(offValues[k]) + ";offset:" + std::to_string(offsets[j]) + ";step:" + std::to_string(step) + "\r\n"; + + if (isOutBounds) + log += " 第" + std::to_string(k) + "条带暗场校正异常,暗场值无法降低 \r\n"; + else if (abs(step) > 1 || isMinStep) + { + offsetStep[k] = (int)(step); + printf(" k = %d offsets[%d] = %d step = %f mean = %f\n", k, offset_indexs[k], offsets[offset_indexs[k]], step, offValues[k]); + offsets[offset_indexs[k]] += step; + log += "offsetStep" + std::to_string(k) + " = " + std::to_string(offsetStep[k]) + ", offset_indexs" + std::to_string(k) + " =" + std::to_string(offset_indexs[k]) + "\r\n"; - // int exp = *(exposures + 1); - // std::string ss1(string_format("exp[%d] = %d step = %.3f \r\n", s, exp, step)); - // log += ss1; - // bool isMinStep = abs(step) <= 2 && step == expStep[s][0]; - // bool isOutBounds = exp >= (param.Sp - 5) && step > 0; - // isOutBounds |= exp <= 0 && step < 0; - // if (isOutBounds) - // log += " 第" + to_string(s) + "个明场校正异常 \r\n"; - // else if (abs(diff) > 1 || isMinStep) - // { - // exp += step; - // if (exp < 0) - // exp = 0; - // if (exp > (param.Sp - 5)) - // exp = (param.Sp - 5); + if (offsets[offset_indexs[k]] < 1) + offsets[offset_indexs[k]] = 1; + if (offsets[offset_indexs[k]] > 255) + offsets[offset_indexs[k]] = 255; + isNeedSave = false; + } + log += (s == 0 ? "彩色正面" : "彩色背面"); + log += "偏移值:" + std::to_string(offsets[0]) + "," + std::to_string(offsets[1]) + "," + std::to_string(offsets[2]) + "," + std::to_string(offsets[3]) + "," + std::to_string(offsets[4]) + "," + std::to_string(offsets[5]) + "\r\n"; + // log += (s == 0 ? "彩色正面暗场校正完成 \r\n" : "彩色背面暗场校正完成 \r\n"); + // ftt.append_log(log); + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); + log = ""; + } + memcpy((s == 0 ? ¶m.OffsetF[0] : ¶m.OffsetB[0]), offsets, sizeof(param.OffsetF)); + // memset(¶m.OffsetF[0],0,sizeof(param.OffsetF)); + // memset(¶m.OffsetB[0],0,sizeof(param.OffsetF)); + // param.OffsetB[5] =255; + // param.OffsetF[4] =255; + } - // float coffe[3] = {1, 1, 1}; // 0.2, 1,0.51 - // for (int k = 0; k < 3; k++) - // { - // *(exposures + k) = (int)(exp * coffe[k]); - // expStep[s][k] = (int)(step); - // std::string exps(string_format("expStep[%d][%d] = %.3f\r\n", s, k, step)); - // log += exps; - // std::string ss(string_format("exposures[%d] = %0.3f \r\n", k, exposures[k])); - // log += ss; - // } - // isNeedSave = false; - // } - // } - // // ftt.append_log(log); - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); - // if (isNeedSave) - // { - // printf("Save LUT image path :%s \n", param.Flat_WhitePath.c_str()); - // log = "灰度明场校正完成\r\n"; - // if (m_glue.m_deviceevent) - // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); - // log = ""; - // imwrite(param.Flat_WhitePath, mrgmat); - // } - // } - // } - // SaveFpgaparam(param); - // printf("exit Save_lut \n"); - // return isNeedSave; - return 0; + if (isNeedSave) + { + printf("Save LUT image path :%s \n", param.Flat_BwPath.c_str()); + log = "暗场校正完成 \r\n"; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); + log = ""; + imwrite(param.Flat_BwPath, mrgmat); + } + } + else // 明场 + { + if (mode == IMAGE_COLOR) + { + volatile double values[2][3]; + cv::Scalar a = cv::mean(mrgmat(cv::Rect(0, 0, mrgmat.cols / 2, mrgmat.rows))); + cv::Scalar b = cv::mean(mrgmat(cv::Rect(mrgmat.cols / 2, 0, mrgmat.cols / 2, mrgmat.rows))); + for (char j = 0; j < 3; j++) + { + values[0][j] = a.val[j]; + values[1][j] = b.val[j]; + printf("values[0][%d] = %.2f values[1][%d] = %.2f\n", j,values[0][j], j,values[1][j]); + } + + log = "开始彩色明场校正 \r\n"; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); + for (int s = 0; s < 2; s++) + { + volatile int exposures[3]; // = (int *)(s == 0 ? param.ExposureF : param.ExposureB); + memcpy((void *)exposures, (s == 0 ? ¶m.ExposureF[0] : ¶m.ExposureB[0]), sizeof(param.ExposureB)); + for (int x = 0; x < 3; x++) + { + int k = (3 * s + x); + //int diff = LIGHT_DIFF(*((double *)values + k)); + int diff = param.MaxBright - *((double *)values + k); + log += " 明场:" + std::to_string(k) + ";diff:" + std::to_string(diff) + "\r\n"; + + double step = diff * radio; + int preStep = *((int *)expStep + k); + if (step * preStep < 0) + { + step = 0 - preStep / 2; + } + if (step < 1 && step > 0) + step = 1; + if (step < 0 && step > -1) + step = -1; + + bool isMinStep = abs(step) <= 2 && step == *((int *)expStep + k); + bool isOutBounds = exposures[x] >= (param.Sp - 5) && step > 0; + isOutBounds |= exposures[x] <= 0 && step < 0; + if (isOutBounds) + log += " 第" + to_string(x) + "个明场校正异常 \r\n"; + else if (abs(diff) >= 1 || isMinStep) + { + *((int *)expStep + k) = (int)(step); + exposures[x] += step; + if (exposures[x] > (param.Sp - 5)) + { + exposures[x] = (param.Sp - 5); + } + if (exposures[x] < 0) + exposures[x] = 0; + isNeedSave = false; + } + log += " 曝光值:" + to_string(exposures[x]) + "\r\n"; + log += " 调整步长:" + to_string(*((int *)expStep + k)) + "\r\n"; + } + memcpy((s == 0 ? ¶m.ExposureF[0] : ¶m.ExposureB[0]), (void *)exposures, sizeof(param.ExposureB)); + } + // ftt.append_log(log); + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); + + if (isNeedSave) + { + log = "彩色明场校正完成\r\n"; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); + log = ""; + imwrite(param.Flat_WhitePath, mrgmat); + } + } + else + { + double values[2]; + values[0] = cv::mean(mrgmat(cv::Rect(0, 0, mrgmat.cols / 2, mrgmat.rows))).val[0]; + values[1] = cv::mean(mrgmat(cv::Rect(mrgmat.cols / 2, 0, mrgmat.cols / 2, mrgmat.rows))).val[0]; + printf("values[0] = %.2f values[1] = %.2f\n", values[0], values[1]); + log = "-----开始灰色明场校正-----\r\n"; + log += " 灰色扫描灰度明场均值:" + to_string(values[0]) + "," + to_string(values[1]) + "\r\n"; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); + for (int s = 0; s < 2; s++) + { + int *exposures = (int *)(s == 0 ? param.ExposureF : param.ExposureB); + //int diff = LIGHT_DIFF(values[s]); + int diff = param.MaxBright - values[s]; + double step = diff * radio; + log += " 明场:" + to_string(s) + ";diff:" + to_string(diff) + "\r\n"; + int preStep = expStep[s][0]; + if (step * preStep < 0) + { + step = 0 - preStep / 2; + } + else + { + radio = 1; + } + if (step < 1 && step > 0) + step = 1; + if (step < 0 && step > -1) + step = -1; + + int exp = *(exposures + 1); + std::string ss1(string_format("exp[%d] = %d step = %.3f \r\n", s, exp, step)); + log += ss1; + bool isMinStep = abs(step) <= 2 && step == expStep[s][0]; + bool isOutBounds = exp >= (param.Sp - 5) && step > 0; + isOutBounds |= exp <= 0 && step < 0; + if (isOutBounds) + log += " 第" + to_string(s) + "个明场校正异常 \r\n"; + else if (abs(diff) > 1 || isMinStep) + { + exp += step; + if (exp < 0) + exp = 0; + if (exp > (param.Sp - 5)) + exp = (param.Sp - 5); + + float coffe[3] = {1, 1, 1}; // 0.2, 1,0.51 + for (int k = 0; k < 3; k++) + { + *(exposures + k) = (int)(exp * coffe[k]); + expStep[s][k] = (int)(step); + std::string exps(string_format("expStep[%d][%d] = %.3f\r\n", s, k, step)); + log += exps; + std::string ss(string_format("exposures[%d] = %0.3f \r\n", k, exposures[k])); + log += ss; + } + isNeedSave = false; + } + } + // ftt.append_log(log); + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); + if (isNeedSave) + { + printf("Save LUT image path :%s \n", param.Flat_WhitePath.c_str()); + log = "灰度明场校正完成\r\n"; + if (m_glue.m_deviceevent) + m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); + log = ""; + imwrite(param.Flat_WhitePath, mrgmat); + } + } + } + SaveFpgaparam(param); + printf("exit Save_lut \n"); + return isNeedSave; } void MultiFrameCapture::formatStep() @@ -1033,6 +918,7 @@ void MultiFrameCapture::correctcolor(int correctmode) void MultiFrameCapture::openDevice(int dpi, int mode) { + printf("openDevice dpi:%d mode:%d \r\n",dpi,mode); reset_fpga(); bool dunnancis = true; int channelwidth = dpi == 0x02 ? 864 : (dpi == 0x03 ? 1728 : 864); // 1296 2592 864 @@ -1042,32 +928,48 @@ void MultiFrameCapture::openDevice(int dpi, int mode) int startsample = 202; // 205 auto fpgaparam = GetFpgaparam(dpi, mode); int t_real_dpi = dpi == 1 ? 2 : (dpi == 2 ? 2 : 3); - ModeFpga fpgamod = { - .colorMode = mode, - .dpi = t_real_dpi, - .led = 1, - .sample = startsample, // 256+39 - .adcA = 0, - .adcB = 0, - .selftest = 0, - .sp = fpgaparam.Sp}; // 600DPI 0x1450 300DPI 0xe10 + resolution_ = dpi == 3 ? DPI_600 : DPI_300; //0:600dpi 1:300dpi config.params.dpi = 2||3 pc 2代表300 3代表600 + color_mode_ = mode == 1 ? COLOR : GRAY; + + cis_width_ = resolution_ == 0 ? WIDTH * 2 : WIDTH; //宽 :DPI不变下 彩色灰度是一样的 + //width_ = paper_size_ == PaperSize::G400_MAXSIZE || paper_size_ ==PaperSize::G400_MAXAUTO && + cis_height_ = mode == 0x01 ? 60 * 3 : 60; + + pixels_width_ = color_mode_ == 1 ? cis_width_ * 3 : cis_width_; + pixels_height_ = color_mode_ == 1 ? cis_height_ / 3 : cis_height_; + + + printf("颜色模式:%s\r\n",color_mode_== COLOR ? "彩色":"灰色"); + printf("分辨率:%d\r\n",resolution_ == DPI_600?600:300); + printf("采集宽:%d 高:%d\r\n",cis_width_,cis_height_); + printf("像素宽:%d 高: %d\r\n",pixels_width_,pixels_height_); configFPGAParam(mode, dpi); StopWatch swwv4l2open; - printf("opened video with width = %d height = %d time eplased = %.2f \n", width, 60 * 2, swwv4l2open.elapsed_ms()); + video->HtCamSetClolr(color_mode_); + video->HtCamSetDpi(resolution_); + video->HtCamSetFrameCnt(1); + uint32_t val; + video->HtCamGetFrameCnt(val); + printf("设置帧数:%d\r\n",val); + video->HtCamSetSpTime(fpgaparam.Sp,fpgaparam.Sp-100); - m_capFpageregs->setFrameNum(1); - m_capFpageregs->setFrameHeight(frame_height); - for (int i = 0; i < 1; i++) + printf(" -----------------------fpgaparam.Sp[1]%d fpgaparam.MaxExp[0]:%d------------------ \r\n",fpgaparam.Sp,fpgaparam.MaxExp); + int ret = video->open_device(cis_width_,cis_height_); + if(ret < -1) + return; + + int i = 1 ; + char *buf = NULL; + while (i >= 0) { - char *buf = NULL; - video->HtCamReadCaptureFrame((void **)&buf, 200); - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - printf("abort first frame \n"); + i = video->HtCamReadCaptureFrame((void **)&buf, 500); } //video->close_video(); + + printf("opened video with width = %d height = %d time eplased = %.2f \n", width, 60 * 2, swwv4l2open.elapsed_ms()); } void MultiFrameCapture::creatcorrectconfig(int dpi, int mode) @@ -1085,13 +987,25 @@ void MultiFrameCapture::creatcorrectconfig(int dpi, int mode) m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); configFPGAParam(mode, dpi); // ftt.append_log(log); + printf("log :%s\r\n",log.c_str()); std::this_thread::sleep_for(std::chrono::milliseconds(5)); - m_capFpageregs->enableLed(false); + + unsigned int F[3]={1,1 ,1}; + video->HtCamChangeExposureValueF(F); + video->HtCamChangeExposureValueB(F); std::this_thread::sleep_for(std::chrono::milliseconds(5)); - m_capFpageregs->capture(); + + + + video->HtCamStartVideoCapturing(); std::this_thread::sleep_for(std::chrono::milliseconds(5)); isDone = saveLutImg(dpi, mode, true); // 0 color_black 1 color_white 2 gray_balck 3 gray_white - i++; + video->HtCamStopVideoCapturing(); + //video->close_device(); + this_thread::sleep_for(std::chrono::milliseconds(200)); + i++; + + //return ; } isDone = false; formatStep(); @@ -1111,8 +1025,8 @@ void MultiFrameCapture::creatcorrectconfig(int dpi, int mode) i++; } printf("creatcorrectconfig %s \n", (mode == IMAGE_COLOR ? " Color" : " Gray")); - creatLUTData(dpi, mode); - //video->close_video(); + //creatLUTData(dpi, mode); + video->close_device(); } // void MultiFrameCapture::myFloodFill(cv::Mat& image, bool isTwoSide) diff --git a/MultiFrameCapture.h b/MultiFrameCapture.h index 3604d0d..6820c24 100644 --- a/MultiFrameCapture.h +++ b/MultiFrameCapture.h @@ -12,7 +12,7 @@ class Gpio; class GpioOut; #define WIDTH 5184 -#define HEIGHT 512 +#define HEIGHT 513 //只能为3的倍数 #define DPI_600 0 #define DPI_300 1 #define COLOR 1 @@ -69,9 +69,7 @@ private: private: void reset_fpga(); void reload_fpga(); - void set_gain(int ix, int val); - void set_offset(int ix, int val); - void set_expo(int ix, int val); + void configFPGAParam(int mode,int dpi); int color(); int width(); diff --git a/build/CMakeFiles/scanservice.dir/CImageMerge.cpp.o b/build/CMakeFiles/scanservice.dir/CImageMerge.cpp.o index ebc7c02..95253b5 100644 Binary files a/build/CMakeFiles/scanservice.dir/CImageMerge.cpp.o and b/build/CMakeFiles/scanservice.dir/CImageMerge.cpp.o differ diff --git a/build/CMakeFiles/scanservice.dir/CXX.includecache b/build/CMakeFiles/scanservice.dir/CXX.includecache index 513a2a8..824dbee 100644 --- a/build/CMakeFiles/scanservice.dir/CXX.includecache +++ b/build/CMakeFiles/scanservice.dir/CXX.includecache @@ -1010,14 +1010,6 @@ CorrectParam.h mutex - -/home/modehua/sdk/zynq_7010/CuoZhiMotor.h -Motor.h -/home/modehua/sdk/zynq_7010/Motor.h -thread -- -iostream -- - /home/modehua/sdk/zynq_7010/DevUtil.h string - @@ -1042,68 +1034,10 @@ Gpio.h scanservices_utils.h /home/modehua/sdk/zynq_7010/scanservices_utils.h -/home/modehua/sdk/zynq_7010/FsmState.cpp -FsmState.h -/home/modehua/sdk/zynq_7010/FsmState.h -Scanner.h -/home/modehua/sdk/zynq_7010/Scanner.h - -/home/modehua/sdk/zynq_7010/FsmState.h -memory -- -map -- -typeinfo -- -string -- -scanservices_utils.h -/home/modehua/sdk/zynq_7010/scanservices_utils.h -utilsfunc.h -/home/modehua/sdk/zynq_7010/utilsfunc.h - /home/modehua/sdk/zynq_7010/Gpio.h string - -/home/modehua/sdk/zynq_7010/HCamDevice.cpp -HCamDevice.h -/home/modehua/sdk/zynq_7010/HCamDevice.h -stdint.h -- -thread -- -chrono -- -string -- -poll.h -- -sys/epoll.h -- -unistd.h -- -fcntl.h -- -sys/mman.h -- -sys/ioctl.h -- -string.h -- -CameraParams.h -/home/modehua/sdk/zynq_7010/CameraParams.h -linux/v4l2-subdev.h -- -iostream -- -errno.h -- -iostream -- -fstream -- - /home/modehua/sdk/zynq_7010/HCamDevice.h string - @@ -1120,12 +1054,6 @@ thread map - -/home/modehua/sdk/zynq_7010/HGUsb.h -memory -- -UsbEndpoint.h -/home/modehua/sdk/zynq_7010/UsbEndpoint.h - /home/modehua/sdk/zynq_7010/ICapturer.h atomic - @@ -1144,14 +1072,6 @@ HCamDevice.h vector - -/home/modehua/sdk/zynq_7010/IScanner.h -scanservices_utils.h -/home/modehua/sdk/zynq_7010/scanservices_utils.h -string -- -BlockingQueue.h -/home/modehua/sdk/zynq_7010/BlockingQueue.h - /home/modehua/sdk/zynq_7010/Jpegcompress.h turbojpeg.h - @@ -1174,72 +1094,6 @@ map mutex - -/home/modehua/sdk/zynq_7010/Keyboard.h -stdio.h -- -stdlib.h -- -unistd.h -- -fcntl.h -- -sys/ioctl.h -- -linux/input.h -- -sys/epoll.h -- -string.h -- -thread -- -time.h -- -condition_variable -- -functional -- -scanservices_utils.h -/home/modehua/sdk/zynq_7010/scanservices_utils.h - -/home/modehua/sdk/zynq_7010/Led.h -DevUtil.h -/home/modehua/sdk/zynq_7010/DevUtil.h - -/home/modehua/sdk/zynq_7010/MemoryInfo.h - -/home/modehua/sdk/zynq_7010/Motor.h -Gpio.h -/home/modehua/sdk/zynq_7010/Gpio.h -Pwm.h -/home/modehua/sdk/zynq_7010/Pwm.h -vector -- -thread -- -iostream -- -scanservices_utils.h -/home/modehua/sdk/zynq_7010/scanservices_utils.h -utilsfunc.h -/home/modehua/sdk/zynq_7010/utilsfunc.h -exception -- -Motordef.h -/home/modehua/sdk/zynq_7010/Motordef.h -MotorConfig.h -/home/modehua/sdk/zynq_7010/MotorConfig.h - -/home/modehua/sdk/zynq_7010/MotorConfig.h -vector -- -json.hpp -/home/modehua/sdk/zynq_7010/json.hpp -Motordef.h -/home/modehua/sdk/zynq_7010/Motordef.h - -/home/modehua/sdk/zynq_7010/Motordef.h - /home/modehua/sdk/zynq_7010/MultiFrameCapture.cpp MultiFrameCapture.h /home/modehua/sdk/zynq_7010/MultiFrameCapture.h @@ -1290,90 +1144,6 @@ CorrectParam.h IPreproc.h /home/modehua/sdk/zynq_7010/IPreproc.h -/home/modehua/sdk/zynq_7010/PanelLeds.h -Led.h -/home/modehua/sdk/zynq_7010/Led.h -iostream -- -scanservices_utils.h -/home/modehua/sdk/zynq_7010/scanservices_utils.h - -/home/modehua/sdk/zynq_7010/Pwm.h -string -- - -/home/modehua/sdk/zynq_7010/Scanner.cpp -Scanner.h -/home/modehua/sdk/zynq_7010/Scanner.h -iostream -- -filetools.h -/home/modehua/sdk/zynq_7010/filetools.h -fpgacontrol.h -/home/modehua/sdk/zynq_7010/fpgacontrol.h -MemoryInfo.h -/home/modehua/sdk/zynq_7010/MemoryInfo.h -SysInforTool.h -/home/modehua/sdk/zynq_7010/SysInforTool.h -USBProtocol.h -/home/modehua/sdk/zynq_7010/USBProtocol.h - -/home/modehua/sdk/zynq_7010/Scanner.h -memory -- -functional -- -CuoZhiMotor.h -/home/modehua/sdk/zynq_7010/CuoZhiMotor.h -ZouZhiMotor.h -/home/modehua/sdk/zynq_7010/ZouZhiMotor.h -Sensor.h -/home/modehua/sdk/zynq_7010/Sensor.h -PanelLeds.h -/home/modehua/sdk/zynq_7010/PanelLeds.h -BlockingQueue.h -/home/modehua/sdk/zynq_7010/BlockingQueue.h -FsmState.h -/home/modehua/sdk/zynq_7010/FsmState.h -MultiFrameCapture.h -/home/modehua/sdk/zynq_7010/MultiFrameCapture.h -scanservices_utils.h -/home/modehua/sdk/zynq_7010/scanservices_utils.h -Keyboard.h -/home/modehua/sdk/zynq_7010/Keyboard.h -utilsfunc.h -/home/modehua/sdk/zynq_7010/utilsfunc.h -filetools.h -/home/modehua/sdk/zynq_7010/filetools.h -SysInforTool.h -/home/modehua/sdk/zynq_7010/SysInforTool.h -MotorConfig.h -/home/modehua/sdk/zynq_7010/MotorConfig.h -correct_ultis.h -/home/modehua/sdk/zynq_7010/correct_ultis.h -FpgaComm.h -/home/modehua/sdk/zynq_7010/FpgaComm.h - -/home/modehua/sdk/zynq_7010/Sensor.h -Gpio.h -/home/modehua/sdk/zynq_7010/Gpio.h -thread -- -condition_variable -- -BlockingQueue.h -/home/modehua/sdk/zynq_7010/BlockingQueue.h -FsmState.h -/home/modehua/sdk/zynq_7010/FsmState.h -Pwm.h -/home/modehua/sdk/zynq_7010/Pwm.h - -/home/modehua/sdk/zynq_7010/SysInforTool.h -scannersysinfo.h -/home/modehua/sdk/zynq_7010/scannersysinfo.h -json.hpp -/home/modehua/sdk/zynq_7010/json.hpp - /home/modehua/sdk/zynq_7010/ThreadPool.h vector - @@ -1396,60 +1166,6 @@ stdexcept /home/modehua/sdk/zynq_7010/USBProtocol.h -/home/modehua/sdk/zynq_7010/UsbEndpoint.h -unistd.h -- -sys/types.h -- -sys/stat.h -- -fcntl.h -- -map -- -errno.h -- -scanservices_utils.h -/home/modehua/sdk/zynq_7010/scanservices_utils.h - -/home/modehua/sdk/zynq_7010/UsbScanner.cpp -UsbScanner.h -/home/modehua/sdk/zynq_7010/UsbScanner.h -turbojpeg.h -- -JsonConfig.h -/home/modehua/sdk/zynq_7010/JsonConfig.h -USBProtocol.h -/home/modehua/sdk/zynq_7010/USBProtocol.h -filetools.h -/home/modehua/sdk/zynq_7010/filetools.h -logs_out.h -/home/modehua/sdk/zynq_7010/logs_out.h - -/home/modehua/sdk/zynq_7010/UsbScanner.h -IScanner.h -/home/modehua/sdk/zynq_7010/IScanner.h -Scanner.h -/home/modehua/sdk/zynq_7010/Scanner.h -memory -- -FsmState.h -/home/modehua/sdk/zynq_7010/FsmState.h -usbdevice.h -/home/modehua/sdk/zynq_7010/usbdevice.h - -/home/modehua/sdk/zynq_7010/UsbmsgHandler.cpp -UsbmsgHandler.h -/home/modehua/sdk/zynq_7010/UsbmsgHandler.h -Scanner.h -/home/modehua/sdk/zynq_7010/Scanner.h - -/home/modehua/sdk/zynq_7010/UsbmsgHandler.h - -/home/modehua/sdk/zynq_7010/ZouZhiMotor.h -Motor.h -/home/modehua/sdk/zynq_7010/Motor.h - /home/modehua/sdk/zynq_7010/autoevent.hpp mutex - @@ -1460,10 +1176,6 @@ condition_variable stdint.h - -/home/modehua/sdk/zynq_7010/buildconf.h - -/home/modehua/sdk/zynq_7010/camtp.h - /home/modehua/sdk/zynq_7010/correct_ultis.h sstream - @@ -1498,10 +1210,6 @@ iostream ctime - -/home/modehua/sdk/zynq_7010/fpgacontrol.h -string -- - /home/modehua/sdk/zynq_7010/gvideo.h string - @@ -1848,74 +1556,6 @@ limits type_traits - -/home/modehua/sdk/zynq_7010/logs_out.h -syslog.h -- -stdio.h -- - -/home/modehua/sdk/zynq_7010/main.cpp -cstdio -- -iostream -- -fstream -- -DevUtil.h -/home/modehua/sdk/zynq_7010/DevUtil.h -Motor.h -/home/modehua/sdk/zynq_7010/Motor.h -thread -- -string -- -gvideo.h -/home/modehua/sdk/zynq_7010/gvideo.h -FpgaComm.h -/home/modehua/sdk/zynq_7010/FpgaComm.h -FsmState.h -/home/modehua/sdk/zynq_7010/FsmState.h -Scanner.h -/home/modehua/sdk/zynq_7010/Scanner.h -sstream -- -stdio.h -- -stdlib.h -- -signal.h -- -sys/file.h -- -HGUsb.h -/home/modehua/sdk/zynq_7010/HGUsb.h -memory.h -- -UsbScanner.h -/home/modehua/sdk/zynq_7010/UsbScanner.h -scanservices_utils.h -/home/modehua/sdk/zynq_7010/scanservices_utils.h -turbojpeg.h -- -JsonConfig.h -/home/modehua/sdk/zynq_7010/JsonConfig.h -syslog.h -- -utilsfunc.h -/home/modehua/sdk/zynq_7010/utilsfunc.h -correct_ultis.h -/home/modehua/sdk/zynq_7010/correct_ultis.h -errno.h -- -USBProtocol.h -/home/modehua/sdk/zynq_7010/USBProtocol.h -MotorConfig.h -/home/modehua/sdk/zynq_7010/MotorConfig.h -iomanip -- -usbdevice.h -/home/modehua/sdk/zynq_7010/usbdevice.h - /home/modehua/sdk/zynq_7010/scannersysinfo.h sstream - @@ -1954,40 +1594,6 @@ unistd.h sys/ioctl.h - -/home/modehua/sdk/zynq_7010/usb_gadget.h -linux/usb/ch9.h -- -linux/usb/gadgetfs.h -- -linux/usb/functionfs.h -- -usbstring.h -/home/modehua/sdk/zynq_7010/usbstring.h - -/home/modehua/sdk/zynq_7010/usbdevice.h -stdint.h -- -thread -- -functional -- -memory -- -camtp.h -/home/modehua/sdk/zynq_7010/camtp.h -buildconf.h -/home/modehua/sdk/zynq_7010/buildconf.h -usb_gadget.h -/home/modehua/sdk/zynq_7010/usb_gadget.h -libaio.h -- -queue -- -mutex -- - -/home/modehua/sdk/zynq_7010/usbstring.h - /home/modehua/sdk/zynq_7010/utilsfunc.h scanservices_utils.h /home/modehua/sdk/zynq_7010/scanservices_utils.h diff --git a/build/CMakeFiles/scanservice.dir/CorrectParam.cpp.o b/build/CMakeFiles/scanservice.dir/CorrectParam.cpp.o index f616593..4419d02 100644 Binary files a/build/CMakeFiles/scanservice.dir/CorrectParam.cpp.o and b/build/CMakeFiles/scanservice.dir/CorrectParam.cpp.o differ diff --git a/build/CMakeFiles/scanservice.dir/FsmState.cpp.o b/build/CMakeFiles/scanservice.dir/FsmState.cpp.o index 7dca038..afcaeed 100644 Binary files a/build/CMakeFiles/scanservice.dir/FsmState.cpp.o and b/build/CMakeFiles/scanservice.dir/FsmState.cpp.o differ diff --git a/build/CMakeFiles/scanservice.dir/HCamDevice.cpp.o b/build/CMakeFiles/scanservice.dir/HCamDevice.cpp.o index 8e676a9..313ee16 100644 Binary files a/build/CMakeFiles/scanservice.dir/HCamDevice.cpp.o and b/build/CMakeFiles/scanservice.dir/HCamDevice.cpp.o differ diff --git a/build/CMakeFiles/scanservice.dir/MultiFrameCapture.cpp.o b/build/CMakeFiles/scanservice.dir/MultiFrameCapture.cpp.o index 5e0a676..5f9fc3a 100644 Binary files a/build/CMakeFiles/scanservice.dir/MultiFrameCapture.cpp.o and b/build/CMakeFiles/scanservice.dir/MultiFrameCapture.cpp.o differ diff --git a/build/CMakeFiles/scanservice.dir/Scanner.cpp.o b/build/CMakeFiles/scanservice.dir/Scanner.cpp.o index 8d9380f..e71064a 100644 Binary files a/build/CMakeFiles/scanservice.dir/Scanner.cpp.o and b/build/CMakeFiles/scanservice.dir/Scanner.cpp.o differ diff --git a/build/CMakeFiles/scanservice.dir/UsbScanner.cpp.o b/build/CMakeFiles/scanservice.dir/UsbScanner.cpp.o index fbbbde0..9d7ff0e 100644 Binary files a/build/CMakeFiles/scanservice.dir/UsbScanner.cpp.o and b/build/CMakeFiles/scanservice.dir/UsbScanner.cpp.o differ diff --git a/build/CMakeFiles/scanservice.dir/correct_ultis.cpp.o b/build/CMakeFiles/scanservice.dir/correct_ultis.cpp.o index 3f089a7..16e386c 100644 Binary files a/build/CMakeFiles/scanservice.dir/correct_ultis.cpp.o and b/build/CMakeFiles/scanservice.dir/correct_ultis.cpp.o differ diff --git a/build/scanservice b/build/scanservice index 1c4f3ef..de13303 100755 Binary files a/build/scanservice and b/build/scanservice differ diff --git a/correct_ultis.cpp b/correct_ultis.cpp index 55ed717..ed990ec 100644 --- a/correct_ultis.cpp +++ b/correct_ultis.cpp @@ -21,17 +21,17 @@ void setOffset(int *config, int step) } } -// cv::Mat extractRepresentRow2(const cv::Mat &src) -// { -// cv::Mat BWbalenceSrc(1, src.cols * src.channels(), CV_8UC1); +cv::Mat extractRepresentRow2(const cv::Mat &src) +{ + cv::Mat BWbalenceSrc(1, src.cols * src.channels(), CV_8UC1); -// cv::Mat temp_imageBW(src.rows, src.cols * src.channels(), CV_8UC1, src.data); + cv::Mat temp_imageBW(src.rows, src.cols * src.channels(), CV_8UC1, src.data); -// for (size_t i = 0; i < BWbalenceSrc.cols; i++) -// BWbalenceSrc.at(0, i) = cv::mean(temp_imageBW(cv::Rect(i, 0, 1, temp_imageBW.rows)))[0]; + for (size_t i = 0; i < BWbalenceSrc.cols; i++) + BWbalenceSrc.at(0, i) = cv::mean(temp_imageBW(cv::Rect(i, 0, 1, temp_imageBW.rows)))[0]; -// return BWbalenceSrc; -// } + return BWbalenceSrc; +} cv::Mat loadLUT(const std::string &file) { @@ -122,63 +122,61 @@ void correctColor(cv::Mat &src, int dpi, int mode, bool lutgraghic) cv::LUT(image_temp(cv::Rect(i, 0, 1, image_temp.rows)), lutMat(cv::Rect(0, i, 256, 1)), image_temp(cv::Rect(i, 0, 1, image_temp.rows))); } -// void creatLUTData(int dpi, int mode) -// { -// printf("eneter creatLUTData \n"); -// FPGAConfigParam param = GetFpgaparam(dpi, mode); -// auto colormode = mode == 1 ? IMREAD_COLOR : IMREAD_GRAYSCALE; -// std::string blackPath = param.Flat_BwPath; -// std::string whitePath = param.Flat_WhitePath; +void creatLUTData(int dpi, int mode) +{ + printf("eneter creatLUTData \n"); + FPGAConfigParam param = GetFpgaparam(dpi, mode); + auto colormode = mode == 1 ? IMREAD_COLOR : IMREAD_GRAYSCALE; + std::string blackPath = param.Flat_BwPath; + std::string whitePath = param.Flat_WhitePath; -// cv::Mat lut; -// cv::Mat twMat = cv::imread(whitePath, colormode); -// cv::Mat tbMat = cv::imread(blackPath, colormode); -// cv::Mat wMat, bMat; -// if (mode == 1) -// { -// wMat = cv::Mat(twMat.rows, twMat.cols * 3, CV_8UC1, twMat.data); -// bMat = cv::Mat(twMat.rows, twMat.cols * 3, CV_8UC1, tbMat.data); -// } -// else -// { -// wMat = twMat; -// bMat = tbMat; -// } -// #ifdef USE_NEWFLAT -// //lut = calcLUT(extractRepresentRow2(bMat), extractRepresentRow2(wMat), false); -// //cv::imwrite(param.LutPath, lut); + cv::Mat lut; + cv::Mat twMat = cv::imread(whitePath, colormode); + cv::Mat tbMat = cv::imread(blackPath, colormode); + cv::Mat wMat, bMat; + if (mode == 1) + { + wMat = cv::Mat(twMat.rows, twMat.cols * 3, CV_8UC1, twMat.data); + bMat = cv::Mat(twMat.rows, twMat.cols * 3, CV_8UC1, tbMat.data); + } + else + { + wMat = twMat; + bMat = tbMat; + } +#ifdef USE_NEWFLAT + //lut = calcLUT(extractRepresentRow2(bMat), extractRepresentRow2(wMat), false); + //cv::imwrite(param.LutPath, lut); -// lut = calcLUT(extractRepresentRow2(bMat), extractRepresentRow2(wMat), true); -// cv::imwrite(param.TextLutPath, lut); -// #else -// lut = create_lut(extractRepresentRow2(bMat), extractRepresentRow2(wMat), dpi, mode); -// // Mat dst(bMat.cols * bMat.channels(), 256, CV_8UC1); -// // memcpy(dst.data, lut.data, bMat.cols * bMat.channels() * 256); -// cv::imwrite(param.LutPath, lut); -// #endif -// printf("exit creatLUTData \n"); -// } + lut = calcLUT(extractRepresentRow2(bMat), extractRepresentRow2(wMat), true); + cv::imwrite(param.TextLutPath, lut); +#else + lut = create_lut(extractRepresentRow2(bMat), extractRepresentRow2(wMat), dpi, mode); + // Mat dst(bMat.cols * bMat.channels(), 256, CV_8UC1); + // memcpy(dst.data, lut.data, bMat.cols * bMat.channels() * 256); + cv::imwrite(param.LutPath, lut); +#endif + printf("exit creatLUTData \n"); +} FPGAConfigParam GetFpgaparam(int dpi, int mode) { - //FPGAConfigParam param = CorrectParam().GetFpgaparam(dpi, mode); return correctparam.GetFpgaparam(dpi, mode); } void SaveFpgaparam(FPGAConfigParam ¶m) { correctparam.SaveCorrectParam(param); - //CorrectParam().SaveCorrectParam(param); } -// cv::Mat colMean(const cv::Mat &image) -// { -// cv::Mat meanMat(1, image.step, CV_8UC1); -// cv::Mat tempMat(image.rows, image.step, CV_8UC1, image.data); -// for (int i = 0; i < tempMat.step; i++) -// meanMat.data[i] = cv::mean(tempMat(cv::Rect(i, 0, 1, tempMat.rows)))[0]; +cv::Mat colMean(const cv::Mat &image) +{ + cv::Mat meanMat(1, image.step, CV_8UC1); + cv::Mat tempMat(image.rows, image.step, CV_8UC1, image.data); + for (int i = 0; i < tempMat.step; i++) + meanMat.data[i] = cv::mean(tempMat(cv::Rect(i, 0, 1, tempMat.rows)))[0]; -// return meanMat; -// } + return meanMat; +} float gamma(float value, float ex) { @@ -189,214 +187,214 @@ float gamma(float value, float ex) #define BLACK_OFFSET 0 void fittingLUT(const std::vector &points, u_char min_value, u_char max_value, u_char *data) { - // float step = max_value - min_value + 1; - // memset(data, min_value, 127); - // memset(data + 127, max_value, 129); - // int b = points[0]; - // int w = points[1]; - // int tb = min_value; - // int tw = max_value; + float step = max_value - min_value + 1; + memset(data, min_value, 127); + memset(data + 127, max_value, 129); + int b = points[0]; + int w = points[1]; + int tb = min_value; + int tw = max_value; - // step = cv::max((float)(tw - tb + 1) / (float)(w - b + 1), 0.0f); - // float temp; - // for (int j = 0, length = (255 - b + 1); j < length; j++) - // { - // temp = gamma(tb + step * j, GAMMA_EX) - BLACK_OFFSET; - // data[j + b] = cv::min(255, cv::max(0, static_cast(temp))); - // } + step = cv::max((float)(tw - tb + 1) / (float)(w - b + 1), 0.0f); + float temp; + for (int j = 0, length = (255 - b + 1); j < length; j++) + { + temp = gamma(tb + step * j, GAMMA_EX) - BLACK_OFFSET; + data[j + b] = cv::min(255, cv::max(0, static_cast(temp))); + } } -// std::vector caculate(const std::vector &points_x, const std::vector &points_y) -// { -// int MaxElement = points_x.size() - 1; -// //计算常数f -// double f = points_y[0]; -// //求解 -// int n, m; -// // double a[MaxElement][MaxElement+1]; -// std::vector> a; -// // a.resize(MaxElement); -// for (int i = 0; i < MaxElement; i++) -// { -// std::vector b; -// b.resize(MaxElement + 1); -// a.push_back(b); -// } +std::vector caculate(const std::vector &points_x, const std::vector &points_y) +{ + int MaxElement = points_x.size() - 1; + //计算常数f + double f = points_y[0]; + //求解 + int n, m; + // double a[MaxElement][MaxElement+1]; + std::vector> a; + // a.resize(MaxElement); + for (int i = 0; i < MaxElement; i++) + { + std::vector b; + b.resize(MaxElement + 1); + a.push_back(b); + } -// for (int i = 0; i < MaxElement; i++) -// { -// for (int j = 0; j < MaxElement; j++) -// a[i][j] = cv::pow(points_x[i + 1], MaxElement - j); -// a[i][MaxElement] = points_y[i + 1] - f; -// } + for (int i = 0; i < MaxElement; i++) + { + for (int j = 0; j < MaxElement; j++) + a[i][j] = cv::pow(points_x[i + 1], MaxElement - j); + a[i][MaxElement] = points_y[i + 1] - f; + } -// int i, j; -// n = MaxElement; + int i, j; + n = MaxElement; -// for (j = 0; j < n; j++) -// { -// double max = 0; -// double imax = 0; -// for (i = j; i < n; i++) -// { -// if (imax < cv::abs(a[i][j])) -// { -// imax = cv::abs(a[i][j]); -// max = a[i][j]; //得到各行中所在列最大元素 -// m = i; -// } -// } -// if (cv::abs(a[j][j]) != max) -// { -// double b = 0; -// for (int k = j; k < n + 1; k++) -// { -// b = a[j][k]; -// a[j][k] = a[m][k]; -// a[m][k] = b; -// } -// } + for (j = 0; j < n; j++) + { + double max = 0; + double imax = 0; + for (i = j; i < n; i++) + { + if (imax < cv::abs(a[i][j])) + { + imax = cv::abs(a[i][j]); + max = a[i][j]; //得到各行中所在列最大元素 + m = i; + } + } + if (cv::abs(a[j][j]) != max) + { + double b = 0; + for (int k = j; k < n + 1; k++) + { + b = a[j][k]; + a[j][k] = a[m][k]; + a[m][k] = b; + } + } -// for (int r = j; r < n + 1; r++) -// { -// a[j][r] = a[j][r] / max; //让该行的所在列除以所在列的第一个元素,目的是让首元素为1 -// } + for (int r = j; r < n + 1; r++) + { + a[j][r] = a[j][r] / max; //让该行的所在列除以所在列的第一个元素,目的是让首元素为1 + } -// for (i = j + 1; i < n; i++) -// { -// double c = a[i][j]; -// if (c == 0.0) -// continue; -// for (int s = j; s < n + 1; s++) -// { -// a[i][s] = a[i][s] - a[j][s] * c; //前后行数相减,使下一行或者上一行的首元素为0 -// } -// } -// } -// for (i = n - 2; i >= 0; i--) -// { -// for (j = i + 1; j < n; j++) -// { -// a[i][n] = a[i][n] - a[j][n] * a[i][j]; -// } -// } + for (i = j + 1; i < n; i++) + { + double c = a[i][j]; + if (c == 0.0) + continue; + for (int s = j; s < n + 1; s++) + { + a[i][s] = a[i][s] - a[j][s] * c; //前后行数相减,使下一行或者上一行的首元素为0 + } + } + } + for (i = n - 2; i >= 0; i--) + { + for (j = i + 1; j < n; j++) + { + a[i][n] = a[i][n] - a[j][n] * a[i][j]; + } + } -// std::vector result; -// for (int k = 0; k < n; k++) -// result.push_back(a[k][n]); -// result.push_back(f); -// return result; -// } + std::vector result; + for (int k = 0; k < n; k++) + result.push_back(a[k][n]); + result.push_back(f); + return result; +} -// cv::Mat createLUT(const std::vector &mats, bool isTextCorrect) -// { -// int rows = mats[0].cols; -// cv::Mat lut(rows, 256, CV_8UC1); +cv::Mat createLUT(const std::vector &mats, bool isTextCorrect) +{ + int rows = mats[0].cols; + cv::Mat lut(rows, 256, CV_8UC1); -// double max_val, min_val; -// cv::minMaxIdx(mats[0], &min_val, nullptr); -// cv::minMaxIdx(mats[1], nullptr, &max_val); -// for (size_t i = 0; i < rows; i++) -// { -// std::vector grayPoints; -// for (size_t j = 0; j < mats.size(); j++) -// grayPoints.push_back(mats[j].data[i]); + double max_val, min_val; + cv::minMaxIdx(mats[0], &min_val, nullptr); + cv::minMaxIdx(mats[1], nullptr, &max_val); + for (size_t i = 0; i < rows; i++) + { + std::vector grayPoints; + for (size_t j = 0; j < mats.size(); j++) + grayPoints.push_back(mats[j].data[i]); -// fittingLUT(grayPoints, static_cast(min_val), static_cast(max_val), lut.data + i * 256); -// } -// if (isTextCorrect) -// { -// std::vector points_x = {0, 25, 205, 255}, points_y = {0, 0, 230, 255}; -// std::vector coefficient = caculate(points_x, points_y); + fittingLUT(grayPoints, static_cast(min_val), static_cast(max_val), lut.data + i * 256); + } + if (isTextCorrect) + { + std::vector points_x = {0, 25, 205, 255}, points_y = {0, 0, 230, 255}; + std::vector coefficient = caculate(points_x, points_y); -// u_char buffer[256]; -// for (int i = 0; i < 256; i++) -// { -// int temp = coefficient[0] * i * i * i + coefficient[1] * i * i + coefficient[2] * i + coefficient[3]; -// buffer[i] = static_cast(cv::min(255, cv::max(0, temp))); -// } + u_char buffer[256]; + for (int i = 0; i < 256; i++) + { + int temp = coefficient[0] * i * i * i + coefficient[1] * i * i + coefficient[2] * i + coefficient[3]; + buffer[i] = static_cast(cv::min(255, cv::max(0, temp))); + } -// cv::Mat lut_lut(256, 1, CV_8UC1, buffer); -// cv::LUT(lut, lut_lut, lut); -// } -// return lut; -// } + cv::Mat lut_lut(256, 1, CV_8UC1, buffer); + cv::LUT(lut, lut_lut, lut); + } + return lut; +} #ifdef G400 #define CHANNEL 408 #else #define CHANNEL 432 #endif -// cv::Mat calcLUT(const cv::Mat &black, const cv::Mat &white, bool isTextCorrection) -// { -// std::vector w; -// w.push_back(colMean(black)); -// w.push_back(colMean(white)); -// cv::Mat lut = createLUT(w, isTextCorrection); +cv::Mat calcLUT(const cv::Mat &black, const cv::Mat &white, bool isTextCorrection) +{ + std::vector w; + w.push_back(colMean(black)); + w.push_back(colMean(white)); + cv::Mat lut = createLUT(w, isTextCorrection); -// for (size_t i = 0, block = lut.rows / CHANNEL; i < block; i++) -// { -// cv::Mat lutROI = lut(cv::Rect(0, i * CHANNEL, 256, CHANNEL)); -// cv::Mat tran; -// cv::transpose(lutROI, tran); -// memcpy(lutROI.data, tran.data, tran.total()); -// } -// return lut; -// } + for (size_t i = 0, block = lut.rows / CHANNEL; i < block; i++) + { + cv::Mat lutROI = lut(cv::Rect(0, i * CHANNEL, 256, CHANNEL)); + cv::Mat tran; + cv::transpose(lutROI, tran); + memcpy(lutROI.data, tran.data, tran.total()); + } + return lut; +} -// cv::Mat create_lut(const cv::Mat &black, const cv::Mat &white, int dpi, bool colormode) -// { -// #ifndef USE_NEWFLAT -// if (black.empty() || white.empty() || black.channels() != 1 || white.channels() != 1 || black.step != white.step) -// return cv::Mat(); +cv::Mat create_lut(const cv::Mat &black, const cv::Mat &white, int dpi, bool colormode) +{ +#ifndef USE_NEWFLAT + if (black.empty() || white.empty() || black.channels() != 1 || white.channels() != 1 || black.step != white.step) + return cv::Mat(); -// int channel = 1; -// if (black.step == 4896 || black.step == 7344) -// channel = 408; -// else if (black.step == 14688 || black.step == 22032 || black.step == 44064) -// channel = 432; // 486 + int channel = 1; + if (black.step == 4896 || black.step == 7344) + channel = 408; + else if (black.step == 14688 || black.step == 22032 || black.step == 44064) + channel = 432; // 486 -// if (channel == 1) -// return cv::Mat(); + if (channel == 1) + return cv::Mat(); -// const int rows = black.cols / channel; -// const int cols = 256; -// auto cc = CV_8UC(channel); -// Mat lut(rows, cols, CV_8UC(channel)); + const int rows = black.cols / channel; + const int cols = 256; + auto cc = CV_8UC(channel); + Mat lut(rows, cols, CV_8UC(channel)); -// for (size_t i = 0; i < rows; i++) -// { -// Mat lut_row = lut(cv::Rect(0, i, cols, 1)); -// unsigned char *ptr_buffer = lut_row.data; -// unsigned char *ptr_black = black.data + i * channel; -// unsigned char *ptr_white = white.data + i * channel; -// for (size_t j = 0; j < cols; j++) -// for (size_t k = 0; k < channel; k++) -// { -// if (ptr_black[k] >= ptr_white[k]) -// { -// ptr_buffer[j * channel + k] = 0; -// continue; -// } + for (size_t i = 0; i < rows; i++) + { + Mat lut_row = lut(cv::Rect(0, i, cols, 1)); + unsigned char *ptr_buffer = lut_row.data; + unsigned char *ptr_black = black.data + i * channel; + unsigned char *ptr_white = white.data + i * channel; + for (size_t j = 0; j < cols; j++) + for (size_t k = 0; k < channel; k++) + { + if (ptr_black[k] >= ptr_white[k]) + { + ptr_buffer[j * channel + k] = 0; + continue; + } -// if (j <= ptr_black[k]) -// ptr_buffer[j * channel + k] = 0; -// else if (j >= ptr_white[k]) -// ptr_buffer[j * channel + k] = 255; -// else -// { -// float val = 255.0f * (j - ptr_black[k]) / (ptr_white[k] - ptr_black[k]) * 1.275; // -// ptr_buffer[j * channel + k] = (unsigned char)cv::max(0.0f, cv::min(val, 255.0f)); -// } -// } -// } -// cv::Mat saveMat(black.step, 256, CV_8UC1, lut.data); -// return saveMat.clone(); -// #else -// return calcLUT(black, white, false); -// #endif -// } + if (j <= ptr_black[k]) + ptr_buffer[j * channel + k] = 0; + else if (j >= ptr_white[k]) + ptr_buffer[j * channel + k] = 255; + else + { + float val = 255.0f * (j - ptr_black[k]) / (ptr_white[k] - ptr_black[k]) * 1.275; // + ptr_buffer[j * channel + k] = (unsigned char)cv::max(0.0f, cv::min(val, 255.0f)); + } + } + } + cv::Mat saveMat(black.step, 256, CV_8UC1, lut.data); + return saveMat.clone(); +#else + return calcLUT(black, white, false); +#endif +} -// cv::Mat GetMergeMat(int dstwidth, int dstheight, int type, cv::Mat &mat) -// { -// return CImageMerge().MergeImage(type == CV_8UC3, mat, dstwidth, dstheight); -// } \ No newline at end of file +cv::Mat GetMergeMat(int dstwidth, int dstheight, int type, cv::Mat &mat) +{ + return CImageMerge().MergeImage(type == CV_8UC3, mat, dstwidth, dstheight); +} \ No newline at end of file diff --git a/correct_ultis.h b/correct_ultis.h index 21e869a..9dced71 100644 --- a/correct_ultis.h +++ b/correct_ultis.h @@ -14,9 +14,9 @@ void initStep(); void setOffset(int *config, int step); -//cv::Mat calcLUT(const cv::Mat& black, const cv::Mat& white, bool isTextCorrection); +cv::Mat calcLUT(const cv::Mat& black, const cv::Mat& white, bool isTextCorrection); -//cv::Mat extractRepresentRow2(const cv::Mat& src); +cv::Mat extractRepresentRow2(const cv::Mat& src); void initLut(const std::string lutpath,bool iscolor); @@ -28,6 +28,6 @@ FPGAConfigParam GetFpgaparam(int dpi,int mode); void SaveFpgaparam(FPGAConfigParam& param); -//cv::Mat create_lut(const cv::Mat& black, const cv::Mat& white,int dpi, bool colormode); +cv::Mat create_lut(const cv::Mat& black, const cv::Mat& white,int dpi, bool colormode); -//cv::Mat GetMergeMat(int dstwidth ,int dstheight,int type,cv::Mat& mat); \ No newline at end of file +cv::Mat GetMergeMat(int dstwidth ,int dstheight,int type,cv::Mat& mat); \ No newline at end of file