#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 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 { long cx; long cy; }CSSIZE; typedef CSSIZE SIZE; class MultiFrameCapture : public ICapturer { private: bool b_snap_run; bool b_stop_snap; bool b_end_snap; bool bScanning; std::atomic iImageremain; FPGAConfigParam m_fpgaparam; std::mutex m_mtx_snap; std::mutex m_mtx_snapdone; std::mutex img_lock_; std::condition_variable img_wait_; 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; private: void configFPGAParam(int mode,int dpi); 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); private: unsigned int resolution_; // 分辨率 //3:600dpi 2:300dpi 1:200dpi unsigned int v4l2_width_; // v4l2 图像宽 unsigned int v4l2_height_; // v4l2 图像高 unsigned int pixels_height_; // opencv需要生成的高 unsigned int pixels_width_ ; // opencv需要生成的宽 unsigned int paper_size_; // 纸张大小 unsigned int color_mode_; // 颜色模式 unsigned int is_correct_; // 是否校正 unsigned int is_double_paper_; // 是否启动双张检测 unsigned int is_remove_morr_; // 去除摩尔纹 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,5500}}, {PaperSize::G400_AUTO,SIZE{210,297}}, {PaperSize::G400_MAXAUTO,SIZE{216,5500}}, }; 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); virtual ~MultiFrameCapture(); public: 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; virtual void SetLowPower(bool islow); virtual void set_image_callback(image_callback cb) override; virtual void wait_image_notify() override; };