#include "ICapturer.h" #include #include "autoevent.hpp" #include "CorrectParam.h" //#define TEST_SIMCAP class FpgaComm; class gVideo; class Gpio; class GpioOut; #define WIDTH 5184 #define HEIGHT 951 //只能为3的倍数 #define DPI_600 0 #define DPI_300 1 #define COLOR 1 #define GRAY 0 typedef struct hg_tag_SIZE { long cx; long cy; }CSSIZE; typedef CSSIZE SIZE; class MultiFrameCapture : public ICapturer { private: int frame_height = 60; int m_total_height = 0; int readframe_timeout = 100; unsigned int frame_count; std::shared_ptr reset_pin; //fpga 逻辑复位以及固件重载初始化。 7010 7/15没有 以防固件跑飞了保证能够不重启就能解决 std::shared_ptr fpgaLoad; std::shared_ptr fpga_conf_initn; BlockingQueue m_frameinfos; bool b_snap_run; bool b_stop_snap; bool stop_snap_ = false ; bool b_end_snap; bool b_imgproc; bool is_size_error; int snaped_index; bool bScanning; std::atomic iImageremain; FPGAConfigParam m_fpgaparam; std::mutex m_mtx_snap; std::mutex m_mtx_snapdone; std::condition_variable m_cv_snap; std::condition_variable m_cv_snapdone; std::shared_ptr m_snap_thread; std::shared_ptr m_imgproc_thread; std::thread m_correctThread; ScannerGlue m_glue; int offsetStep[12]; int expStep[2][3]; double radio = 1; #ifdef TEST_SIMCAP unsigned char* m_test_pimg; unsigned int m_test_pimg_len; #endif CamZ_Reg_4 reg_; private: void reset_fpga(); void reload_fpga(); void configFPGAParam(int mode,int dpi); int color(); int width(); void snaprun(); void updatesnapstatus(int papertype); void procimage(); void formatStep(); bool saveLutImg(int dpi, int mode, bool black); void creatcorrectconfig(int dpi,int mode); void correctcolor(int correctmode); void openDevice(int dpi,int mode); //void myFloodFill(cv::Mat& image, bool isTwoSide); private: unsigned int resolution_; // 分辨率 //0:600dpi 1:300dpi unsigned int v4l2_width_; // v4l2 图像宽 unsigned int v4l2_height_; // v4l2 图像高 unsigned int pixels_height_; // opencv需要生成的高 unsigned int pixels_width_ ; // opencv需要生成的宽 unsigned int fpga_height_; // PGPA 需要的高的是三倍数 ,发950 就是指951 unsigned int paper_size_; // 纸张大小 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}}, {PaperSize::G400_A4,SIZE{210,297}}, {PaperSize::G400_A5,SIZE{148,210}}, {PaperSize::G400_A6,SIZE{105,148}}, {PaperSize::G400_B4,SIZE{250,353}}, {PaperSize::G400_B5,SIZE{176,250}}, {PaperSize::G400_B6,SIZE{125,176}}, // {PaperSize::G400_DOUBLELETTER,}, {PaperSize::G400_LEGAL,SIZE{216,356}}, {PaperSize::G400_LETTER,SIZE{216,279}}, //{PaperSize::G400_LONGLETTER}, {PaperSize::G400_MAXSIZE,SIZE{210,297 * 2}}, {PaperSize::G400_AUTO,SIZE{210,297}}, {PaperSize::G400_MAXAUTO,SIZE{210,(long)(297 * 1.5)}}, }; SIZE GetPaperSize(PaperSize paper, int dpi); uint32_t compute_frame(int paper_size,int dpi); //计算固定幅面需要采集的帧数 void compute_height(int width,int height); //在open 之前调用 public: MultiFrameCapture(ScannerGlue glue, CISVendor vendor); virtual ~MultiFrameCapture(); virtual void SetParent(void *scanner) override; virtual void open() override; ////这个地方非常重要 目的是检测到有纸之后 ,继续走纸接近CIS 在启动采集 ,但是这个地方风险也很大,需要调的尽量完美,如果出现最上面几行图像和最下面图像不显示请看一下这里吧!!!! ////走纸速度影响吗??? YES virtual void snap() override; virtual void stopsnap(bool autosize) override; virtual void close() override; virtual int read(int addr) override; virtual void *readFrameTest(int timeout); virtual void UpdateScanParam(HG_ScanConfiguration config) override; virtual void createCorrect(int correctmode) override; virtual void setFPGATriggerMode(bool autotrigger, int delay) override; virtual void setFanMode(int mode) override; virtual void fpgaReload() override; virtual bool capturerImage() override; virtual void waitsnapdone(int state) override; virtual bool IsImageQueueEmpty() override; virtual void resetimageremain() override; virtual std::atomic_int &getimageremain() override; virtual void clearimages() override; virtual void setScanFlag(bool brun) override; };