From f670bc5342cd5faf5c4f00a7339d5e99be761890 Mon Sep 17 00:00:00 2001 From: modehua Date: Thu, 31 Aug 2023 01:37:05 -0700 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=95=B4=E4=BD=93=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CImageMerge.cpp | 233 ++++++++++--------- CImageMerge.h | 4 +- CMakeLists.txt | 5 + CameraParams.h | 20 +- DevUtil.h | 14 +- HCamDevice.cpp | 471 +++++++++++++++++---------------------- HCamDevice.h | 15 +- MultiFrameCapture.cpp | 505 +++++++++++++++++++++++++++--------------- MultiFrameCapture.h | 6 +- Scanner.cpp | 42 +++- Sensor.cpp | 95 ++++++-- Sensor.h | 5 +- UsbScanner.cpp | 1 + correct_ultis.cpp | 88 +++++++- correct_ultis.h | 6 + main.cpp | 78 ++----- scanservices_utils.h | 3 +- 17 files changed, 935 insertions(+), 656 deletions(-) diff --git a/CImageMerge.cpp b/CImageMerge.cpp index a172bed..4893827 100644 --- a/CImageMerge.cpp +++ b/CImageMerge.cpp @@ -8,117 +8,150 @@ CImageMerge::~CImageMerge() { } -cv::Mat CImageMerge::MergeImage(cv::Mat &srcMat, int dstwidth, int dstheight,int mode) +cv::Mat CImageMerge::MergeImage(cv::Mat &srcMat, int dstwidth, int dstheight, int mode, bool b7010) { - cv::Mat dst(srcMat.rows, srcMat.cols / (mode == 0 ? 1:3), CV_8UC(mode == 0 ? 1 : 3)); - auto graymerge = [](cv::Mat& src,cv::Mat dst)->cv::Mat + if (b7010) { - int width_block = src.cols / 12; - int heigh_block = src.rows; - - // 20 vsp 拼接算法 - // src(cv::Rect(width_block,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(0,0,width_block*2,heigh_block))); - // src(cv::Rect(0,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*2,0,width_block,heigh_block))); - // src(cv::Rect(width_block*3,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(width_block*4,0,width_block*2,heigh_block))); - // src(cv::Rect(width_block*5,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*3,0,width_block,heigh_block))); - - // src(cv::Rect(width_block*7,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(width_block*6,0,width_block*2,heigh_block))); - // src(cv::Rect(width_block*6,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*8,0,width_block,heigh_block))); - // src(cv::Rect(width_block*9,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(width_block*10,0,width_block*2,heigh_block))); - // src(cv::Rect(width_block*11,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*9,0,width_block,heigh_block))); - //return dst; - - // 45 vsp 拼接算法 - src(cv::Rect(0,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(width_block,0,width_block*2,heigh_block))); - src(cv::Rect(width_block*2,0,width_block,heigh_block)).copyTo(dst(cv::Rect(0,0,width_block,heigh_block))); - src(cv::Rect(width_block*3,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*5,0,width_block,heigh_block))); - src(cv::Rect(width_block*4,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(width_block*3,0,width_block*2,heigh_block))); - - src(cv::Rect(width_block*6,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(width_block*7,0,width_block*2,heigh_block))); - src(cv::Rect(width_block*8,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*6,0,width_block,heigh_block))); - src(cv::Rect(width_block*9,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*11,0,width_block,heigh_block))); - src(cv::Rect(width_block*10,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(width_block*9,0,width_block*2,heigh_block))); - return dst; - - }; - //cv::imwrite("org.jpg",srcMat); - if (!srcMat.empty()) - { - if(mode == 0)//灰度模式 - return graymerge(srcMat,dst); - - std::vector ch_mats; - int blockcnt = 12; - int spitWidth = srcMat.cols / blockcnt; - cv::Mat retMat(srcMat.rows, srcMat.cols / 3, CV_8UC3); - for (int i = 0; i < 4; i++) + //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 (i < 2) - { - ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 1), 0, spitWidth, srcMat.rows))); - ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 2), 0, spitWidth, srcMat.rows))); - ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 0), 0, spitWidth, srcMat.rows))); - } - else - { - ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 1), 0, spitWidth, srcMat.rows))); - ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 0), 0, spitWidth, srcMat.rows))); - ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 2), 0, spitWidth, srcMat.rows))); - } - cv::merge(ch_mats, retMat(cv::Rect(spitWidth * i, 0, spitWidth, srcMat.rows))); - ch_mats.clear(); + matdst = srcMat; } - return graymerge(retMat,dst); - } - return srcMat; -} + else + { + // To do: merge color image, notice image rgb channels order, + // opencv Mat default channels order is B G R -cv::Mat CImageMerge::MergeImage(bool iscolor, cv::Mat &srcMat, int dstwidth, int dstheight) -{ - int blockcnt = 12; - int spitWidth = srcMat.cols / blockcnt; - int abortwidth; // = spitWidth == 3888 ? 432 : (spitWidth == 2592 ? 216 : 144); - if (!iscolor) // 灰度 - { - abortwidth = spitWidth == 1296 ? 432 : (spitWidth == 648 ? 216 : 144); + /*TEMP MERGE ALGORITHM*/ + int width = srcMat.cols / 3; + int height = srcMat.rows; + cv::Mat m_dst(height, width, CV_8UC(3)); + std::vector m_items; + std::vector index = {0, 2, 1}; + for (size_t i = 0; i < 3; i++) + { + cv::Mat t_item(srcMat(cv::Rect(width * index[i], 0, width, height))); + m_items.push_back(t_item); + } + cv::merge(m_items, m_dst); + matdst = m_dst; + } + return matdst; } else { - abortwidth = spitWidth == 3888 ? 432 : (spitWidth == 1944 ? 216 : 144); - } - - cv::Mat dst(dstheight, dstwidth - abortwidth * 2, CV_8UC(iscolor ? 3 : 1)); - if (!iscolor) - { - for (int i = 0; i < 2; i++) + cv::Mat dst(srcMat.rows, srcMat.cols / (mode == 0 ? 1 : 3), CV_8UC(mode == 0 ? 1 : 3)); + auto graymerge = [](cv::Mat &src, cv::Mat dst) -> cv::Mat { - srcMat(cv::Rect((dstwidth / 2 + abortwidth) * i, 0, dstwidth / 2 - abortwidth, dstheight)).copyTo(dst(cv::Rect(dst.cols / 2 * i, 0, dst.cols / 2, dstheight))); - } - srcMat.release(); - return dst; - } - else - { - std::vector m_splits; - std::vector m_index = {1, 4, 7, 10, 2, 5, 6, 9, 0, 3, 8, 11}; + int width_block = src.cols / 12; + int heigh_block = src.rows; - for (int i = 0; i < 3; i++) + // 20 vsp 拼接算法 + // src(cv::Rect(width_block,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(0,0,width_block*2,heigh_block))); + // src(cv::Rect(0,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*2,0,width_block,heigh_block))); + // src(cv::Rect(width_block*3,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(width_block*4,0,width_block*2,heigh_block))); + // src(cv::Rect(width_block*5,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*3,0,width_block,heigh_block))); + + // src(cv::Rect(width_block*7,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(width_block*6,0,width_block*2,heigh_block))); + // src(cv::Rect(width_block*6,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*8,0,width_block,heigh_block))); + // src(cv::Rect(width_block*9,0,width_block*2,heigh_block)).copyTo(dst(cv::Rect(width_block*10,0,width_block*2,heigh_block))); + // src(cv::Rect(width_block*11,0,width_block,heigh_block)).copyTo(dst(cv::Rect(width_block*9,0,width_block,heigh_block))); + // return dst; + + // 45 vsp 拼接算法 + src(cv::Rect(0, 0, width_block * 2, heigh_block)).copyTo(dst(cv::Rect(width_block, 0, width_block * 2, heigh_block))); + src(cv::Rect(width_block * 2, 0, width_block, heigh_block)).copyTo(dst(cv::Rect(0, 0, width_block, heigh_block))); + src(cv::Rect(width_block * 3, 0, width_block, heigh_block)).copyTo(dst(cv::Rect(width_block * 5, 0, width_block, heigh_block))); + src(cv::Rect(width_block * 4, 0, width_block * 2, heigh_block)).copyTo(dst(cv::Rect(width_block * 3, 0, width_block * 2, heigh_block))); + + src(cv::Rect(width_block * 6, 0, width_block * 2, heigh_block)).copyTo(dst(cv::Rect(width_block * 7, 0, width_block * 2, heigh_block))); + src(cv::Rect(width_block * 8, 0, width_block, heigh_block)).copyTo(dst(cv::Rect(width_block * 6, 0, width_block, heigh_block))); + src(cv::Rect(width_block * 9, 0, width_block, heigh_block)).copyTo(dst(cv::Rect(width_block * 11, 0, width_block, heigh_block))); + src(cv::Rect(width_block * 10, 0, width_block * 2, heigh_block)).copyTo(dst(cv::Rect(width_block * 9, 0, width_block * 2, heigh_block))); + return dst; + }; + // cv::imwrite("org.jpg",srcMat); + if (!srcMat.empty()) { - int startindex = i == 0 ? 0 : (i == 1 ? 4 : 8); - cv::Mat t_mat(dstheight, dstwidth - abortwidth * 2, CV_8UC1); - srcMat(cv::Rect(spitWidth * m_index[startindex + 0], 0, spitWidth, dstheight)).copyTo(t_mat(cv::Rect(0, 0, spitWidth, dstheight))); - srcMat(cv::Rect(spitWidth * m_index[startindex + 1], 0, spitWidth - abortwidth, dstheight)).copyTo(t_mat(cv::Rect(spitWidth, 0, spitWidth - abortwidth, dstheight))); - srcMat(cv::Rect(spitWidth * m_index[startindex + 2] + abortwidth, 0, spitWidth - abortwidth, dstheight)).copyTo(t_mat(cv::Rect(spitWidth * 2 - abortwidth, 0, spitWidth - abortwidth, dstheight))); - srcMat(cv::Rect(spitWidth * m_index[startindex + 3], 0, spitWidth, dstheight)).copyTo(t_mat(cv::Rect(spitWidth * 3 - abortwidth * 2, 0, spitWidth, dstheight))); - m_splits.push_back(t_mat); + if (mode == 0) // 灰度模式 + return graymerge(srcMat, dst); + + std::vector ch_mats; + int blockcnt = 12; + int spitWidth = srcMat.cols / blockcnt; + cv::Mat retMat(srcMat.rows, srcMat.cols / 3, CV_8UC3); + for (int i = 0; i < 4; i++) + { + if (i < 2) + { + ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 1), 0, spitWidth, srcMat.rows))); + ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 2), 0, spitWidth, srcMat.rows))); + ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 0), 0, spitWidth, srcMat.rows))); + } + else + { + ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 1), 0, spitWidth, srcMat.rows))); + ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 0), 0, spitWidth, srcMat.rows))); + ch_mats.push_back(srcMat(cv::Rect(spitWidth * (i * 3 + 2), 0, spitWidth, srcMat.rows))); + } + cv::merge(ch_mats, retMat(cv::Rect(spitWidth * i, 0, spitWidth, srcMat.rows))); + ch_mats.clear(); + } + return graymerge(retMat, dst); } - cv::merge(m_splits, dst); - m_splits.clear(); + return srcMat; } - srcMat.release(); - return dst; } +// cv::Mat CImageMerge::MergeImage(bool iscolor, cv::Mat &srcMat, int dstwidth, int dstheight) +// { +// { +// int blockcnt = 12; +// int spitWidth = srcMat.cols / blockcnt; +// int abortwidth; // = spitWidth == 3888 ? 432 : (spitWidth == 2592 ? 216 : 144); +// if (!iscolor) // 灰度 +// { +// abortwidth = spitWidth == 1296 ? 432 : (spitWidth == 648 ? 216 : 144); +// } +// else +// { +// abortwidth = spitWidth == 3888 ? 432 : (spitWidth == 1944 ? 216 : 144); +// } + +// cv::Mat dst(dstheight, dstwidth - abortwidth * 2, CV_8UC(iscolor ? 3 : 1)); +// if (!iscolor) +// { +// for (int i = 0; i < 2; i++) +// { +// srcMat(cv::Rect((dstwidth / 2 + abortwidth) * i, 0, dstwidth / 2 - abortwidth, dstheight)).copyTo(dst(cv::Rect(dst.cols / 2 * i, 0, dst.cols / 2, dstheight))); +// } +// srcMat.release(); +// return dst; +// } +// else +// { +// std::vector m_splits; +// std::vector m_index = {1, 4, 7, 10, 2, 5, 6, 9, 0, 3, 8, 11}; + +// for (int i = 0; i < 3; i++) +// { +// int startindex = i == 0 ? 0 : (i == 1 ? 4 : 8); +// cv::Mat t_mat(dstheight, dstwidth - abortwidth * 2, CV_8UC1); +// srcMat(cv::Rect(spitWidth * m_index[startindex + 0], 0, spitWidth, dstheight)).copyTo(t_mat(cv::Rect(0, 0, spitWidth, dstheight))); +// srcMat(cv::Rect(spitWidth * m_index[startindex + 1], 0, spitWidth - abortwidth, dstheight)).copyTo(t_mat(cv::Rect(spitWidth, 0, spitWidth - abortwidth, dstheight))); +// srcMat(cv::Rect(spitWidth * m_index[startindex + 2] + abortwidth, 0, spitWidth - abortwidth, dstheight)).copyTo(t_mat(cv::Rect(spitWidth * 2 - abortwidth, 0, spitWidth - abortwidth, dstheight))); +// srcMat(cv::Rect(spitWidth * m_index[startindex + 3], 0, spitWidth, dstheight)).copyTo(t_mat(cv::Rect(spitWidth * 3 - abortwidth * 2, 0, spitWidth, dstheight))); +// m_splits.push_back(t_mat); +// } +// cv::merge(m_splits, dst); +// m_splits.clear(); +// } +// srcMat.release(); +// return dst; +// } +// } + cv::Mat CImageMerge::MergeFrames(std::vector frames, int type, int dpi) { if (frames.empty()) @@ -132,10 +165,10 @@ cv::Mat CImageMerge::MergeFrames(std::vector frames, int type, int dpi) cv::Mat matdst(dstH, dstwidth, CV_8UC(type == 1 ? 3 : 1)); for (int i = 0; i < size; i++) { - auto itemimg = frames[i]; - itemimg = MergeImage(type, itemimg, dstwidth + abortwidth, itemimg.rows); - itemimg.copyTo(matdst(cv::Rect(0, itemimg.rows * i, itemimg.cols, itemimg.rows))); - itemimg.release(); + // auto itemimg = frames[i]; + // itemimg = MergeImage(type, itemimg, dstwidth + abortwidth, itemimg.rows); + // itemimg.copyTo(matdst(cv::Rect(0, itemimg.rows * i, itemimg.cols, itemimg.rows))); + // itemimg.release(); } return matdst; } \ No newline at end of file diff --git a/CImageMerge.h b/CImageMerge.h index a177d60..2d77d27 100644 --- a/CImageMerge.h +++ b/CImageMerge.h @@ -9,7 +9,7 @@ public: CImageMerge(/* args */); ~CImageMerge(); public: - cv::Mat MergeImage(cv::Mat& srcMat,int dstwidth,int dstheight,int mode); - cv::Mat MergeImage(bool iscolor,cv::Mat& srcMat,int dstwidth,int dstheight); + cv::Mat MergeImage(cv::Mat& srcMat,int dstwidth,int dstheight,int mode,bool b7010=false); + //cv::Mat MergeImage(bool iscolor,cv::Mat& srcMat,int dstwidth,int dstheight); cv::Mat MergeFrames(std::vector frames, int type, int dpi); }; diff --git a/CMakeLists.txt b/CMakeLists.txt index 848bf59..1cc394d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,6 +28,11 @@ set(-mfloat-abi=hard) # set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) +# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O1 -fvectorize") +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O1 -fvectorize") + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") set(OpenCV_DIR /home/modehua/sdk/sysroots/cortexa9t2hf-neon-xilinx-linux-gnueabi/usr/include/opencv4/) #set(OpenCV_DIR /home/holdtecs/zzm-linux/fs/usr/lib) diff --git a/CameraParams.h b/CameraParams.h index 3bd92d7..245b400 100644 --- a/CameraParams.h +++ b/CameraParams.h @@ -49,7 +49,7 @@ union CamZ_Reg_4_New unsigned int unuse_0 : 2; unsigned int color_mode : 1; unsigned int en_frameset:1;//帧计数只能 - unsigned int unuse_1 : 8; + unsigned int unuse_1 : 9; unsigned int en_adc1_cfg:1; //使能ADC 配置 脉冲有效(写低写高) unsigned int en_adc2_cfg:1; //使能ADC 配置 脉冲有效(写低写高) unsigned int clr_exp:1; //曝光清除 低电平 有效 @@ -74,6 +74,24 @@ union CamZ_Reg_A_New }; }; + +union SCAN_PWM +{ + int value; + struct + { + unsigned int reserved_1:1; + unsigned int scan_pwm_enble : 1; + unsigned int scan_pwm_start : 1; + unsigned int scan_pwm_timer_runs :1; + unsigned int scan_pwm_enble_o : 1; + unsigned int scan_pwm_input_clear :1; + unsigned int reserved_2:1; + unsigned int scan_pwm_reset :1 ; + }bit; + +}; + union CamZ_Reg_A { int value; diff --git a/DevUtil.h b/DevUtil.h index 9b6cad8..117883f 100644 --- a/DevUtil.h +++ b/DevUtil.h @@ -29,10 +29,10 @@ enum PIN_PORT_7010 HAVE_OR_NO_PAPER = 3 + 1019, //有无纸(0:无纸,1:有纸) OPEN_COVER_SENSOR = 4 + 1019, //是否开盖(0:未开盖,1:开盖) - ULTRASONIC_SENSORS_OUT0 = 18 + 1019, - ULTRASONIC_SENSORS_OUT1 = 17 + 1019, - ULTRASONIC_SENSORS_ON = 20 + 1019, - ULTRASONIC_SENSORS_ADJ = 19 + 1019, + ULTRASONIC_SENSORS_OUT0 = 18 + 901, + ULTRASONIC_SENSORS_OUT1 = 17 + 901, + ULTRASONIC_SENSORS_ON = 20 + 901, + ULTRASONIC_SENSORS_ADJ = 19 + 901, //通道0-------------END SENSOR_POWER = 66 + 1019, @@ -149,10 +149,10 @@ class DeviceExport public: DeviceExport(); private: - const int ports[14] = { MOTOR_POWER_1, CUOZHI_PIN_RESET, CUOZHI_PIN_SLEEP,CUOZHI_PIN_ENABEL, CUOZHI_PIN_DIR, + const int ports[17] = { MOTOR_POWER_1, CUOZHI_PIN_RESET, CUOZHI_PIN_SLEEP,CUOZHI_PIN_ENABEL, CUOZHI_PIN_DIR, MOTOR_POWER_2, ZOUZHI_PIN_RESET, ZOUZHI_PIN_SLEEP,ZOUZHI_PIN_ENABEL, ZOUZHI_PIN_DIR, - SCAN_SENSOR,HAVE_OR_NO_PAPER, OPEN_COVER_SENSOR,}; + SCAN_SENSOR,HAVE_OR_NO_PAPER, OPEN_COVER_SENSOR,ULTRASONIC_SENSORS_OUT0,ULTRASONIC_SENSORS_OUT1,ULTRASONIC_SENSORS_ON}; - const int pwms[4] = { 0, 1 ,2}; + const int pwms[3] = { 0, 1 ,2}; }; diff --git a/HCamDevice.cpp b/HCamDevice.cpp index 324d9c8..4a7b744 100644 --- a/HCamDevice.cpp +++ b/HCamDevice.cpp @@ -112,11 +112,12 @@ HCamDevice::HCamDevice() uint8_t val = 0; - for (int i = 0; i < 20; i++) - { - HtCamReadADCReg(i, &val); - camera_print("ADDR: 0x%x, Value: 0x%x\n", i, val); - } + HtCamSetdivder(true); + + unsigned int prriod[2] = {0x183C,0x183C/2}; + HtCamSetPeriod(prriod); + HtCamWriteFpgaRegs(17, 0x04ce99ff); //扫描传感器阈值 + HtCamSetDpi(1); //设置默认300dpi HtCamSetClolr(0);//设置默认灰色模式 @@ -143,6 +144,10 @@ HCamDevice::HCamDevice() value = value & 0xffffff00; HtCamWriteFpgaRegs(16, VSNP | value); } + + HtCamWriteFpgaRegs(16, 0x0B0B); //相位 + + //HtCamChangeTriggerInAndEXt(1); HtCamInitADCReg(); @@ -151,6 +156,12 @@ HCamDevice::HCamDevice() //devmem 0x40010040 32 0x00000B00 //灰度模式 VSNP值 0x10 //this->event_thread.reset(new std::thread(&HCamDevice::HtCamEventWorkThread, this)); + for (int i = 0; i < 20; i++) + { + //HtCamReadADCReg(i, &val); + HtCamReadADCReg_ALL(i); + //camera_print("ADDR: 0x%x, Value: 0x%x\n", i, val); + } } HCamDevice::~HCamDevice() @@ -254,7 +265,51 @@ void HCamDevice::set_width_hegith(int width,int hegith) v4lWidth = width; v4lHeight = hegith; } +void HCamDevice::HtCamSetdivder(bool is_enble) +{ + if (virBaseAddr == NULL) + { + return ; + } + uint32_t *pCamCtrlReg = virBaseAddr; + CamZ_Reg_2Short rgb; + + rgb.value = HtCamReadFpgaRegs(0x08); + + // SCAN_PWM scan; + // scan.value = rgb.NShort[0]; + + // scan.bit.scan_pwm_enble = is_enble;//1是关,0是开 + + // ////下面全是默认值 。FPGA 这边数据不准确,所以重新写一下 + // scan.bit.scan_pwm_start = 1; + // scan.bit.scan_pwm_timer_runs = 1; + // scan.bit.scan_pwm_enble_o = 1; + // scan.bit.scan_pwm_input_clear = 0; + // scan.bit.scan_pwm_reset =0; + uint32_t r = 0x0001001e; + if (!is_enble) + r=0x0001001F; + rgb.NShort[0] = r; + + rgb.NShort[1] = 0x0001; + HtCamWriteFpgaRegs(0x08,rgb.value); +} +void HCamDevice::HtCamSetPeriod(uint32_t *reg_value) +{ + if (virBaseAddr == NULL) + { + return ; + } + uint32_t *pCamCtrlReg = virBaseAddr; + + CamZ_Reg_2Short rgb; + rgb.value = HtCamReadFpgaRegs(0x09); + rgb.NShort[0] = reg_value[0]; //周期参数是占空比两倍 + rgb.NShort[1] = reg_value[1]; //占空比 + HtCamWriteFpgaRegs(0x09,rgb.value); +} int HCamDevice::HtCamEventWorkThread(void) { struct pollfd pfd; @@ -344,7 +399,7 @@ void HCamDevice::HtCamStartVideoCapturing() else { ((CAM_INFO_REG *)&pPsReg[CAM_INFO])->cam_run_status = 1; - camera_print(" stream on succeed\n"); + //camera_print(" stream on succeed\n"); } startFPGAScan(); return; @@ -431,7 +486,7 @@ int HCamDevice::HtCamReadCaptureFrame(void **pbuf, int timeout) int ret = 0; if (( ret = ioctl(videofd, VIDIOC_DQBUF, &buf)) == 0) //这个地方入栈失败好像下面就都不用操作了 ??? 毕竟已经丢帧了算 { - camera_print("*****DQBUF[%d] FINISH*****\n", buf.index); + camera_dbg("*****DQBUF[%d] FINISH*****\n", buf.index); } else { @@ -440,7 +495,7 @@ int HCamDevice::HtCamReadCaptureFrame(void **pbuf, int timeout) } if (ioctl(videofd, VIDIOC_QBUF, &buf) == 0) //出栈一样 { - camera_print("************QBUF[%d] FINISH**************\n", buf.index); + camera_dbg("************QBUF[%d] FINISH**************\n", buf.index); } else { @@ -574,45 +629,6 @@ int HCamDevice::HtCamStopSampling() return 0; } -int HCamDevice::init_fd() -{ - // int fd; - // void *map_base; - - // if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) < 0) - // { - // camera_dbg("Cannot open /dev/mem \n"); - // return -1; - // } - // memfd = fd; - - // map_base = mmap(NULL, AddrMapSize, PROT_READ | PROT_WRITE, MAP_SHARED, memfd, phyBaseAddr); - - - // if (map_base == NULL) - // { - // camera_dbg("Cannot mmap addr \n"); - // close(fd); - // return -1; - // } - // virBaseAddr = (uint32_t *)map_base; - - // if ((fd = open(videoDevName.c_str(), O_RDWR, 0)) == -1) - // { - // camera_dbg("Ht Cam Cannot open video file\n"); - // return -1; - // } - // videofd = fd; - - // if ((fd = open(subDeviceName.c_str(), O_RDWR, 0)) == -1) - // { - // camera_dbg("t Cam Cannot open subdevice file\n"); - // return -1; - // } - // subDevicefd = fd; - // return 1; -} - int HCamDevice::init_sample() { struct v4l2_subdev_format subdev_fmt; @@ -806,56 +822,7 @@ int HCamDevice::init_video_buffer() return 1; } -int HCamDevice::init_dev() -{ - // v4lWidth=5184; - // v4lHeight=2; - init_fd();//申请内存空间,打开文件 - init_sample();//重置 - init_capture(); - - init_video_buffer(); - // TestPattern 1 - HtCamSwitchSampleModes(0); - // HtCamChangeExposureValue(500); //曝光 - // start sample - camera_dbg("ST SP : %d , VSNP : %d \r\n" , ST_SP , VSNP); - - HtCamChangeMonoStartSample(200 * 3 + ST_SP_VSNP); - - // if( ST_SP != 0 || ST_SP_VSNP != 0) - // HtCamChangeMonoStartSample( ST_SP * 3 + ST_SP_VSNP); - if( VSNP != 0) - { - unsigned int value = HtCamReadFpgaRegs(16); - value=0; - value = value & 0xffffff00; - HtCamWriteFpgaRegs(16, VSNP | value); - } - - - - - // CamZ_Reg_4 reg_4; - // reg_4.value=HtCamReadFpgaRegs(0x04); - // reg_4.en_pattern = 1; - // HtCamWriteFpgaRegs(0x04,reg_4.value); - - - // CamZ_Reg_A reg_a; - // reg_a.value=HtCamReadFpgaRegs(0x0A); - // reg_a.DPI = 0; - // HtCamWriteFpgaRegs(0x0A,reg_a.value); - - HtCamSetDpi(0); - // ex_trigger = 0, int_trigger = 1 - HtCamChangeTriggerInAndEXt(1); - - HtCamInitADCReg(); - HtCamWriteAllADC(); - return 0; -} void HCamDevice::HtCamSwitchSampleModes(uint8_t mode) { @@ -871,23 +838,6 @@ void HCamDevice::HtCamSwitchSampleModes(uint8_t mode) pCamCtrlReg[4] |= (0x00020000); } -void HCamDevice::HtCamChangeExposureValueF(uint32_t* value) -{ - if (virBaseAddr == NULL) - { - return ; - } - uint32_t *pCamCtrlReg = virBaseAddr; - pCamCtrlReg[5] = value[0]; - - 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) { if (virBaseAddr == NULL) @@ -895,20 +845,69 @@ void HCamDevice::HtCamChangeExposureValueB(uint32_t* value) return ; } uint32_t *pCamCtrlReg = virBaseAddr; - pCamCtrlReg[11] = value[0]; + pCamCtrlReg[5] = value[1]<<16;//G 通道 + std::this_thread::sleep_for(std::chrono::milliseconds(5)); CamZ_Reg_2Short rgb; - rgb.value = HtCamReadFpgaRegs(0x0C); - rgb.NShort[0] = value[1]; - rgb.NShort[1] = value[2]; - HtCamWriteFpgaRegs(0x0C,rgb.value); + rgb.value = HtCamReadFpgaRegs(0x06); + rgb.NShort[0] = value[0]; // R通道 + rgb.NShort[1] = value[2]; //B 通道 + HtCamWriteFpgaRegs(0x06,rgb.value); + + + // pCamCtrlReg[5] = 0x00000000; + // pCamCtrlReg[6] = 0x00000000; + + // pCamCtrlReg[5] |= (uint32_t)(value[1]); // RED + // std::this_thread::sleep_for(std::chrono::milliseconds(5)); + // pCamCtrlReg[5] |= (uint32_t)(value[1] << 16); + // std::this_thread::sleep_for(std::chrono::milliseconds(5)); + // pCamCtrlReg[6] |= (uint32_t)(value[0]); // GREEN + // std::this_thread::sleep_for(std::chrono::milliseconds(5)); + // pCamCtrlReg[6] |= ((uint32_t)value[2] << 16); // BLUE + + + + std::this_thread::sleep_for(std::chrono::milliseconds(5)); printf("曝光B R:%d G:%d B:%d \r\n",value[0],value[1],value[2]); } +void HCamDevice::HtCamChangeExposureValueF(uint32_t* value) +{ + if (virBaseAddr == NULL) + { + return ; + } + uint32_t *pCamCtrlReg = virBaseAddr; + pCamCtrlReg[11] = value[1] << 16;//G 通道 + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + CamZ_Reg_2Short rgb; + rgb.value = HtCamReadFpgaRegs(0x0C); + rgb.NShort[0] = value[0];// R通道 + rgb.NShort[1] = value[2]; //B 通道 + HtCamWriteFpgaRegs(0x0C,rgb.value); + + // pCamCtrlReg[11] = 0x00000000; + // pCamCtrlReg[12] = 0x00000000; + + // pCamCtrlReg[11] |= (uint32_t)(value[1]); // RED + // std::this_thread::sleep_for(std::chrono::milliseconds(5)); + // pCamCtrlReg[11] |= (uint32_t)(value[1] << 16); + // std::this_thread::sleep_for(std::chrono::milliseconds(5)); + + // pCamCtrlReg[12] |= (uint32_t)(value[0]); // GREEN + // std::this_thread::sleep_for(std::chrono::milliseconds(5)); + // pCamCtrlReg[12] |= ((uint32_t)value[2] << 16); // BLUE + + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + printf("曝光F 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 ; @@ -920,7 +919,7 @@ void HCamDevice::HtCamWriteADCReg_ALL(bool is_gain,bool is_adc1,uint8_t addr, ui else addr += 0x0e; //偏移 - printf("%s 地址 :%d 值%d \r\n",is_gain?"增益":"偏移",addr,data); + //printf("%s 地址 :%d 值%d \r\n",is_gain?"增益":"偏移",addr,data); uint32_t *pCamCtrlReg = virBaseAddr; uint32_t AdcRegFrame = 0x0000; @@ -943,38 +942,36 @@ void HCamDevice::HtCamWriteADCReg_ALL(bool is_gain,bool is_adc1,uint8_t addr, ui if (is_adc1) //adc 1 { pCamCtrlReg[7] = (uint32_t)AdcRegFrame; - - pCamCtrlReg[4] &= ~(EnableAdc1Write); + pCamCtrlReg[4] &= ~(EnableAdc2Write); std::this_thread::sleep_for(std::chrono::milliseconds(1)); - pCamCtrlReg[4] |= (EnableAdc1Write); + pCamCtrlReg[4] |= (EnableAdc2Write); std::this_thread::sleep_for(std::chrono::milliseconds(1)); } else // adc2 { pCamCtrlReg[0] = (uint32_t)AdcRegFrame; - pCamCtrlReg[4] &= ~(EnableAdc2Write); + pCamCtrlReg[4] &= ~(EnableAdc1Write); std::this_thread::sleep_for(std::chrono::milliseconds(1)); - pCamCtrlReg[4] |= (EnableAdc2Write); + pCamCtrlReg[4] |= (EnableAdc1Write); std::this_thread::sleep_for(std::chrono::milliseconds(1)); } } + + void HCamDevice::HtCamWriteADCReg(uint8_t addr, uint8_t data) { - if (virBaseAddr == NULL) - { - return ; - } uint32_t *pCamCtrlReg = virBaseAddr; uint32_t AdcRegFrame = 0x0000; - uint32_t EnableAdc1Write = 0x4000; - uint32_t EnableAdc2Write = 0x2000; + + uint32_t EnableAdc1Write = 0x2000; //adc1使能 + uint32_t EnableAdc2Write = 0x4000; //adc2使能 adcTiming *pAdcRegFrame = (adcTiming *)&AdcRegFrame; // if (addr > 20) // return; - pADCReg[addr] = data; + pADCReg[data] = addr; pAdcRegFrame->rwbit = 0; pAdcRegFrame->regAddr = addr; pAdcRegFrame->regData = data; @@ -983,13 +980,14 @@ void HCamDevice::HtCamWriteADCReg(uint8_t addr, uint8_t data) pAdcRegFrame->regAddr1 = addr; pAdcRegFrame->regData1 = data; - pCamCtrlReg[7] = (uint32_t)AdcRegFrame; + pCamCtrlReg[7] = (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)); + pCamCtrlReg[0] = (uint32_t)AdcRegFrame; pCamCtrlReg[4] &= ~(EnableAdc1Write); @@ -1000,38 +998,61 @@ void HCamDevice::HtCamWriteADCReg(uint8_t addr, uint8_t data) -// void HCamDevice::HtCamReadADCReg_ALL(booluint8_t addr, uint8_t *data) -// { -// if (virBaseAddr == NULL) -// { -// return ; -// } +void HCamDevice::HtCamReadADCReg_ALL(uint8_t addr) +{ + if (virBaseAddr == NULL) + return ; + + //printf("read addr :%0x\r\n",addr); + uint32_t *pCamCtrlReg = virBaseAddr; + + uint32_t EnableAdcWrite1 = (1 << 14); + uint32_t EnableAdcWrite2 = (1 << 13); + CIS_ADC_NEW pAdcRegFrame ; + + // if (addr > 20) + // return; + + 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[0] = pAdcRegFrame.value; + + pCamCtrlReg[4] &= ~(EnableAdcWrite2); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + pCamCtrlReg[4] |= (EnableAdcWrite2); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + pAdcRegFrame.value = HtCamReadFpgaRegs(0x00); + -// uint32_t *pCamCtrlReg = virBaseAddr; -// uint32_t AdcRegFrame = 0x0000; -// uint32_t EnableAdcWrite = (1 << 14); -// uint32_t tempData; -// adcTiming *pAdcRegFrame = (adcTiming *)&AdcRegFrame; + // printf("pAdcRegFrame->value 1111:%0x\r\n",pAdcRegFrame.value); + // printf("pAdcRegFrame->11111 :%d\r\n",pAdcRegFrame.bit.regData); -// // if (addr > 0x14) -// // return; -// pAdcRegFrame->rwbit = 1; -// pAdcRegFrame->regAddr = addr; -// pAdcRegFrame->regData = 0; -// pAdcRegFrame->rwbit1 = 1; -// pAdcRegFrame->regAddr1 = addr; -// pAdcRegFrame->regData1 = 0; + pCamCtrlReg[7] = pAdcRegFrame.value; -// 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)); + pCamCtrlReg[4] &= ~(EnableAdcWrite1); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + pCamCtrlReg[4] |= (EnableAdcWrite1); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + pAdcRegFrame.value = HtCamReadFpgaRegs(0x07); -// tempData = pCamCtrlReg[2]; -// uint8_t value = (tempData >> 4) & (0xFF); -// (*data) = value; -// } + // printf("pAdcRegFrame->value 2222:%0x\r\n",pAdcRegFrame.value); + // printf("pAdcRegFrame->regData2222 :%d\r\n",pAdcRegFrame.bit.regData); + + CamZ_Reg_2Short rgb; + rgb.value = HtCamReadFpgaRegs(0x01); + CIS_ADC_NEW c ,b; + c.value = rgb.NShort[0]; + b.value = rgb.NShort[1]; + + printf("adc1 data:[%d] adc2 data:[%d]\r\n",b.bit.regData , c.bit.regData); +} void HCamDevice::HtCamReadADCReg(uint8_t addr, uint8_t *data) { @@ -1042,7 +1063,7 @@ void HCamDevice::HtCamReadADCReg(uint8_t addr, uint8_t *data) uint32_t *pCamCtrlReg = virBaseAddr; uint32_t AdcRegFrame = 0x0000; - uint32_t EnableAdcWrite = (1 << 14); + uint32_t EnableAdcWrite = (1 << 16); uint32_t tempData; CIS_ADC_NEW pAdcRegFrame ; @@ -1056,29 +1077,30 @@ void HCamDevice::HtCamReadADCReg(uint8_t addr, uint8_t *data) pAdcRegFrame.bit.regData1 = 0; 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)); pAdcRegFrame.value = HtCamReadFpgaRegs(0x07); - printf("pAdcRegFrame->value:%0x\r\n",pAdcRegFrame.value); + printf("pAdcRegFrame->value:%0x addr:%d \r\n",pAdcRegFrame.value,addr); printf("pAdcRegFrame->regData :%d\r\n",pAdcRegFrame.bit.regData); } uint8_t HCamDevice::getADCReg(int addr) { - if(addr > adcRegSize) - return 0 ; - return pADCReg[addr]; + // if(addr > adcRegSize) + // return 0 ; + // return pADCReg[addr]; } void HCamDevice::setADCReg(int addr , uint8_t value) { - if(addr > adcRegSize) - return ; - pADCReg[addr] = value ; + // if(addr > adcRegSize) + // return ; + // pADCReg[addr] = value ; } // void HCamDevice::saveADCReg() @@ -1116,6 +1138,7 @@ void HCamDevice::HtCamSetSpTime(uint32_t reg_value,uint32_t val) sp_time.NShort[1] = reg_value; sp_time.NShort[0] = val; HtCamWriteFpgaRegs(0x03 , sp_time.value); + printf("-----------------------灰度内触发:[%d] 读写间隔:[%d]------------------ \r\n",reg_value,val); } void HCamDevice::HtCamGetSpTime(uint32_t ®_value) { @@ -1123,6 +1146,11 @@ void HCamDevice::HtCamGetSpTime(uint32_t ®_value) sp_time.value = HtCamReadFpgaRegs(0x03); reg_value = sp_time.NShort[1]; } +void HCamDevice::HtCamSetSpTime2(uint32_t reg_value) +{ + HtCamWriteFpgaRegs(0x13 , reg_value); + printf("-----------------------彩色内触发:[%d]\r\n",reg_value); +} void HCamDevice::HtCamSetStSp(int start_smaple) { @@ -1139,6 +1167,7 @@ void HCamDevice::HtCamSetStSp(int start_smaple) st_sp.NShort[1] = start_smaple; //灰色 2023-8-3 HtCamWriteFpgaRegs(0x0d , st_sp.value); + printf(" -----------------------st_sp%d------------------\r\n",start_smaple); } void HCamDevice::HtCamGetStSp(uint32_t &start_smaple) @@ -1150,12 +1179,11 @@ void HCamDevice::HtCamGetStSp(uint32_t &start_smaple) void HCamDevice::HtCamSetVsnpTime(int color) { - HtCamWriteFpgaRegs(0x10,color?0xD0D0:0xD0D0); - //uint32_t *pCamCtrlReg = virBaseAddr; - //uint32_t ss = start_sample; - - //pCamCtrlReg[20] &= ~(0xFFFF0000); // clear - //pCamCtrlReg[20] |= (uint32_t)(ss << 16); + CamZ_Reg_2Short st_sp; + st_sp.value = HtCamReadFpgaRegs(0x10); + st_sp.NShort[0] = color; + st_sp.NShort[1] = 0; + HtCamWriteFpgaRegs(0x10 , st_sp.value); } void HCamDevice::HtCamSetFrameCnt(uint32_t val) { @@ -1167,7 +1195,7 @@ void HCamDevice::HtCamSetFrameCnt(uint32_t val) void HCamDevice::HtCamGetFrameCnt(uint32_t &val) { val = HtCamReadFpgaRegs(0x14); - camera_print("HtCamGetFrameCnt:%d\r\n",val); + //camera_print("HtCamGetFrameCnt:%d\r\n",val); } void HCamDevice::HtCamGetFrameNum(uint32_t &val) @@ -1241,6 +1269,7 @@ void HCamDevice::HtCamSetClolr(int color) reg_4.value=HtCamReadFpgaRegs(0x04); reg_4.color_mode = color; reg_4.en_frameset = 1; //帧计数默认开启 + reg_4.en_pattern = 0; HtCamWriteFpgaRegs(0x04,reg_4.value); // HtCamSetStSp(color); @@ -1326,65 +1355,31 @@ void HCamDevice::savePsReg() void HCamDevice::HtCamWriteAllADC() { - for (int index = 0; index < adcRegSize; index++) + for (int index = 0; index < 20 ; index++) { HtCamWriteADCReg(index, pADCReg[index]); - //HtCamWriteADCRegA(index, pADCReg[index]); - //HtCamWriteADCRegB(index, pADCReg[index]); } - } void HCamDevice::HtCamInitADCReg() { -#ifdef ADC_82V38 - pADCReg[0] = 0x23; - pADCReg[1] = 0xF3; - pADCReg[2] = 40; - pADCReg[3] = 40; - pADCReg[4] = 40; - pADCReg[5] = 255; - pADCReg[6] = 255; - pADCReg[7] = 255; - return ; -#endif - -#ifdef ADC_82V48 - - // int size = adcConfig.getSize(); - // std::cout << " read ADC size : " << size << std::endl ; - // if (size > 0) - // { - // for (int index = 0; index < size; index++) - // { - // pADCReg[index] = adcConfig.getReg(index); - // } - // return; - //} pADCReg[0] = 0x07; - pADCReg[1] = 0x50; + pADCReg[1] = 0x50;//0x50; + - /* 1200 cis */ - if (_CAM_TYPE == "PYTHONZ_1200") - { /* 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 */ @@ -1393,58 +1388,9 @@ void HCamDevice::HtCamInitADCReg() pADCReg[0x10] = 0x55; pADCReg[0x11] = 0x55; pADCReg[0x12] = 0x50; - pADCReg[0x13] = 0x55; - } - else - { - /* offset */ - if (_CAM_TYPE == "PYTHONZ_WSS") - { - pADCReg[2] = 0x55; - pADCReg[3] = 0x00; - pADCReg[4] = 0x4a; - pADCReg[5] = 0x00; - pADCReg[6] = 0x50; - pADCReg[7] = 0x00; - pADCReg[8] = 0x4e; - pADCReg[9] = 0x00; - pADCReg[0xa] = 0x40; - pADCReg[0xb] = 0x00; - pADCReg[0xc] = 0x50; - pADCReg[0xd] = 0x00; - pADCReg[0xe] = 0x65; - pADCReg[0xf] = 0x65; - pADCReg[0x10] = 0x65; - pADCReg[0x11] = 0x65; - pADCReg[0x12] = 0x65; - pADCReg[0x13] = 0x65; - } - else - { - pADCReg[2] = 0xA0; - pADCReg[3] = 0x00; - pADCReg[4] = 0xA0; - pADCReg[5] = 0x00; - pADCReg[6] = 0xA0; - pADCReg[7] = 0x00; - pADCReg[8] = 0xA0; - pADCReg[9] = 0x00; - pADCReg[0xa] = 0xA0; - pADCReg[0xb] = 0x00; - pADCReg[0xc] = 0xA0; - pADCReg[0xd] = 0x00; - pADCReg[0xe] = 0x20; - pADCReg[0xf] = 0x20; - pADCReg[0x10] = 0x20; - pADCReg[0x11] = 0x20; - pADCReg[0x12] = 0x20; - pADCReg[0x13] = 0x20; - } - } -#endif + pADCReg[0x13] = 0x55;//0x55; } - void HCamDevice::HtCamResizeBuffer(int width, int height, int number) { v4lWidth = width; @@ -1452,7 +1398,6 @@ void HCamDevice::HtCamResizeBuffer(int width, int height, int number) v4lBufferCount = number; HtCamExitVideoCapturing(); - init_fd(); init_sample(); init_capture(); init_video_buffer(); diff --git a/HCamDevice.h b/HCamDevice.h index 12c5ee3..e40e20d 100644 --- a/HCamDevice.h +++ b/HCamDevice.h @@ -46,9 +46,11 @@ public: int get_height() { return v4lHeight; } void set_width_hegith(int , int); - void HtCamSetPeriod(uint8_t reg_value); //设置扫描仪传感器占空比 + void HtCamSetdivder (bool ); //设置扫描仪传感器使能 void HtCamGetPeriod(uint8_t ®_value);//获取扫描仪传感器占空比 + void HtCamSetPeriod(uint32_t *reg_value); //设置扫描仪传感器占空比 + void HtCamGetFrameCnt(uint32_t &val);//获取设置采集的帧数 void HtCamGetFrameNum(uint32_t &val);//获取当前已经采集到的第几帧 @@ -56,9 +58,11 @@ public: void HtCamSetFrameCnt(uint32_t val);//设置需要采集的帧数 uint32_t HtCamReadFpgaRegs(uint8_t reg_addr); //读取寄存器值 - void HtCamSetSpTime(uint32_t reg_value,uint32_t val);//0x03 //内触发间隔 //影响到图像得拉伸 + void HtCamSetSpTime(uint32_t reg_value,uint32_t val);//0x03 reg_value //灰度内触发间隔 val读写间隔//影响到图像得拉伸 //2023-8-28 val 改为曝光间隔, void HtCamGetSpTime(uint32_t ®_value); //获取当前sptime - void HtCamSetStSp(int start_sample);//0x0d //更具不同的颜色模式设置不同的st_sp //影响到图像的偏移 + void HtCamSetSpTime2(uint32_t reg_value);// reg_value //彩色内触发间隔 至少大于灰度三倍 + + void HtCamSetStSp(int start_sample);//0x0d //2023 /8/23 灰度彩色默认:200 //更具不同的颜色模式设置不同的st_sp //影响到图像的偏移 void HtCamGetStSp(uint32_t &start_sample); void HtCamSetVsnpTime(int color); @@ -66,7 +70,7 @@ public: void HtCamChangeExposureValueB(uint32_t* value); //曝光值设置 //void HtCamWriteADCReg(uint8_t addr,uint8_t data); //写adc寄存器 - //void HtCamReadADCReg(uint8_t addr, uint8_t *data); //读adc寄存器 + void HtCamReadADCReg_ALL(uint8_t addr) ; //读adc寄存器 ////////////////ADC 寄存器0x00 - 0x14/////////////////// @@ -110,6 +114,7 @@ public: void HtCamWriteAllADC(); void HtCamInitADCReg(); void HtCamWriteADCReg(uint8_t addr,uint8_t data); + void HtCamWriteADCReg(); void HtCamReadADCReg(uint8_t addr, uint8_t *data); void HtCamOverClockClear(); // 清除切换超频标志位 @@ -127,8 +132,6 @@ public: private: - - int init_fd(); int init_sample(); int init_capture(); int init_video_buffer(); diff --git a/MultiFrameCapture.cpp b/MultiFrameCapture.cpp index 7665755..396ae24 100644 --- a/MultiFrameCapture.cpp +++ b/MultiFrameCapture.cpp @@ -98,6 +98,7 @@ void MultiFrameCapture::open() { i = video->HtCamReadCaptureFrame((void **)&buf, 10); } + printf("open_device\r\n"); } void MultiFrameCapture::snap() @@ -142,7 +143,9 @@ void *MultiFrameCapture::readFrameTest(int timeout) uint32_t MultiFrameCapture::compute_frame(int paper_size,int dpi) { SIZE size = GetPaperSize((PaperSize)paper_size,dpi); - return size.cy; + int val = size.cy /cis_height_ + 1; //1:可能会被四舍五入,只能大不能小 + int cnt = color_mode_ ? val * 3 : val; //val * 3 彩色设置 513 但是采集实际高度是513 / 3 + return cnt; //四舍五入的情况下再多去一帧 } SIZE MultiFrameCapture::GetPaperSize(PaperSize paper, int dpi) { @@ -151,6 +154,7 @@ SIZE MultiFrameCapture::GetPaperSize(PaperSize paper, int dpi) SIZE resize{2338,3307}; resize.cx = paper_map_[paper].cx * dpi / 25.4; resize.cy = paper_map_[paper].cy * dpi / 25.4; + printf("resize.cx:%d resize.cy:%d\r\n",resize.cy / cis_height_,resize.cx); return resize; } return SIZE{2338, 3307}; @@ -163,8 +167,10 @@ void MultiFrameCapture::UpdateScanParam(HG_ScanConfiguration config) { return ; } - - resolution_ = config.params.dpi == 3 ? DPI_600 : DPI_300; //0:600dpi 1:300dpi config.params.dpi = 2||3 pc 2代表300 3代表600 + 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; is_correct_ = config.params.isCorrect; paper_size_ = config.params.pageSize; @@ -179,27 +185,35 @@ void MultiFrameCapture::UpdateScanParam(HG_ScanConfiguration config) video->HtCamSetClolr(color_mode_); 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,fpgaparam.MaxExp); // 2344 灰色 //2023-8-10 最新2650 - // fpgaparam.Sp=0; - // video->HtCamGetSpTime(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); + + + FPGAConfigParam fpgaparam = GetFpgaparam(config_dpi, config_color); + video->HtCamSetSpTime(fpgaparam.Sp,fpgaparam.Sp - 49); // 2344 灰色 //2023-8-10 最新2650 + if (color_mode_) + { + video->HtCamSetSpTime2(fpgaparam.HRatio); + } + + video->HtCamSetStSp(fpgaparam.MaxBright); + + configFPGAParam(config_color, config_dpi); + printf(" -----------------------resolution = %d color_mode_ = %d config_dpi:%d------------------\r\n",resolution_, color_mode_,config_dpi); { int val = config.params.dpi == 3 ? 600 :(config.params.dpi == 2?300:200); - uint32_t cnt = compute_frame(paper_size_ , val) / HEIGHT + 1; //多设一帧 + printf("val = %d\r\n",val); + uint32_t cnt = compute_frame(paper_size_ , val); //多设一帧 video->HtCamSetFrameCnt(cnt); printf(" -----------------------设置帧数:%d------------------\r\n",cnt); } + //if(!lut.empty()) + //lut.release(); + //calcLUT(config.params.dpi,config.params.isColor,true,lut); + printf("lut channels = %d lut width = %d \n",lut.channels(),lut.cols); 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_); printf("cis_width_:%d\r\n", cis_width_); printf("cis_height_:%d\r\n", cis_height_); printf("pixels_width_:%d\r\n", pixels_width_); @@ -313,25 +327,12 @@ void MultiFrameCapture::setScanFlag(bool brun) void MultiFrameCapture::reset_fpga() { - reset_pin->setValue(Gpio::Low); - std::this_thread::sleep_for(std::chrono::milliseconds(50)); - reset_pin->setValue(Gpio::High); - std::this_thread::sleep_for(std::chrono::milliseconds(50)); - m_capFpageregs->resetADC(); + } void MultiFrameCapture::reload_fpga() { - fpgaLoad->setValue(Gpio::Low); - std::this_thread::sleep_for(std::chrono::milliseconds(5)); - fpga_conf_initn->setValue(Gpio::Low); - std::this_thread::sleep_for(std::chrono::milliseconds(200)); - fpgaLoad->setValue(Gpio::High); - std::this_thread::sleep_for(std::chrono::milliseconds(15)); - fpga_conf_initn->setValue(Gpio::High); - std::this_thread::sleep_for(std::chrono::milliseconds(15)); - std::this_thread::sleep_for(std::chrono::seconds(5)); - printf("reload done \n"); + } @@ -342,15 +343,35 @@ void MultiFrameCapture::configFPGAParam(int mode, int dpi) video->HtCamChangeExposureValueF(fpgaparam.ExposureF); video->HtCamChangeExposureValueB(fpgaparam.ExposureB); + std::vector vals={fpgaparam.ExposureF[0],fpgaparam.ExposureF[1],fpgaparam.ExposureF[2],fpgaparam.ExposureB[0],fpgaparam.ExposureB[1],fpgaparam.ExposureB[2]}; + unsigned int max_val=0; + for (size_t i = 0; i < vals.size(); i++) + { + if(i==0) + max_val = vals[i]; + else + { + if(max_val <= vals[i]) + max_val = vals[i]; + } + } + printf("---------- max_val = %d \n",max_val+15); + video->HtCamSetSpTime(fpgaparam.Sp,max_val+15); + + for (int i = 0; i < 6; i++) { video->HtCamWriteADCReg_ALL(true,true,i,fpgaparam.GainF[i]); video->HtCamWriteADCReg_ALL(false,true,i,fpgaparam.OffsetF[i]); - + video->HtCamWriteADCReg_ALL(true,false,i,fpgaparam.GainB[i]); video->HtCamWriteADCReg_ALL(false,false,i,fpgaparam.OffsetB[i]); } + // for (size_t i = 0; i < 20; i++) + // { + // //video->HtCamReadADCReg_ALL(i); + // } }; int MultiFrameCapture::width() { @@ -375,10 +396,13 @@ static int cnt = 0; void MultiFrameCapture::snaprun() { //frame_info 发送得数据信息 channels 图像位深 num 需要取得帧数 time_out读图超时时间设置 - auto snap_func = [this](V4L2_DATAINFO_Ex frame_info, int channels,int num,int time_out) + auto snap_func = [this](V4L2_DATAINFO_Ex frame_info, int channels,int time_out) { + StopWatch sw; + sw.reset(); unsigned char *data = NULL; int ret = video->HtCamReadCaptureFrame((void **)&data, time_out); + if (ret == -1 || ret == -2) { printf("----------------获取图像超时或者失败------------\r\n"); @@ -389,35 +413,51 @@ void MultiFrameCapture::snaprun() printf("--------------fpga send line ------------:%d\r\n",sendLine); if (data) { - if (ret == 0) - frame_info.first_frame = true; - else - frame_info.first_frame = 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); //cv::imwrite("/home/root/test.png", mat); // printf("--------------frame_index------------:%d\r\n",frame_index); - // if (frame_index == 4) - // { - // savebitmap(data,15552,512,"1.bmp"); - // } - frame_info.mat = mat.clone(); - m_frameinfos.Put(frame_info); + if (cnt == 2) + { + cv::imwrite("/home/root/test.bmp", mat); + //cv::imwrite("/home/root/test.bmp", mat); + //savebitmap(data,15552,512,"1.bmp"); + } + cnt++; + //frame_info.mat = mat.clone(); + + //JpegCompress cmp(90); + //HG_JpegCompressInfo info = cmp.GetCompressedImg(mat); + + HG_JpegCompressInfo info ; + + info.pJpegData = (unsigned char *)malloc(frame_info.height * frame_info.width); + memcpy(info.pJpegData , data , frame_info.height * frame_info.width); + info.DataLength = frame_info.width * frame_info.height; + info.first_frame = frame_info.first_frame; + info.last_frame = frame_info.last_frame; + info.index_frame = frame_info.frame_index; + info.data_type = 0; + 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); + + //cv::imwrite("/home/root/opencv"+to_string(cnt_++)+".bmp",frame.mat); + m_glue.m_imageready(info); + + //m_frameinfos.Put(frame_info); + printf("采集图像耗时:%f\r\n",sw.elapsed_ms()); } return ret; }; + static int ti = 0; while (b_snap_run) { std::unique_lock lock(m_mtx_snap); m_cv_snap.wait(lock); V4L2_DATAINFO_Ex frame_info; - - frame_info.pixtype = color_mode_; frame_info.dpi = resolution_; frame_info.width = pixels_width_; @@ -430,26 +470,33 @@ void MultiFrameCapture::snaprun() int channels = color_mode_ == 1 ? 3 : 1; int color_mode = video->HtCamGetColorMode(); int func_sig = 0; - int time_out = color_mode == 1 ? 1000 : 800; + int time_out = color_mode == 1 ? 800 : 400; 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; + //video->HtCamSetVsnpTime(ti); + //printf("设置 vsnp:%d\r\n",ti); + //ti++; - printf("--------------------- frame_info.width ------------------ :%d\r\n",frame_info.width ); - printf("--------------------- frame_info.height ------------------ :%d\r\n",frame_info.height ); - printf("--------------------- frame_info.pixtype ------------------ :%d\r\n",frame_info.pixtype ); - printf("--------------------- frame_info.dpi ------------------ :%d\r\n",frame_info.dpi ); + + // printf("--------------------- frame_info.width ------------------ :%d\r\n",frame_info.width ); + // printf("--------------------- frame_info.height ------------------ :%d\r\n",frame_info.height ); + // printf("--------------------- frame_info.pixtype ------------------ :%d\r\n",frame_info.pixtype ); + // printf("--------------------- frame_info.dpi ------------------ :%d\r\n",frame_info.dpi ); 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; - func_sig = snap_func(frame_info, channels,frame_cnt,time_out); + frame_info.first_frame = i == 1 ? true : false; + frame_info.last_frame = i == frame_cnt ? true : false; + + func_sig = snap_func(frame_info, channels,time_out); if (func_sig == -1 ) //当前帧取图超时,在取一次!!! 一直超时 不就卡死了??? 这个地方还是需要加个时间限制几秒内一帧未取出就退了,返回异常状态吧? { i--; @@ -465,11 +512,14 @@ void MultiFrameCapture::snaprun() if (b_stop_snap) { video->HtCamGetFrameNum(frame_num); - - while (frame_num-1 > func_sig) + int val = frame_num - i; //剩余还未采集的帧数 + int ind = i++; //只是计数确认采集到低多少帧,无其他实用意义 + while (val) { - func_sig = snap_func(frame_info, channels,frame_num,time_out);//同上面一样 - printf("-----------当前采集到第:[%d]帧 CIS总共采集[%d]帧 -------\r\n",func_sig+1,frame_num); + frame_info.last_frame = val == 1 ? true : false; + func_sig = snap_func(frame_info, channels,time_out);//同上面一样 + printf("-----------当前采集到第:[%d]帧 CIS总共采集[%d]帧 -------\r\n",ind,frame_num); + if (func_sig == -1 ) { time_out +=200; @@ -480,13 +530,23 @@ void MultiFrameCapture::snaprun() } continue; } + val--; + ind++; + //this_thread::sleep_for(std::chrono::milliseconds(65)); } break; } + ////////////////////////////非常重要///////////////////////// + ////////////////////////////采集速度18 - 20ms///////////////////////// + ////////////////////////////传图速度88 - 89ms///////////////////////// + ////////////////////////////采集过快会导致队列堆积///////////////////////// + ////////////////////////////所以这个延时是采集速度和传图速度的差值///////////////////////// + ////////////////////////////DPI 颜色不同 会导致数据大小不同所以这个地方延时肯定不一样 目前 60是200dpi///////////////////////// + this_thread::sleep_for(std::chrono::milliseconds(35)); } video->HtCamStopVideoCapturing(); - printf("----------停止采集图像 ----------\r\n"); + printf("---------- 退出图像采集流程 ----------\r\n"); m_cv_snapdone.notify_all(); b_end_snap = true; @@ -508,24 +568,39 @@ void MultiFrameCapture::procimage() unsigned int frames_height; unsigned int frames_width = 0; int cnt_ =0; + StopWatch sw; + while (b_imgproc) { + sw.reset(); V4L2_DATAINFO_Ex frame = m_frameinfos.Take(); static int inx = 0; if (!frame.mat.empty()) { - JpegCompress cmp(90); - + JpegCompress cmp(100); + + if(!lut.empty()) + { + // correctColor(frame.mat,lut); + printf("correctColor done !!!!!!!!!!!!!!!!!!!!\n"); + } + HG_JpegCompressInfo info = cmp.GetCompressedImg(frame.mat); - + + // info.pJpegData = (unsigned char *)malloc(frame.width * frame.height); + //memcpy(info.pJpegData,frame.mat.data,frame.width * frame.height); + //info.mat = frame.mat; + // frame.mat.copyTo(info.mat); + //info.mat = frame.mat.clone(); + //info.DataLength = frame.width * frame.height; info.first_frame = frame.first_frame; info.last_frame = frame.last_frame; info.index_frame = frame.frame_index; info.data_type = 0; info.width = frame.width; info.height = frame.height; - + printf("压缩图像耗时:%f 压缩图像队列 %d:\r\n",sw.elapsed_ms(),m_frameinfos.Size()); 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); @@ -535,18 +610,18 @@ void MultiFrameCapture::procimage() continue; } } - +static int temp_val = 0; bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) { - int config_dpi = dpi == 1 ? 2 : dpi; - const int offset_indexs[] = {3, 4, 5, 2, 1, 0,0, 1, 2, 5, 4, 3}; + 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; int dstwidth = width * 2 * 3; - + bool isNeedSave = true; string log; @@ -564,18 +639,25 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) cv::Mat src(height, orgimgwidth, CV_8UC1, data); CImageMerge t_marge; - cv::Mat mrgmat = src;//t_marge.MergeImage(src, dstwidth, height, mode); + cv::Mat mrgmat = t_marge.MergeImage(src, dstwidth, height, mode,true); - printf("mrgmat width = %d height = %d \n", mrgmat.cols, mrgmat.rows); - static int inx = 0; - imwrite(to_string(++inx)+".bmp",mrgmat); - return 1; + printf("mrgmat width = %d height = %d temp_val=%d\n", mrgmat.cols, mrgmat.rows,temp_val); + int inx = 0; + if (temp_val == 0 && !black) + { + //inx+=1; + //temp_val++; + //imwrite(to_string(inx) + ".bmp", mrgmat); + } + + + //return 0; FPGAConfigParam param = GetFpgaparam(dpi, mode); if (black) // 暗场 { volatile double offValues[12]{0}; - double offValues_min[12]{0}; + double offValues_min[12]{0}; int blockcount = 12; int bandwidth = mrgmat.cols / blockcount; for (int n = 0; n < blockcount; n++) @@ -583,20 +665,22 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) 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) + 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; + 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;}); + 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] ); + printf("band[%d] mean = %0.2f bandwidth = %d offValues_min [%d] = %.2f \n", n, mean.val[0], bandwidth, n, offValues_min[n]); } - //return 0; + // return 0; for (int s = 0; s < 2; s++) { @@ -606,11 +690,11 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) { 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) + // double diff = 8 - offValues[k]; + double diff = 3 - offValues_min[k]; + if (offValues[k] > 15) { - diff = 25 -offValues[k]; + diff = 15 - offValues[k]; } double step = radio * diff; // int preStep = offsetStep[k]; @@ -635,7 +719,7 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) 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) @@ -673,7 +757,10 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) if (m_glue.m_deviceevent) m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); log = ""; - imwrite(param.Flat_BwPath, mrgmat); + + mrgmat = mrgmat(cv::Rect(0, 10, mrgmat.cols, mrgmat.rows -10)); + auto svmat = extractRepresentRow2(mrgmat);//原图列像素均值,避免单一像圆列成像噪声影响 + imwrite(param.Flat_BwPath, svmat); } } else // 明场 @@ -681,13 +768,18 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) 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))); + 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); + } 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]); + values[0][j] = a.val[2-j]; + values[1][j] = b.val[2-j]; + printf("values[0][%d] = %.2f a.val[%d] = %.2f values[1][%d] = %.2f b.val[%d] = %.2f\n", 2-j, values[0][j],j,a.val[j], 2-j, values[1][j],j,b.val[j]); } log = "开始彩色明场校正 \r\n"; @@ -700,8 +792,8 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) 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); + // int diff = LIGHT_DIFF(*((double *)values + k)); + int diff = 170 - *((double *)values + k);;//param.MaxBright - *((double *)values + k); log += " 明场:" + std::to_string(k) + ";diff:" + std::to_string(diff) + "\r\n"; double step = diff * radio; @@ -738,6 +830,7 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) memcpy((s == 0 ? ¶m.ExposureF[0] : ¶m.ExposureB[0]), (void *)exposures, sizeof(param.ExposureB)); } // ftt.append_log(log); + printf("\n%s",log.c_str()); if (m_glue.m_deviceevent) m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); @@ -747,7 +840,9 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) if (m_glue.m_deviceevent) m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); log = ""; - imwrite(param.Flat_WhitePath, mrgmat); + mrgmat = mrgmat(cv::Rect(0, 10, mrgmat.cols, mrgmat.rows -10)); + auto svmat = extractRepresentRow2(mrgmat);//原图列像素均值,避免单一像圆列成像噪声影响 + imwrite(param.Flat_WhitePath, svmat); } } else @@ -763,8 +858,8 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) 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]; + // int diff = LIGHT_DIFF(values[s]); + int diff = 170 - values[s];;//param.MaxBright - values[s]; double step = diff * radio; log += " 明场:" + to_string(s) + ";diff:" + to_string(diff) + "\r\n"; int preStep = expStep[s][0]; @@ -820,7 +915,9 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) if (m_glue.m_deviceevent) m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); log = ""; - imwrite(param.Flat_WhitePath, mrgmat); + mrgmat = mrgmat(cv::Rect(0, 10, mrgmat.cols, mrgmat.rows -10)); + auto svmat = extractRepresentRow2(mrgmat);//原图列像素均值,避免单一像圆列成像噪声影响 + imwrite(param.Flat_WhitePath, svmat); } } } @@ -845,67 +942,77 @@ void MultiFrameCapture::formatStep() void MultiFrameCapture::correctcolor(int correctmode) { StopWatch sw_correct; - std::string loginfo = "Start Correctcolor 200DPI COLOR \r\n"; - if ((correctmode == 0) || (correctmode == 2)) - { - loginfo = "Start Correctcolor 200DPI COLOR \r\n"; - if (m_glue.m_deviceevent) - m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - creatcorrectconfig(0x01, IMAGE_COLOR); - loginfo = "-----------200DPI COLOR Correct Done----------- \r\n\r\n "; - if (m_glue.m_deviceevent) - m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - } - if ((correctmode == 0) || (correctmode == 1)) - { - loginfo = "Start Correctcolor 200DPI GRAY \r\n"; - if (m_glue.m_deviceevent) - m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - creatcorrectconfig(0x01, IMAGE_GRAY); - loginfo = "-----------200DPI Gray Correct Done----------- \r\n\r\n"; - if (m_glue.m_deviceevent) - m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - } - if ((correctmode == 0) || (correctmode == 4)) - { - loginfo = " Start Correctcolor 300DPI COLOR \r\n"; - if (m_glue.m_deviceevent) - m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - creatcorrectconfig(0x02, IMAGE_COLOR); - loginfo = "-----------300DPI COLOR Correct Done----------- \r\n\r\n "; - if (m_glue.m_deviceevent) - m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - } - if ((correctmode == 0) || (correctmode == 3)) - { - loginfo = "Start Correctcolor 300DPI GRAY \r\n"; - if (m_glue.m_deviceevent) - m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - creatcorrectconfig(0x02, IMAGE_GRAY); - loginfo = "-----------300DPI Gray Correct Done----------- \r\n\r\n "; - if (m_glue.m_deviceevent) - m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - } - if ((correctmode == 0) || (correctmode == 6)) - { - loginfo = "Start Correctcolor 600DPI COLOR \r\n"; - if (m_glue.m_deviceevent) - m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - creatcorrectconfig(0x03, IMAGE_COLOR); - loginfo = "-----------600DPI COLOR Correct Done----------- \r\n\r\n"; - if (m_glue.m_deviceevent) - m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - } - if ((correctmode == 0) || (correctmode == 5)) - { - loginfo = " Start Correctcolor 600DPI GRAY \r\n"; - if (m_glue.m_deviceevent) - m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - creatcorrectconfig(0x03, IMAGE_GRAY); - loginfo = "-----------600DPI Gray Correct Done----------- \r\n\r\n "; - if (m_glue.m_deviceevent) - m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); - } + std::string loginfo = "Start Correctcolor 300DPI Gray \r\n"; + printf("----------- %s \n",loginfo.c_str()); + //creatcorrectconfig(0x02, IMAGE_GRAY); + printf("----------- done \n",loginfo.c_str()); + + loginfo = "Start Correctcolor 300DPI COLOR \r\n"; + printf("----------- %s \n",loginfo.c_str()); + creatcorrectconfig(0x02, IMAGE_COLOR); + printf("----------- done \n",loginfo.c_str()); + + + // if ((correctmode == 0) || (correctmode == 2)) + // { + // loginfo = "Start Correctcolor 200DPI COLOR \r\n"; + // if (m_glue.m_deviceevent) + // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + // creatcorrectconfig(0x01, IMAGE_COLOR); + // loginfo = "-----------200DPI COLOR Correct Done----------- \r\n\r\n "; + // if (m_glue.m_deviceevent) + // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + // } + // if ((correctmode == 0) || (correctmode == 1)) + // { + // loginfo = "Start Correctcolor 200DPI GRAY \r\n"; + // if (m_glue.m_deviceevent) + // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + // creatcorrectconfig(0x01, IMAGE_GRAY); + // loginfo = "-----------200DPI Gray Correct Done----------- \r\n\r\n"; + // if (m_glue.m_deviceevent) + // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + // } + // if ((correctmode == 0) || (correctmode == 4)) + // { + // loginfo = " Start Correctcolor 300DPI COLOR \r\n"; + // if (m_glue.m_deviceevent) + // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + // creatcorrectconfig(0x02, IMAGE_COLOR); + // loginfo = "-----------300DPI COLOR Correct Done----------- \r\n\r\n "; + // if (m_glue.m_deviceevent) + // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + // } + // if ((correctmode == 0) || (correctmode == 3)) + // { + // loginfo = "Start Correctcolor 300DPI GRAY \r\n"; + // if (m_glue.m_deviceevent) + // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + // creatcorrectconfig(0x02, IMAGE_GRAY); + // loginfo = "-----------300DPI Gray Correct Done----------- \r\n\r\n "; + // if (m_glue.m_deviceevent) + // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + // } + // if ((correctmode == 0) || (correctmode == 6)) + // { + // loginfo = "Start Correctcolor 600DPI COLOR \r\n"; + // if (m_glue.m_deviceevent) + // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + // creatcorrectconfig(0x03, IMAGE_COLOR); + // loginfo = "-----------600DPI COLOR Correct Done----------- \r\n\r\n"; + // if (m_glue.m_deviceevent) + // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + // } + // if ((correctmode == 0) || (correctmode == 5)) + // { + // loginfo = " Start Correctcolor 600DPI GRAY \r\n"; + // if (m_glue.m_deviceevent) + // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + // creatcorrectconfig(0x03, IMAGE_GRAY); + // loginfo = "-----------600DPI Gray Correct Done----------- \r\n\r\n "; + // if (m_glue.m_deviceevent) + // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); + // } if ((correctmode < 0) || (correctmode > 6)) { loginfo = "不支持的校正模式...\r\n"; @@ -926,37 +1033,59 @@ void MultiFrameCapture::openDevice(int dpi, int mode) int width = channelwidth * channels; int frame_height = mode == 0x01 ? 60 * 3 : 60; int startsample = 202; // 205 - auto fpgaparam = GetFpgaparam(dpi, 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 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); + + int config_dpi = resolution_ == DPI_600 ? 3 : 2; + int config_color = color_mode_ ==COLOR ? 1:0; + StopWatch swwv4l2open; 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); - printf(" -----------------------fpgaparam.Sp[1]%d fpgaparam.MaxExp[0]:%d------------------ \r\n",fpgaparam.Sp,fpgaparam.MaxExp); + + FPGAConfigParam fpgaparam = GetFpgaparam(config_dpi, config_color); + + video->HtCamSetSpTime(fpgaparam.Sp,fpgaparam.MaxExp); // 2344 灰色 //2023-8-10 最新2650 + if (color_mode_) + { + video->HtCamSetSpTime2(fpgaparam.HRatio); + } + + video->HtCamSetStSp(fpgaparam.MaxBright); + + configFPGAParam(config_color, config_dpi); + printf(" -----------------------resolution = %d config_color = %d config_dpi:%d------------------\r\n",resolution_, config_color,config_dpi); + { + video->HtCamSetFrameCnt(1); + printf(" -----------------------设置帧数:%d------------------\r\n",cnt); + } + + + 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_); + 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_); + printf("cis_width_:%d\r\n", cis_width_); + printf("cis_height_:%d\r\n", cis_height_); + printf("pixels_width_:%d\r\n", pixels_width_); + printf("pixels_height_:%d\r\n", pixels_height_); + + int ret = video->open_device(cis_width_,cis_height_); if(ret < -1) return; @@ -969,7 +1098,7 @@ void MultiFrameCapture::openDevice(int dpi, int mode) } //video->close_video(); - printf("opened video with width = %d height = %d time eplased = %.2f \n", width, 60 * 2, swwv4l2open.elapsed_ms()); + printf("opened video with width = %d height = %d time eplased = %.2f pbuffer = %p \n", width, 60 * 2, swwv4l2open.elapsed_ms(),buf); } void MultiFrameCapture::creatcorrectconfig(int dpi, int mode) @@ -981,16 +1110,21 @@ void MultiFrameCapture::creatcorrectconfig(int dpi, int mode) radio = 1; while (!isDone) // 先暗场 { + //break ; string log = "==============================第" + to_string(i) + "次===============================\r\n"; // ftt.append_log(log); if (m_glue.m_deviceevent) m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); - configFPGAParam(mode, dpi); + + int config_dpi = resolution_ == DPI_600 ? 3 : 2; + int config_color = color_mode_ ==COLOR ? 1:0; + + configFPGAParam(config_color, config_dpi); // ftt.append_log(log); printf("log :%s\r\n",log.c_str()); std::this_thread::sleep_for(std::chrono::milliseconds(5)); - unsigned int F[3]={1,1 ,1}; + unsigned int F[3]={0,0 ,0}; video->HtCamChangeExposureValueF(F); video->HtCamChangeExposureValueB(F); std::this_thread::sleep_for(std::chrono::milliseconds(5)); @@ -1001,6 +1135,7 @@ void MultiFrameCapture::creatcorrectconfig(int dpi, int mode) 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 video->HtCamStopVideoCapturing(); + //video->close_device(); this_thread::sleep_for(std::chrono::milliseconds(200)); i++; @@ -1011,17 +1146,27 @@ void MultiFrameCapture::creatcorrectconfig(int dpi, int mode) formatStep(); while (!isDone) // 后明场 { - configFPGAParam(mode, dpi); string log = "==============================第" + to_string(i) + "次===============================\r\n"; // ftt.append_log(log); if (m_glue.m_deviceevent) 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(true); + + //unsigned int F[3] = {1, 1, 1}; + //video->HtCamChangeExposureValueF(F); + //video->HtCamChangeExposureValueB(F); + //std::this_thread::sleep_for(std::chrono::milliseconds(5)); + + video->HtCamStartVideoCapturing(); std::this_thread::sleep_for(std::chrono::milliseconds(5)); - m_capFpageregs->capture(); - std::this_thread::sleep_for(std::chrono::milliseconds(5)); - isDone = saveLutImg(dpi, mode, false); + isDone = saveLutImg(dpi, mode, false); // 0 color_black 1 color_white 2 gray_balck 3 gray_white + video->HtCamStopVideoCapturing(); + // video->close_device(); + this_thread::sleep_for(std::chrono::seconds(2)); i++; } printf("creatcorrectconfig %s \n", (mode == IMAGE_COLOR ? " Color" : " Gray")); diff --git a/MultiFrameCapture.h b/MultiFrameCapture.h index 6820c24..ee4de07 100644 --- a/MultiFrameCapture.h +++ b/MultiFrameCapture.h @@ -12,7 +12,7 @@ class Gpio; class GpioOut; #define WIDTH 5184 -#define HEIGHT 513 //只能为3的倍数 +#define HEIGHT 513 //只能为3的倍数 #define DPI_600 0 #define DPI_300 1 #define COLOR 1 @@ -93,6 +93,8 @@ private: unsigned int color_mode_; // 颜色模式 unsigned int is_correct_; // 是否校正 unsigned int is_double_paper_; // 是否启动双张检测 + + cv::Mat lut; std::map paper_map_ { {PaperSize::G400_A3,SIZE{297,420}}, @@ -112,7 +114,7 @@ private: }; SIZE GetPaperSize(PaperSize paper, int dpi); - uint32_t compute_frame(int paper_size,int dpi); + uint32_t compute_frame(int paper_size,int dpi); //计算固定幅面需要采集的帧数 public: MultiFrameCapture(ScannerGlue glue, std::shared_ptr fpga, CISVendor vendor); diff --git a/Scanner.cpp b/Scanner.cpp index 5897272..78dfc49 100644 --- a/Scanner.cpp +++ b/Scanner.cpp @@ -73,8 +73,10 @@ Scanner::Scanner(ScannerGlue glue) } }; sensor = std::make_shared(sysEvent); + this_thread::sleep_for(std::chrono::milliseconds(50)); m_keyboard.reset(new huagao::Keyboard(btnevent)); m_keyboard->init(); + this_thread::sleep_for(std::chrono::milliseconds(50)); motorZouzhi.enablePower(true); motorZouzhi.setSpeed(4000); motorCuozhi.setSpeed(3000); @@ -87,6 +89,7 @@ Scanner::Scanner(ScannerGlue glue) FsmState::setScanner(this); threadRunMessageLoop = std::thread(&Scanner::runMessageLoop, this); Motor::enablePower(true); + this_thread::sleep_for(std::chrono::milliseconds(200)); //meminfo = MemoryInfo::GetInstance(); //GetSysInfo(); } @@ -207,26 +210,39 @@ void Scanner::runScan() { LOG("-------------Scanner RunScan Start-------------\r\n"); capturer->open(); + printf("11111111111111111111\r\n"); motorZouzhi.start(); + motorCuozhi.pauseWaitForThread(); + //capturer->open(); sensor->enableDoubleSensor(false); + if (!isPaperInit) { + preFeed(); + isPaperInit = true; } - for (size_t i = 0; i < 16; i++) - { - std::cout << string_format("reg[%d] = 0x%08x", i, capturer->read(i)) << std::endl; - } + // for (size_t i = 0; i < 16; i++) + // { + // std::cout << string_format("reg[%d] = 0x%08x", i, capturer->read(i)) << std::endl; + // } + this_thread::sleep_for(std::chrono::milliseconds(200)); imageindex = 0; - capturer->setFPGATriggerMode(false, 0); - capturer->setFanMode(3); + //*capturer->setFPGATriggerMode(false, 0); + + //capturer->setFanMode(3); + sensor->resetPaperPin(); + capturer->clearimages(); + capturer->resetimageremain(); + capturer->setScanFlag(true); + bool b_autosize = m_config.params.pageSize==(int)PaperSize::G400_AUTO || m_config.params.pageSize==(int)PaperSize::G400_MAXAUTO || @@ -303,7 +319,7 @@ void Scanner::runScan() if(m_config.params.pageSize == 17 || m_config.params.pageSize == 19) max = 200; LOG("paper pauseWaitForThread \n"); - waitpapertime = 400; + waitpapertime = 200; while (!sensor->waitPaperOut(waitpapertime) && i < max) { i++; @@ -366,7 +382,7 @@ void Scanner::runScan() } std::this_thread::sleep_for(std::chrono::milliseconds(50)); } - std::this_thread::sleep_for(std::chrono::milliseconds(500)); + //std::this_thread::sleep_for(std::chrono::milliseconds(500)); LOG("\nclose b_autosize %s\n",GetCurrentTimeStamp(2).c_str()); capturer->stopsnap(b_autosize); capturer->waitsnapdone(m_isDoublePaper || m_jamPaper);//等待采集完成 @@ -383,10 +399,16 @@ void Scanner::runScan() break; } sw.reset(); - while (meminfo->GetMemoryUsed() > 70.0f||(m_config.params.dpi ==0x03 && capturer->getimageremain()>1)) //内存占用高于75% + while (meminfo->GetMemoryUsed() > 85.0f||(m_config.params.dpi ==0x03 && capturer->getimageremain()>1)) //内存占用高于75% { - if (sw.elapsed_s() < 20.0) + if (sw.elapsed_s() < 50.0) + { + + std::this_thread::yield(); + //printf("7777777777777777777777777777777777777\r\n"); + this_thread::sleep_for(std::chrono::milliseconds(200)); + } else { LOG("\n ----------------EXIT 3333---------------- \n"); diff --git a/Sensor.cpp b/Sensor.cpp index 1fca7ff..17ddacc 100644 --- a/Sensor.cpp +++ b/Sensor.cpp @@ -23,23 +23,31 @@ Sensor::Sensor(BlockingQueue &sysEvents) sensor_power(PIN_PORT_7010::SENSOR_POWER) { - pwm2.enable(Gpio::High); + pwm2.setFreq(2583); - sensor_power.setDirection(Gpio::in); - sensor_power.setValue(Gpio::High); //默认打开电源 + pwm2.enable(Gpio::High); + sensor_power.setValue(Gpio::High); //默认打开电源 + doubleEnablePin.setValue(Gpio::High); + + ///////输入输出模式////// coverPin.setDirection(Gpio::in); paperPin.setDirection(Gpio::in); + scanPin.setDirection(Gpio::in); double_out0_Pin.setDirection(Gpio::in); double_out1_Pin.setDirection(Gpio::in); - //paperJamPin.setDirection(Gpio::in); - scanPin.setDirection(Gpio::in); - scanPin.setEdge(Gpio::both); + sensor_power.setDirection(Gpio::in); + doubleEnablePin.setDirection(Gpio::out); + + + //////////中断模式/////// + double_out0_Pin.setEdge(Gpio::both); + double_out1_Pin.setEdge(Gpio::both); + doubleEnablePin.setEdge(Gpio::both); coverPin.setEdge(Gpio::both); paperPin.setEdge(Gpio::both); - double_out0_Pin.setEdge(Gpio::both); - double_out1_Pin.setEdge(Gpio::both); + scanPin.setEdge(Gpio::both); //std::cout<<"scanPin "<< scanPin.getValue()< gpios; gpios.push_back(&coverPin); gpios.push_back(&paperPin); - //gpios.push_back(&double_out0_Pin); - //gpios.push_back(&double_out1_Pin); + gpios.push_back(&double_out0_Pin); + gpios.push_back(&double_out1_Pin); std::vector pollfds; pollfd pfd; int ret = 0; @@ -224,25 +232,57 @@ void Sensor::monitor2() { if (pollfds[i].revents) { - fd = pollfds[i].fd; - lseek(fd, 0, SEEK_SET); - num = read(fd, buf, 8); - buf[num - 1] = '\0'; - ret = atoi(buf); + ret = readfile(pollfds[i].fd,num,buf); //LOG("event id : %d i= %d \n",evts[i * 2 + ret] , i ); - if(evts[i * 2 + ret] == 272) + // if(evts[i * 2 + ret] == 272) + // { + // //LOG("\n\n---------------double paper ----------------:%s \n\n", GetCurrentTimeStamp(2).c_str()); + // enableDoubleSensor(false); + // } + printf("i:%d\r\n",i); + if (i == 2) { - //LOG("\n\n---------------double paper ----------------:%s \n\n", GetCurrentTimeStamp(2).c_str()); - enableDoubleSensor(false); + double_1 = ret; + printf("2 double_1 :%d double_2:%d\r\n",double_1,double_2); + if (double_2 && double_1) + { + + events.Put(ScanEvent(S_EVT_DOUBLEPAPER)); + enableDoubleSensor(false); + } + else + { + //printf("3 double_1 :%d double_2:%d\r\n",double_1,double_2); + events.Put(ScanEvent(S_EVT_NOT_DOUBLEPAPER)); + } + } + if (i == 3) + { + double_2 = ret; + printf("3 double_1 :%d double_2:%d\r\n",double_1,double_2); + if (double_2 && double_1) + { + + events.Put(ScanEvent(S_EVT_DOUBLEPAPER)); + enableDoubleSensor(false); + } + else + { + //printf("4 double_1 :%d double_2:%d\r\n",double_1,double_2); + events.Put(ScanEvent(S_EVT_NOT_DOUBLEPAPER)); + } + } + if (i != 4 && i != 3) + { + if(i == 1) + { + //LOG("paper sensor ret:%d \n", ret); + cv_paper_on.notify_all(); + } + events.Put(evts[i * 2 + ret]); } - if(i == 1) - { - //LOG("paper sensor ret:%d \n", ret); - cv_paper_on.notify_all(); - } - events.Put(evts[i * 2 + ret]); } } } @@ -254,3 +294,10 @@ void Sensor::monitor2() close(pollfds[i].fd); } } + +int Sensor::readfile(int fd,int num , char* buf){ + lseek(fd, 0, SEEK_SET); + num = read(fd, buf, 8); + buf[num - 1] = '\0'; + return atoi(buf); +} \ No newline at end of file diff --git a/Sensor.h b/Sensor.h index 0b19a72..a472dcb 100644 --- a/Sensor.h +++ b/Sensor.h @@ -35,6 +35,7 @@ public: bool waitPaperStandBy(int timeout_ms); //取消等待纸张 void cancelWaitPaper(); + //双张使能 private: @@ -59,7 +60,9 @@ private: std::thread thread_monitor2; volatile bool bMonitor = true; volatile bool bMonitor2 = true; - + volatile bool double_1 = false; + volatile bool double_2 = false; void monitor(); void monitor2(); + int readfile(int fd,int num , char* buf); }; \ No newline at end of file diff --git a/UsbScanner.cpp b/UsbScanner.cpp index 6089493..6a26a61 100644 --- a/UsbScanner.cpp +++ b/UsbScanner.cpp @@ -126,6 +126,7 @@ UsbScanner::UsbScanner() : m_startscan(false), { imageremain++; m_images.Put(imageinfo); + printf("m_images size :%d\r\n",m_images.Size()); // LOG("Enqueue image index :%d ptr:%p length:%d\n", ++enqueueindex,imageinfo.pJpegData, imageinfo.DataLength); }; diff --git a/correct_ultis.cpp b/correct_ultis.cpp index ed990ec..6edd323 100644 --- a/correct_ultis.cpp +++ b/correct_ultis.cpp @@ -122,6 +122,14 @@ 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 correctColor(cv::Mat& src, cv::Mat& lut) +{ + cv::Mat image_temp(src.rows, src.cols * src.channels() / lut.channels(), CV_8UC(lut.channels()), src.data); + + for (size_t i = 0; i < image_temp.cols; i++) + cv::LUT(image_temp(cv::Rect(i, 0, 1, image_temp.rows)), lut(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"); @@ -159,6 +167,45 @@ void creatLUTData(int dpi, int mode) printf("exit creatLUTData \n"); } +cv::Mat creatLUTData_7010(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); + + lut = calcLUT(bMat, wMat, true);// + printf("exit creatLUTData \n"); + return 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) { return correctparam.GetFpgaparam(dpi, mode); @@ -180,7 +227,7 @@ cv::Mat colMean(const cv::Mat &image) float gamma(float value, float ex) { - return 0.0;//cv::pow(value / 255.0f, 1.0f / ex) * 255.0f + 0.5f; + return cv::pow(value / 255.0f, 1.0f / ex) * 255.0f + 0.5f; } #define GAMMA_EX 1.7f @@ -327,8 +374,8 @@ cv::Mat createLUT(const std::vector &mats, bool isTextCorrect) 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)); + w.push_back(black); + w.push_back(white); cv::Mat lut = createLUT(w, isTextCorrection); for (size_t i = 0, block = lut.rows / CHANNEL; i < block; i++) @@ -341,6 +388,39 @@ cv::Mat calcLUT(const cv::Mat &black, const cv::Mat &white, bool isTextCorrectio return lut; } +void calcLUT(int dpi , int mode, bool isTextCorrection, cv::Mat& lut) +{ + 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 twMat = cv::imread(whitePath, colormode); + cv::Mat tbMat = cv::imread(blackPath, colormode); + cv::Mat dataFile = calcLUT(tbMat, twMat, isTextCorrection); + printf("whitePath =%s blackPath = %s \n",whitePath.c_str(),blackPath.c_str()); + + long total = dataFile.total(); + int step = total / 256; + + int channel = 1; +#ifndef USE_NEWFLAT + if (step == 4896 || step == 7344) + channel = 408; + else if (step == 14688 || step == 22032 || step == 44064) + channel = 432; // 486 +#else +#ifdef G400 + channel = 408; +#else + channel = 432; +#endif +#endif + lut = cv::Mat::zeros(step / channel, 256, CV_8UC(channel)); + memcpy(lut.data, dataFile.data, total); + printf("!!!!!!!!!!!!!!calc memory lut done \n"); +} + cv::Mat create_lut(const cv::Mat &black, const cv::Mat &white, int dpi, bool colormode) { #ifndef USE_NEWFLAT @@ -396,5 +476,5 @@ cv::Mat create_lut(const cv::Mat &black, const cv::Mat &white, int dpi, bool col cv::Mat GetMergeMat(int dstwidth, int dstheight, int type, cv::Mat &mat) { - return CImageMerge().MergeImage(type == CV_8UC3, mat, dstwidth, dstheight); + // 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 9dced71..81eae25 100644 --- a/correct_ultis.h +++ b/correct_ultis.h @@ -16,14 +16,20 @@ void setOffset(int *config, int step); cv::Mat calcLUT(const cv::Mat& black, const cv::Mat& white, bool isTextCorrection); +void calcLUT(int dpi , int mode, bool isTextCorrection, cv::Mat& lut); + cv::Mat extractRepresentRow2(const cv::Mat& src); void initLut(const std::string lutpath,bool iscolor); void correctColor(cv::Mat& src, int dpi,int mode,bool isTextCorrect=true); +void correctColor(cv::Mat& src, cv::Mat& lut); + void creatLUTData(int dpi , int mode); +cv::Mat creatLUTData_7010(int dpi , int mode); + FPGAConfigParam GetFpgaparam(int dpi,int mode); void SaveFpgaparam(FPGAConfigParam& param); diff --git a/main.cpp b/main.cpp index 652e265..1569705 100644 --- a/main.cpp +++ b/main.cpp @@ -255,7 +255,8 @@ int main(int argc, char *argv[]) while (b_runloop) { - + StopWatch sw; + sw.reset(); if (!m_scanner->is_connect()) { printf("USB DISCONNECT DISCONNECT DISCONNECT DISCONNECT DISCONNECT DISCONNECT DISCONNECT\n"); @@ -273,6 +274,7 @@ int main(int argc, char *argv[]) continue; } // printf("Usb command %d \n",usbcb.Command); + switch ((USBCommand)usbcb.Command) { case USBCommand::GET_DSP_STATUS: @@ -337,88 +339,54 @@ int main(int argc, char *argv[]) break; case USBCommand::GET_IMAGE: { - HG_JpegCompressInfo info = m_scanner->GetImage(); - //int index = 0; - - - // unsigned char *p = (unsigned char *)malloc(sizeof(info)+ info.DataLength + 4 ); - - // memcpy(p + index,&info.data_type,sizeof(int)); - // index += sizeof(int); - // int val =*(int *)p; - // memcpy(p + index,&info.first_frame,sizeof(int)); - // index += sizeof(int); - // memcpy(p + index,&info.last_frame,sizeof(int)); - // index += sizeof(int); - // memcpy(p + index,&info.index_frame,sizeof(int)); - // index += sizeof(int); - // memcpy(p + index,&info.DataLength,sizeof(int)); - // index += sizeof(int); - // memcpy(p + index,&info.width,sizeof(int)); - // index += sizeof(int); - // memcpy(p + index,&info.height,sizeof(int)); - // index += sizeof(int); - // //printf("info.DataLength =%d index=%d\r\n",info.DataLength,index); - // if (!info.pJpegData) - // { - // printf("取图失败\r\n"); - // break; - // } - - //memcpy(p + index,info.pJpegData,info.DataLength); - - //index +=info.DataLength; - - //printf("info.data_type:%d info.first_frame:%d last_frame:%d index_frame:%d DataLength:%d\r\n",info.data_type,info.first_frame,info.last_frame,info.index_frame,info.DataLength); - - //printf(" index :%d\r\n", index); - // m_scanner->write_bulk(&index,sizeof(int)); - - // int tt = m_scanner->write_bulk(p,index); - // if(p) - // free(p); - // if(info.pJpegData) - // tjFree(info.pJpegData); - // break; + //sw.reset(); if (info.pJpegData != nullptr && info.DataLength != 0) { - - int tt = m_scanner->write_bulk((void*)&info, sizeof(int)*7); + //int tt = m_scanner->write_bulk(info.pJpegData, info.DataLength); + //free(info.pJpegData); + //break; - + + //tt = m_scanner->write_bulk(info.mat.data, info.DataLength); + //free(info.pJpegData); + //break; //LOG("GET_IMAGE info.pJpegData =%p info.DataLength=%d \n", info.pJpegData, info.DataLength); int index = 0; - while (info.DataLength > 0) + int total = info.DataLength; + while (total > 0) { int dstlength = 1024 * 512; - if (info.DataLength <= dstlength) + if (total <= dstlength) { - dstlength = info.DataLength; - info.DataLength = 0; // jpeg图像小于1MB 则一次传输 + dstlength = total; + total = 0; // jpeg图像小于1MB 则一次传输 } else //压缩大于1MB的图像 分包传输 { - info.DataLength -= dstlength; + total -= dstlength; } + int tt = m_scanner->write_bulk(info.pJpegData + index, dstlength); - //LOG("write_bulk info.pJpegData+index = %p index = %d dstlength =%d tt = %d \n", info.pJpegData + index, index, dstlength, tt); - + + //printf("write_bulk info.pJpegData+index = %p index = %d dstlength =%d tt = %d \n", info.pJpegData + index, index, dstlength, tt); if (tt <= -1) { LOG("FAIL GET_IMAGE write bulk data error\n"); - writesyslog(LOG_WARNING, "usb write_bulk error,lost image!"); + //writesyslog(LOG_WARNING, "usb write_bulk error,lost image!"); break; } else index += tt; } + //free(info.pJpegData); tjFree(info.pJpegData); LOG("Free info.pJpegData done\n"); + printf("TIME!!!!!!!!!!!!! :%f info.DataLength:%d\r\n",sw.elapsed_ms(),info.DataLength); } } break; diff --git a/scanservices_utils.h b/scanservices_utils.h index bf56d7b..d8bf7ca 100644 --- a/scanservices_utils.h +++ b/scanservices_utils.h @@ -37,7 +37,7 @@ using namespace std; #ifdef _LOG #define LOG printf #else -#define LOG printf +#define LOG //printf #endif #ifdef G400 @@ -89,6 +89,7 @@ struct HG_JpegCompressInfo unsigned int width; unsigned int height; unsigned char *pJpegData; + //cv::Mat mat; }; struct HG_JpegCompressInfo_data {