diff --git a/CImageMerge.cpp b/CImageMerge.cpp index 4893827..2444288 100644 --- a/CImageMerge.cpp +++ b/CImageMerge.cpp @@ -14,7 +14,7 @@ cv::Mat CImageMerge::MergeImage(cv::Mat &srcMat, int dstwidth, int dstheight, in { //printf("7010 7010 10 7010 7010 7010 7010 7010 7010!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n"); cv::Mat matdst; - if (srcMat.cols == 5184 || srcMat.cols == 10368) // gray mode + if (!mode ) // gray mode { matdst = srcMat; } diff --git a/CameraParams.h b/CameraParams.h index 99d60f1..a0e3a45 100644 --- a/CameraParams.h +++ b/CameraParams.h @@ -78,6 +78,7 @@ union CamZ_Reg_A_New unsigned int psincdec : 1; //相移动反向 unsigned int clr_psedon : 1;//清除相完成 写低写高 unsigned int dpi: 1; //1: 300DPI 0: 600DPI + unsigned int dpi_200: 1; //dpi=1的时候 dpi_200=1 200dpi dpi=1的时候 dpi_200=0 300dpi dpi=0的时候 dpi_200=0 600dpi }; }; diff --git a/HCamDevice.cpp b/HCamDevice.cpp index 04fc8f1..c010428 100644 --- a/HCamDevice.cpp +++ b/HCamDevice.cpp @@ -1228,15 +1228,25 @@ void HCamDevice::HtCamChangeTriggerInAndEXt(int in_out) void HCamDevice::HtCamSetDpi(int dpi) { - uint32_t *pCamCtrlReg = virBaseAddr; - if (dpi) + CamZ_Reg_A_New rega; + rega.value = HtCamReadFpgaRegs(0x0A); + printf("dpi:%d\r\n",dpi); + if (dpi == 1 ) { - pCamCtrlReg[10] |= (0x00000800); + rega.dpi_200 = 1; + rega.dpi = 1; + } + else if (dpi == 2) + { + rega.dpi_200 = 0; + rega.dpi = 1; } else { - pCamCtrlReg[10] &= ~(0x00000800); + rega.dpi_200 = 0; + rega.dpi = 0; } + HtCamWriteFpgaRegs(0x0A,rega.value); } void HCamDevice::HtCamSetClolr(int color) diff --git a/HCamDevice.h b/HCamDevice.h index 0efca54..33b0c1e 100644 --- a/HCamDevice.h +++ b/HCamDevice.h @@ -37,7 +37,9 @@ public: int HtCamGetTriggerMode(); //获取触发模式 int HtCamGetColorMode(); //获取颜色模式 void HtCamSetClolr(int color); //设置颜色模式 - void HtCamSetDpi(int dpi); //设置dpi + //设置dpi dpi =0 200dpi ,dpi =1 300dpi,dpi =2 600dpi + //注意协议的逻辑 :11号寄存器设置1 12号设置1 200dpi 11号寄存器设置1 12号设置0 300dpi 11号寄存器设置0 12号设置0 600dpi + void HtCamSetDpi(int dpi); int HtCamReadCaptureFrame(void **pbuf, int timeout); //读图 <较重要> diff --git a/MultiFrameCapture.cpp b/MultiFrameCapture.cpp index 8307e45..1a8d223 100644 --- a/MultiFrameCapture.cpp +++ b/MultiFrameCapture.cpp @@ -100,9 +100,9 @@ void MultiFrameCapture::snap() std::lock_guard m_lock(m_mtx_snap); b_stop_snap = b_end_snap = false; - if (m_config.params.dpi == 3) - this_thread::sleep_for(std::chrono::milliseconds(160)); - else if(m_config.params.dpi == 2) + if (m_config.params.dpi == 3 ) + this_thread::sleep_for(std::chrono::milliseconds(140)); + else if(m_config.params.dpi == 2 && m_config.params.pageSize != (int)PaperSize::G400_AUTO) this_thread::sleep_for(std::chrono::milliseconds(45)); else this_thread::sleep_for(std::chrono::milliseconds(10)); @@ -150,12 +150,12 @@ uint32_t MultiFrameCapture::compute_frame(int paper_size,int dpi) void MultiFrameCapture::compute_height(int width,int height) { //////这块配置一定要注意 - v4l2_width_ = resolution_ == 0 ? width * 2 : width; //宽 :DPI不变下 彩色灰度是一样的 + v4l2_width_ = resolution_ == DPI_600 ? width * 2 :(resolution_ == DPI_300 ? width :(float)width / 1.5) ; //宽 :DPI不变下 彩色灰度是一样的 //width_ = paper_size_ == PaperSize::G400_MAXSIZE || paper_size_ ==PaperSize::G400_MAXAUTO && v4l2_height_ = height; - pixels_width_ = color_mode_ == 1 ? v4l2_width_ * 3 : v4l2_width_; - pixels_height_ = color_mode_ == 1 ? v4l2_height_ / 3 : v4l2_height_; + pixels_width_ = color_mode_ == COLOR ? v4l2_width_ * 3 : v4l2_width_; + pixels_height_ = color_mode_ == COLOR ? v4l2_height_ / 3 : v4l2_height_; } SIZE MultiFrameCapture::GetPaperSize(PaperSize paper, int dpi) { @@ -180,8 +180,8 @@ void MultiFrameCapture::UpdateScanParam(HG_ScanConfiguration config) int config_dpi = config.params.dpi; int config_color = config.params.isColor; - resolution_ = config.params.dpi == 3 ? DPI_600 : DPI_300; //0:600dpi 1:300dpi config.params.dpi = 2||3 pc 1 代表200 2代表300 3代表600 - color_mode_ = config.params.isColor == 1 ? COLOR : GRAY; + resolution_ = config.params.dpi; //0:600dpi 1:300dpi config.params.dpi = 2||3 pc 1 代表200 2代表300 3代表600 + color_mode_ = config.params.isColor; is_correct_ = config.params.isCorrect; paper_size_ = config.params.pageSize; is_double_paper_ = config.params.doubleFeeded; @@ -190,17 +190,17 @@ void MultiFrameCapture::UpdateScanParam(HG_ScanConfiguration config) //int height = resolution_ == DPI_600 ? 342 : 900; - int height = config.params.dpi == 3 ? 342 :(config.params.dpi == 2?999:513); + int height = config.params.dpi == 3 ? 900 :(config.params.dpi == 2?999:300); compute_height(WIDTH , height); video->HtCamSetClolr(color_mode_); video->HtCamSetDpi(resolution_); FPGAConfigParam fpgaparam = GetFpgaparam(config_dpi, config_color); - video->HtCamSetSpTime(fpgaparam.Sp, fpgaparam.MaxExp); // 2344 灰色 //2023-8-10 最新2650 + video->HtCamSetSpTime(fpgaparam.Sp,49); // 2344 灰色 //2023-8-10 最新2650 if (color_mode_) { - video->HtCamSetSpTime2(fpgaparam.HRatio); + video->HtCamSetSpTime2(fpgaparam.Sp * 3); } video->HtCamSetStSp(fpgaparam.MaxBright); @@ -214,19 +214,21 @@ void MultiFrameCapture::UpdateScanParam(HG_ScanConfiguration config) { cnt -=1 ; } - + if (m_config.params.dpi == 3) + { + cnt +=1 ; + } video->HtCamSetFrameCnt(cnt); printf(" -----------------------设置帧数:%d------------------\r\n",cnt); } printf("颜色模式:%s\r\n",color_mode_== COLOR ? "彩色":"灰色"); - printf("分辨率:%d\r\n",resolution_ == DPI_600?600:300); + printf("分辨率:%d\r\n",resolution_); printf("V4L2宽:%d 高:%d\r\n",v4l2_width_,v4l2_height_); printf("像素宽:%d 高: %d\r\n",pixels_width_,pixels_height_); printf("fpga_height_:%d\r\n", fpga_height_); - printf("resolution_:%d\r\n", resolution_); printf("color_mode_:%d\r\n", color_mode_); printf("paper_size_:%d\r\n", paper_size_); printf("paper_size_:%d\r\n", paper_size_); @@ -388,14 +390,14 @@ void MultiFrameCapture::snaprun() //HG_JpegCompressInfo info = cmp.GetCompressedImg(mat); HG_JpegCompressInfo info ; - if (m_config.params.dpi == 3 ) - { - printf("600做拷贝\r\n"); - info.pJpegData = (unsigned char *)malloc(frame_info.height * frame_info.width); - memcpy(info.pJpegData , data , frame_info.height * frame_info.width); - info.dpi = true ; - } - else + // if (resolution_ == DPI_600 ) + // { + // printf("600做拷贝\r\n"); + // info.pJpegData = (unsigned char *)malloc(frame_info.height * frame_info.width); + // memcpy(info.pJpegData , data , frame_info.height * frame_info.width); + // info.dpi = 1 ; + // } + // else { info.pJpegData = data; info.dpi = false ; @@ -412,7 +414,7 @@ void MultiFrameCapture::snaprun() info.width = frame_info.width; info.height = frame_info.height; - // printf("获取数据 width:%d height:%d is_first:%d is_last:%d DataLength:%d\r\n",frame_info.width,frame_info.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_info.width,frame_info.height,info.first_frame,info.last_frame,info.DataLength); m_glue.m_imageready(info); @@ -443,7 +445,7 @@ void MultiFrameCapture::snaprun() int channels = color_mode_ == 1 ? 3 : 1; int color_mode = video->HtCamGetColorMode(); int func_sig = 0; - int time_out = resolution_ == DPI_600 ? 1000 : 600; ///这个时间是根据每帧的数据量来进行调测的 + int time_out = resolution_ == DPI_600 ? 2000 : 600; ///这个时间是根据每帧的数据量来进行调测的 int time_out_cnt = 0; if (color_mode_) @@ -475,24 +477,11 @@ void MultiFrameCapture::snaprun() sw.reset(); for (size_t i = 0; i <= frame_cnt ; i++) //frame_cnt -1 目前最好一帧采集会超时 所以多采集一帧 { - printf("***********设置的帧数:%d 正在采集第[%d]帧************\r\n",frame_info.frame_index,i); - + printf("***********设置的帧数:%d 正在采集第[%d]帧************\r\n",frame_info.frame_index,i +1); frame_info.first_frame = i == 0 ? true : false; frame_info.last_frame = i == frame_cnt ? true : false; func_sig = snap_func(frame_info, channels,time_out,i); - - // if (func_sig == -1 ) //当前帧取图超时,在取一次!!! 一直超时 不就卡死了??? 这个地方还是需要加个时间限制几秒内一帧未取出就退了,返回异常状态吧? - // { - // i--; -// time_out +=200; - // time_out_cnt ++; - // if (time_out_cnt >=5) - // { - // break; - // } - // continue; - // } if (b_stop_snap) { @@ -500,29 +489,21 @@ void MultiFrameCapture::snaprun() int ind = i + 1; //已采集了的帧数 int val = frame_num - ind; //剩余还未采集的帧数 - while (val) + while (val > 0) { + frame_info.last_frame = val == 1 ? true : false; frame_info.frame_index = frame_num; func_sig = snap_func(frame_info, channels,time_out ,ind);//同上面一样 - printf("-----------当前采集到第:[%d]帧 CIS总共采集[%d]帧 -------\r\n",ind,frame_num); - - // if (func_sig == -1 ) - // { - // time_out +=200; - // time_out_cnt ++; - // if (time_out_cnt >=5) - // { - // break; - // } - // continue; - // } - val--; ind++; - if(m_config.params.dpi == 3) + printf("-----------当前采集到第:[%d]帧 CIS总共采集[%d]帧 -------\r\n",ind,frame_num); + + video->HtCamGetFrameNum(frame_num); + val = frame_num - ind; + if(resolution_ == DPI_600) { - int d = 80; + int d = 200; this_thread::sleep_for(std::chrono::milliseconds(d)); } } @@ -536,7 +517,7 @@ void MultiFrameCapture::snaprun() ////////////////////////////DPI 颜色不同 会导致数据大小不同所以这个地方延时肯定不一样 目前 60是200dpi///////////////////////// if(m_config.params.dpi == 3) { - int d = 80; + int d = 200; this_thread::sleep_for(std::chrono::milliseconds(d)); } @@ -616,13 +597,15 @@ static int temp_val = 0; bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) { printf("校正DPI[%d] 校正颜色:%s\n",dpi==1?200:(dpi==2?300:600),mode == IMAGE_COLOR?"彩色":"灰色"); - int config_dpi = dpi == 1 ? 2 : dpi; + + int config_dpi = 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 width = config_dpi == 0x02 ? 864 : (config_dpi == 0x03 ? 1728 : 576); int orgimgwidth = width * 2 * 3 * channels; + printf("orgimgwidth:%d\r\n",orgimgwidth); int dstwidth = width * 2 * 3; @@ -775,10 +758,10 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) cv::Scalar a = cv::mean(mrgmat(cv::Rect(0, 10, mrgmat.cols / 2, mrgmat.rows-10))); cv::Scalar b = cv::mean(mrgmat(cv::Rect(mrgmat.cols / 2, 10, mrgmat.cols / 2, mrgmat.rows-10))); static int indxxx=0; - if(indxxx <= 10) - { - cv::imwrite(std::to_string(++indxxx)+".bmp",mrgmat); - } + // if(indxxx <= 10) + // { + // cv::imwrite(std::to_string(++indxxx)+".bmp",mrgmat); + // } for (char j = 0; j < 3; j++) { values[0][j] = a.val[2-j]; @@ -1023,7 +1006,7 @@ 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 + int channelwidth = dpi == 0x02 ? 864 : (dpi == 0x03 ? 1728 : 576); // 1296 2592 864 int channels = mode == 0x01 ? 3 : 1; int width = channelwidth * channels; int frame_height = mode == 0x01 ? 60 * 3 : 60; @@ -1031,13 +1014,13 @@ void MultiFrameCapture::openDevice(int dpi, int mode) int t_real_dpi = dpi == 1 ? 2 : (dpi == 2 ? 2 : 3); - resolution_ = dpi == 3 ? DPI_600 : DPI_300; //0:600dpi 1:300dpi config.params.dpi = 2||3 pc 2代表300 3代表600 + resolution_ = dpi; //dpi 1代表200 2代表300 3代表600 color_mode_ = mode == 1 ? COLOR : GRAY; compute_height(WIDTH , HEIGHT); - int config_dpi = resolution_ == DPI_600 ? 3 : 2; + int config_dpi = resolution_; int config_color = color_mode_ ==COLOR ? 1:0; StopWatch swwv4l2open; @@ -1048,10 +1031,10 @@ void MultiFrameCapture::openDevice(int dpi, int mode) FPGAConfigParam fpgaparam = GetFpgaparam(config_dpi, config_color); - video->HtCamSetSpTime(fpgaparam.Sp,fpgaparam.MaxExp); // 2344 灰色 //2023-8-10 最新2650 + video->HtCamSetSpTime(fpgaparam.Sp,49); if (color_mode_) { - video->HtCamSetSpTime2(fpgaparam.HRatio); + video->HtCamSetSpTime2(fpgaparam.Sp * 3); } video->HtCamSetStSp(fpgaparam.MaxBright); @@ -1065,11 +1048,10 @@ void MultiFrameCapture::openDevice(int dpi, int mode) } printf("颜色模式:%s\r\n",color_mode_== COLOR ? "彩色":"灰色"); - printf("分辨率:%d\r\n",resolution_ == DPI_600?600:300); + printf("分辨率:%d\r\n",resolution_); printf("V4L2宽:%d 高:%d\r\n",v4l2_width_,v4l2_height_); printf("像素宽:%d 高: %d\r\n",pixels_width_,pixels_height_); - printf("resolution_:%d\r\n", resolution_); printf("color_mode_:%d\r\n", color_mode_); printf("paper_size_:%d\r\n", paper_size_); printf("paper_size_:%d\r\n", paper_size_); @@ -1104,7 +1086,7 @@ void MultiFrameCapture::creatcorrectconfig(int dpi, int mode) if (m_glue.m_deviceevent) m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); - int config_dpi = resolution_ == DPI_600 ? 3 : 2; + int config_dpi = resolution_; int config_color = color_mode_ ==COLOR ? 1:0; configFPGAParam(mode, dpi); @@ -1144,7 +1126,7 @@ void MultiFrameCapture::creatcorrectconfig(int dpi, int mode) std::this_thread::sleep_for(std::chrono::milliseconds(5)); isDone = saveLutImg(dpi, mode, false); // 0 color_black 1 color_white 2 gray_balck 3 gray_white video->HtCamStopVideoCapturing(); - this_thread::sleep_for(std::chrono::seconds(2)); + this_thread::sleep_for(std::chrono::milliseconds(200)); i++; } printf("creatcorrectconfig %s \n", (mode == IMAGE_COLOR ? " Color" : " Gray")); diff --git a/MultiFrameCapture.h b/MultiFrameCapture.h index a07b687..1a3d244 100644 --- a/MultiFrameCapture.h +++ b/MultiFrameCapture.h @@ -12,9 +12,10 @@ class Gpio; class GpioOut; #define WIDTH 5184 -#define HEIGHT 951 //只能为3的倍数 -#define DPI_600 0 -#define DPI_300 1 +#define HEIGHT 600 //只能为3的倍数 +#define DPI_600 3 +#define DPI_300 2 +#define DPI_200 1 #define COLOR 1 #define GRAY 0 typedef struct hg_tag_SIZE @@ -83,7 +84,7 @@ private: //void myFloodFill(cv::Mat& image, bool isTwoSide); private: - unsigned int resolution_; // 分辨率 //0:600dpi 1:300dpi + unsigned int resolution_; // 分辨率 //3:600dpi 2:300dpi 1:200dpi unsigned int v4l2_width_; // v4l2 图像宽 unsigned int v4l2_height_; // v4l2 图像高