zynq_7010/zynq_7010_code/MultiFrameCapture.h

150 lines
4.5 KiB
C++
Raw Permalink 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 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<int> 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<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;
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<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,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;
};