zynq_7010/MultiFrameCapture.h

166 lines
5.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "ICapturer.h"
#include <thread>
#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<GpioOut> reset_pin; //fpga 逻辑复位以及固件重载初始化。 7010 7/15没有 以防固件跑飞了保证能够不重启就能解决
std::shared_ptr<Gpio> fpgaLoad;
std::shared_ptr<Gpio> fpga_conf_initn;
BlockingQueue<V4L2_DATAINFO_Ex> 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<int> 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<std::thread> m_snap_thread;
std::shared_ptr<std::thread> 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<PaperSize, SIZE> 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;
};