调整整体流程

This commit is contained in:
modehua 2023-08-31 01:37:05 -07:00
parent 4aef383168
commit f670bc5342
17 changed files with 935 additions and 656 deletions

View File

@ -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)); if (b7010)
auto graymerge = [](cv::Mat& src,cv::Mat dst)->cv::Mat
{ {
int width_block = src.cols / 12; //printf("7010 7010 10 7010 7010 7010 7010 7010 7010!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n");
int heigh_block = src.rows; cv::Mat matdst;
if (srcMat.cols == 5184 || srcMat.cols == 10368) // gray mode
// 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<cv::Mat> 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) matdst = srcMat;
{
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); else
} {
return srcMat; // 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) /*TEMP MERGE ALGORITHM*/
{ int width = srcMat.cols / 3;
int blockcnt = 12; int height = srcMat.rows;
int spitWidth = srcMat.cols / blockcnt; cv::Mat m_dst(height, width, CV_8UC(3));
int abortwidth; // = spitWidth == 3888 ? 432 : (spitWidth == 2592 ? 216 : 144); std::vector<cv::Mat> m_items;
if (!iscolor) // 灰度 std::vector<int> index = {0, 2, 1};
{ for (size_t i = 0; i < 3; i++)
abortwidth = spitWidth == 1296 ? 432 : (spitWidth == 648 ? 216 : 144); {
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 else
{ {
abortwidth = spitWidth == 3888 ? 432 : (spitWidth == 1944 ? 216 : 144); 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
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))); int width_block = src.cols / 12;
} int heigh_block = src.rows;
srcMat.release();
return dst;
}
else
{
std::vector<cv::Mat> m_splits;
std::vector<int> m_index = {1, 4, 7, 10, 2, 5, 6, 9, 0, 3, 8, 11};
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); if (mode == 0) // 灰度模式
cv::Mat t_mat(dstheight, dstwidth - abortwidth * 2, CV_8UC1); return graymerge(srcMat, dst);
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))); std::vector<cv::Mat> ch_mats;
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))); int blockcnt = 12;
srcMat(cv::Rect(spitWidth * m_index[startindex + 3], 0, spitWidth, dstheight)).copyTo(t_mat(cv::Rect(spitWidth * 3 - abortwidth * 2, 0, spitWidth, dstheight))); int spitWidth = srcMat.cols / blockcnt;
m_splits.push_back(t_mat); 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); return srcMat;
m_splits.clear();
} }
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<cv::Mat> m_splits;
// std::vector<int> 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<cv::Mat> frames, int type, int dpi) cv::Mat CImageMerge::MergeFrames(std::vector<cv::Mat> frames, int type, int dpi)
{ {
if (frames.empty()) if (frames.empty())
@ -132,10 +165,10 @@ cv::Mat CImageMerge::MergeFrames(std::vector<cv::Mat> frames, int type, int dpi)
cv::Mat matdst(dstH, dstwidth, CV_8UC(type == 1 ? 3 : 1)); cv::Mat matdst(dstH, dstwidth, CV_8UC(type == 1 ? 3 : 1));
for (int i = 0; i < size; i++) for (int i = 0; i < size; i++)
{ {
auto itemimg = frames[i]; // auto itemimg = frames[i];
itemimg = MergeImage(type, itemimg, dstwidth + abortwidth, itemimg.rows); // itemimg = MergeImage(type, itemimg, dstwidth + abortwidth, itemimg.rows);
itemimg.copyTo(matdst(cv::Rect(0, itemimg.rows * i, itemimg.cols, itemimg.rows))); // itemimg.copyTo(matdst(cv::Rect(0, itemimg.rows * i, itemimg.cols, itemimg.rows)));
itemimg.release(); // itemimg.release();
} }
return matdst; return matdst;
} }

View File

@ -9,7 +9,7 @@ public:
CImageMerge(/* args */); CImageMerge(/* args */);
~CImageMerge(); ~CImageMerge();
public: public:
cv::Mat MergeImage(cv::Mat& srcMat,int dstwidth,int dstheight,int mode); 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 MergeImage(bool iscolor,cv::Mat& srcMat,int dstwidth,int dstheight);
cv::Mat MergeFrames(std::vector<cv::Mat> frames, int type, int dpi); cv::Mat MergeFrames(std::vector<cv::Mat> frames, int type, int dpi);
}; };

View File

@ -28,6 +28,11 @@ set(-mfloat-abi=hard)
# set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
# set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE 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/modehua/sdk/sysroots/cortexa9t2hf-neon-xilinx-linux-gnueabi/usr/include/opencv4/)
#set(OpenCV_DIR /home/holdtecs/zzm-linux/fs/usr/lib) #set(OpenCV_DIR /home/holdtecs/zzm-linux/fs/usr/lib)

View File

@ -49,7 +49,7 @@ union CamZ_Reg_4_New
unsigned int unuse_0 : 2; unsigned int unuse_0 : 2;
unsigned int color_mode : 1; unsigned int color_mode : 1;
unsigned int en_frameset: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_adc1_cfg:1; //使能ADC 配置 脉冲有效(写低写高)
unsigned int en_adc2_cfg:1; //使能ADC 配置 脉冲有效(写低写高) unsigned int en_adc2_cfg:1; //使能ADC 配置 脉冲有效(写低写高)
unsigned int clr_exp:1; //曝光清除 低电平 有效 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 union CamZ_Reg_A
{ {
int value; int value;

View File

@ -29,10 +29,10 @@ enum PIN_PORT_7010
HAVE_OR_NO_PAPER = 3 + 1019, //有无纸(0无纸1有纸) HAVE_OR_NO_PAPER = 3 + 1019, //有无纸(0无纸1有纸)
OPEN_COVER_SENSOR = 4 + 1019, //是否开盖0未开盖1开盖 OPEN_COVER_SENSOR = 4 + 1019, //是否开盖0未开盖1开盖
ULTRASONIC_SENSORS_OUT0 = 18 + 1019, ULTRASONIC_SENSORS_OUT0 = 18 + 901,
ULTRASONIC_SENSORS_OUT1 = 17 + 1019, ULTRASONIC_SENSORS_OUT1 = 17 + 901,
ULTRASONIC_SENSORS_ON = 20 + 1019, ULTRASONIC_SENSORS_ON = 20 + 901,
ULTRASONIC_SENSORS_ADJ = 19 + 1019, ULTRASONIC_SENSORS_ADJ = 19 + 901,
//通道0-------------END //通道0-------------END
SENSOR_POWER = 66 + 1019, SENSOR_POWER = 66 + 1019,
@ -149,10 +149,10 @@ class DeviceExport
public: public:
DeviceExport(); DeviceExport();
private: 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, 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};
}; };

View File

@ -112,11 +112,12 @@ HCamDevice::HCamDevice()
uint8_t val = 0; uint8_t val = 0;
for (int i = 0; i < 20; i++) HtCamSetdivder(true);
{
HtCamReadADCReg(i, &val); unsigned int prriod[2] = {0x183C,0x183C/2};
camera_print("ADDR: 0x%x, Value: 0x%x\n", i, val); HtCamSetPeriod(prriod);
} HtCamWriteFpgaRegs(17, 0x04ce99ff); //扫描传感器阈值
HtCamSetDpi(1); //设置默认300dpi HtCamSetDpi(1); //设置默认300dpi
HtCamSetClolr(0);//设置默认灰色模式 HtCamSetClolr(0);//设置默认灰色模式
@ -143,6 +144,10 @@ HCamDevice::HCamDevice()
value = value & 0xffffff00; value = value & 0xffffff00;
HtCamWriteFpgaRegs(16, VSNP | value); HtCamWriteFpgaRegs(16, VSNP | value);
} }
HtCamWriteFpgaRegs(16, 0x0B0B); //相位
//HtCamChangeTriggerInAndEXt(1); //HtCamChangeTriggerInAndEXt(1);
HtCamInitADCReg(); HtCamInitADCReg();
@ -151,6 +156,12 @@ HCamDevice::HCamDevice()
//devmem 0x40010040 32 0x00000B00 //灰度模式 VSNP值 0x10 //devmem 0x40010040 32 0x00000B00 //灰度模式 VSNP值 0x10
//this->event_thread.reset(new std::thread(&HCamDevice::HtCamEventWorkThread, this)); //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() HCamDevice::~HCamDevice()
@ -254,7 +265,51 @@ void HCamDevice::set_width_hegith(int width,int hegith)
v4lWidth = width; v4lWidth = width;
v4lHeight = hegith; 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) int HCamDevice::HtCamEventWorkThread(void)
{ {
struct pollfd pfd; struct pollfd pfd;
@ -344,7 +399,7 @@ void HCamDevice::HtCamStartVideoCapturing()
else else
{ {
((CAM_INFO_REG *)&pPsReg[CAM_INFO])->cam_run_status = 1; ((CAM_INFO_REG *)&pPsReg[CAM_INFO])->cam_run_status = 1;
camera_print(" stream on succeed\n"); //camera_print(" stream on succeed\n");
} }
startFPGAScan(); startFPGAScan();
return; return;
@ -431,7 +486,7 @@ int HCamDevice::HtCamReadCaptureFrame(void **pbuf, int timeout)
int ret = 0; int ret = 0;
if (( ret = ioctl(videofd, VIDIOC_DQBUF, &buf)) == 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 else
{ {
@ -440,7 +495,7 @@ int HCamDevice::HtCamReadCaptureFrame(void **pbuf, int timeout)
} }
if (ioctl(videofd, VIDIOC_QBUF, &buf) == 0) //出栈一样 if (ioctl(videofd, VIDIOC_QBUF, &buf) == 0) //出栈一样
{ {
camera_print("************QBUF[%d] FINISH**************\n", buf.index); camera_dbg("************QBUF[%d] FINISH**************\n", buf.index);
} }
else else
{ {
@ -574,45 +629,6 @@ int HCamDevice::HtCamStopSampling()
return 0; 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() int HCamDevice::init_sample()
{ {
struct v4l2_subdev_format subdev_fmt; struct v4l2_subdev_format subdev_fmt;
@ -806,56 +822,7 @@ int HCamDevice::init_video_buffer()
return 1; 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) void HCamDevice::HtCamSwitchSampleModes(uint8_t mode)
{ {
@ -871,23 +838,6 @@ void HCamDevice::HtCamSwitchSampleModes(uint8_t mode)
pCamCtrlReg[4] |= (0x00020000); 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) void HCamDevice::HtCamChangeExposureValueB(uint32_t* value)
{ {
if (virBaseAddr == NULL) if (virBaseAddr == NULL)
@ -895,20 +845,69 @@ void HCamDevice::HtCamChangeExposureValueB(uint32_t* value)
return ; return ;
} }
uint32_t *pCamCtrlReg = virBaseAddr; 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; CamZ_Reg_2Short rgb;
rgb.value = HtCamReadFpgaRegs(0x0C); rgb.value = HtCamReadFpgaRegs(0x06);
rgb.NShort[0] = value[1]; rgb.NShort[0] = value[0]; // R通道
rgb.NShort[1] = value[2]; rgb.NShort[1] = value[2]; //B 通道
HtCamWriteFpgaRegs(0x0C,rgb.value); 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]); 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) void HCamDevice::HtCamWriteADCReg_ALL(bool is_gain,bool is_adc1,uint8_t addr, uint8_t data)
{ {
if (virBaseAddr == NULL) if (virBaseAddr == NULL)
return ; return ;
@ -920,7 +919,7 @@ void HCamDevice::HtCamWriteADCReg_ALL(bool is_gain,bool is_adc1,uint8_t addr, ui
else else
addr += 0x0e; //偏移 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 *pCamCtrlReg = virBaseAddr;
uint32_t AdcRegFrame = 0x0000; 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 if (is_adc1) //adc 1
{ {
pCamCtrlReg[7] = (uint32_t)AdcRegFrame; pCamCtrlReg[7] = (uint32_t)AdcRegFrame;
pCamCtrlReg[4] &= ~(EnableAdc2Write);
pCamCtrlReg[4] &= ~(EnableAdc1Write);
std::this_thread::sleep_for(std::chrono::milliseconds(1)); std::this_thread::sleep_for(std::chrono::milliseconds(1));
pCamCtrlReg[4] |= (EnableAdc1Write); pCamCtrlReg[4] |= (EnableAdc2Write);
std::this_thread::sleep_for(std::chrono::milliseconds(1)); std::this_thread::sleep_for(std::chrono::milliseconds(1));
} }
else // adc2 else // adc2
{ {
pCamCtrlReg[0] = (uint32_t)AdcRegFrame; pCamCtrlReg[0] = (uint32_t)AdcRegFrame;
pCamCtrlReg[4] &= ~(EnableAdc2Write); pCamCtrlReg[4] &= ~(EnableAdc1Write);
std::this_thread::sleep_for(std::chrono::milliseconds(1)); std::this_thread::sleep_for(std::chrono::milliseconds(1));
pCamCtrlReg[4] |= (EnableAdc2Write); pCamCtrlReg[4] |= (EnableAdc1Write);
std::this_thread::sleep_for(std::chrono::milliseconds(1)); std::this_thread::sleep_for(std::chrono::milliseconds(1));
} }
} }
void HCamDevice::HtCamWriteADCReg(uint8_t addr, uint8_t data) void HCamDevice::HtCamWriteADCReg(uint8_t addr, uint8_t data)
{ {
if (virBaseAddr == NULL)
{
return ;
}
uint32_t *pCamCtrlReg = virBaseAddr; uint32_t *pCamCtrlReg = virBaseAddr;
uint32_t AdcRegFrame = 0x0000; 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; adcTiming *pAdcRegFrame = (adcTiming *)&AdcRegFrame;
// if (addr > 20) // if (addr > 20)
// return; // return;
pADCReg[addr] = data; pADCReg[data] = addr;
pAdcRegFrame->rwbit = 0; pAdcRegFrame->rwbit = 0;
pAdcRegFrame->regAddr = addr; pAdcRegFrame->regAddr = addr;
pAdcRegFrame->regData = data; pAdcRegFrame->regData = data;
@ -983,13 +980,14 @@ void HCamDevice::HtCamWriteADCReg(uint8_t addr, uint8_t data)
pAdcRegFrame->regAddr1 = addr; pAdcRegFrame->regAddr1 = addr;
pAdcRegFrame->regData1 = data; pAdcRegFrame->regData1 = data;
pCamCtrlReg[7] = (uint32_t)AdcRegFrame;
pCamCtrlReg[7] = (uint32_t)AdcRegFrame;
pCamCtrlReg[4] &= ~(EnableAdc2Write); pCamCtrlReg[4] &= ~(EnableAdc2Write);
std::this_thread::sleep_for(std::chrono::milliseconds(1)); std::this_thread::sleep_for(std::chrono::milliseconds(1));
pCamCtrlReg[4] |= (EnableAdc2Write); pCamCtrlReg[4] |= (EnableAdc2Write);
std::this_thread::sleep_for(std::chrono::milliseconds(1)); std::this_thread::sleep_for(std::chrono::milliseconds(1));
pCamCtrlReg[0] = (uint32_t)AdcRegFrame; pCamCtrlReg[0] = (uint32_t)AdcRegFrame;
pCamCtrlReg[4] &= ~(EnableAdc1Write); 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) void HCamDevice::HtCamReadADCReg_ALL(uint8_t addr)
// { {
// if (virBaseAddr == NULL) if (virBaseAddr == NULL)
// { return ;
// 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; // printf("pAdcRegFrame->value 1111:%0x\r\n",pAdcRegFrame.value);
// uint32_t AdcRegFrame = 0x0000; // printf("pAdcRegFrame->11111 :%d\r\n",pAdcRegFrame.bit.regData);
// uint32_t EnableAdcWrite = (1 << 14);
// uint32_t tempData;
// adcTiming *pAdcRegFrame = (adcTiming *)&AdcRegFrame;
// // if (addr > 0x14) pCamCtrlReg[7] = pAdcRegFrame.value;
// // return;
// pAdcRegFrame->rwbit = 1;
// pAdcRegFrame->regAddr = addr;
// pAdcRegFrame->regData = 0;
// pAdcRegFrame->rwbit1 = 1;
// pAdcRegFrame->regAddr1 = addr;
// pAdcRegFrame->regData1 = 0;
// pCamCtrlReg[7] = (uint32_t)AdcRegFrame; pCamCtrlReg[4] &= ~(EnableAdcWrite1);
// pCamCtrlReg[4] &= ~(EnableAdcWrite); std::this_thread::sleep_for(std::chrono::milliseconds(1));
// std::this_thread::sleep_for(std::chrono::milliseconds(5)); pCamCtrlReg[4] |= (EnableAdcWrite1);
// pCamCtrlReg[4] |= (EnableAdcWrite); std::this_thread::sleep_for(std::chrono::milliseconds(1));
// std::this_thread::sleep_for(std::chrono::milliseconds(10)); pAdcRegFrame.value = HtCamReadFpgaRegs(0x07);
// tempData = pCamCtrlReg[2]; // printf("pAdcRegFrame->value 2222:%0x\r\n",pAdcRegFrame.value);
// uint8_t value = (tempData >> 4) & (0xFF); // printf("pAdcRegFrame->regData2222 :%d\r\n",pAdcRegFrame.bit.regData);
// (*data) = value;
// } 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) 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 *pCamCtrlReg = virBaseAddr;
uint32_t AdcRegFrame = 0x0000; uint32_t AdcRegFrame = 0x0000;
uint32_t EnableAdcWrite = (1 << 14); uint32_t EnableAdcWrite = (1 << 16);
uint32_t tempData; uint32_t tempData;
CIS_ADC_NEW pAdcRegFrame ; CIS_ADC_NEW pAdcRegFrame ;
@ -1056,29 +1077,30 @@ void HCamDevice::HtCamReadADCReg(uint8_t addr, uint8_t *data)
pAdcRegFrame.bit.regData1 = 0; pAdcRegFrame.bit.regData1 = 0;
pCamCtrlReg[7] = pAdcRegFrame.value; pCamCtrlReg[7] = pAdcRegFrame.value;
pCamCtrlReg[4] &= ~(EnableAdcWrite); pCamCtrlReg[4] &= ~(EnableAdcWrite);
std::this_thread::sleep_for(std::chrono::milliseconds(5)); std::this_thread::sleep_for(std::chrono::milliseconds(5));
pCamCtrlReg[4] |= (EnableAdcWrite); pCamCtrlReg[4] |= (EnableAdcWrite);
std::this_thread::sleep_for(std::chrono::milliseconds(10)); std::this_thread::sleep_for(std::chrono::milliseconds(10));
pAdcRegFrame.value = HtCamReadFpgaRegs(0x07); 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); printf("pAdcRegFrame->regData :%d\r\n",pAdcRegFrame.bit.regData);
} }
uint8_t HCamDevice::getADCReg(int addr) uint8_t HCamDevice::getADCReg(int addr)
{ {
if(addr > adcRegSize) // if(addr > adcRegSize)
return 0 ; // return 0 ;
return pADCReg[addr]; // return pADCReg[addr];
} }
void HCamDevice::setADCReg(int addr , uint8_t value) void HCamDevice::setADCReg(int addr , uint8_t value)
{ {
if(addr > adcRegSize) // if(addr > adcRegSize)
return ; // return ;
pADCReg[addr] = value ; // pADCReg[addr] = value ;
} }
// void HCamDevice::saveADCReg() // 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[1] = reg_value;
sp_time.NShort[0] = val; sp_time.NShort[0] = val;
HtCamWriteFpgaRegs(0x03 , sp_time.value); HtCamWriteFpgaRegs(0x03 , sp_time.value);
printf("-----------------------灰度内触发:[%d] 读写间隔:[%d]------------------ \r\n",reg_value,val);
} }
void HCamDevice::HtCamGetSpTime(uint32_t &reg_value) void HCamDevice::HtCamGetSpTime(uint32_t &reg_value)
{ {
@ -1123,6 +1146,11 @@ void HCamDevice::HtCamGetSpTime(uint32_t &reg_value)
sp_time.value = HtCamReadFpgaRegs(0x03); sp_time.value = HtCamReadFpgaRegs(0x03);
reg_value = sp_time.NShort[1]; 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) 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 st_sp.NShort[1] = start_smaple; //灰色 2023-8-3
HtCamWriteFpgaRegs(0x0d , st_sp.value); HtCamWriteFpgaRegs(0x0d , st_sp.value);
printf(" -----------------------st_sp%d------------------\r\n",start_smaple);
} }
void HCamDevice::HtCamGetStSp(uint32_t &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) void HCamDevice::HtCamSetVsnpTime(int color)
{ {
HtCamWriteFpgaRegs(0x10,color?0xD0D0:0xD0D0); CamZ_Reg_2Short st_sp;
//uint32_t *pCamCtrlReg = virBaseAddr; st_sp.value = HtCamReadFpgaRegs(0x10);
//uint32_t ss = start_sample; st_sp.NShort[0] = color;
st_sp.NShort[1] = 0;
//pCamCtrlReg[20] &= ~(0xFFFF0000); // clear HtCamWriteFpgaRegs(0x10 , st_sp.value);
//pCamCtrlReg[20] |= (uint32_t)(ss << 16);
} }
void HCamDevice::HtCamSetFrameCnt(uint32_t val) void HCamDevice::HtCamSetFrameCnt(uint32_t val)
{ {
@ -1167,7 +1195,7 @@ void HCamDevice::HtCamSetFrameCnt(uint32_t val)
void HCamDevice::HtCamGetFrameCnt(uint32_t &val) void HCamDevice::HtCamGetFrameCnt(uint32_t &val)
{ {
val = HtCamReadFpgaRegs(0x14); val = HtCamReadFpgaRegs(0x14);
camera_print("HtCamGetFrameCnt:%d\r\n",val); //camera_print("HtCamGetFrameCnt:%d\r\n",val);
} }
void HCamDevice::HtCamGetFrameNum(uint32_t &val) void HCamDevice::HtCamGetFrameNum(uint32_t &val)
@ -1241,6 +1269,7 @@ void HCamDevice::HtCamSetClolr(int color)
reg_4.value=HtCamReadFpgaRegs(0x04); reg_4.value=HtCamReadFpgaRegs(0x04);
reg_4.color_mode = color; reg_4.color_mode = color;
reg_4.en_frameset = 1; //帧计数默认开启 reg_4.en_frameset = 1; //帧计数默认开启
reg_4.en_pattern = 0;
HtCamWriteFpgaRegs(0x04,reg_4.value); HtCamWriteFpgaRegs(0x04,reg_4.value);
// HtCamSetStSp(color); // HtCamSetStSp(color);
@ -1326,65 +1355,31 @@ void HCamDevice::savePsReg()
void HCamDevice::HtCamWriteAllADC() void HCamDevice::HtCamWriteAllADC()
{ {
for (int index = 0; index < adcRegSize; index++) for (int index = 0; index < 20 ; index++)
{ {
HtCamWriteADCReg(index, pADCReg[index]); HtCamWriteADCReg(index, pADCReg[index]);
//HtCamWriteADCRegA(index, pADCReg[index]);
//HtCamWriteADCRegB(index, pADCReg[index]);
} }
} }
void HCamDevice::HtCamInitADCReg() 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[0] = 0x07;
pADCReg[1] = 0x50; pADCReg[1] = 0x50;//0x50;
/* 1200 cis */
if (_CAM_TYPE == "PYTHONZ_1200")
{
/* gain */ /* gain */
pADCReg[2] = 0x90; pADCReg[2] = 0x90;
pADCReg[3] = 0x00; pADCReg[3] = 0x00;
pADCReg[4] = 0x90; pADCReg[4] = 0x90;
pADCReg[5] = 0x00; pADCReg[5] = 0x00;
pADCReg[6] = 0x90; pADCReg[6] = 0x90;
pADCReg[7] = 0x00; pADCReg[7] = 0x00;
pADCReg[8] = 0x90; pADCReg[8] = 0x90;
pADCReg[9] = 0x00; pADCReg[9] = 0x00;
pADCReg[0xa] = 0x90; pADCReg[0xa] = 0x90;
pADCReg[0xb] = 0x00; pADCReg[0xb] = 0x00;
pADCReg[0xc] = 0x90; pADCReg[0xc] = 0x90;
pADCReg[0xd] = 0x00; pADCReg[0xd] = 0x00;
/* offset */ /* offset */
@ -1393,58 +1388,9 @@ void HCamDevice::HtCamInitADCReg()
pADCReg[0x10] = 0x55; pADCReg[0x10] = 0x55;
pADCReg[0x11] = 0x55; pADCReg[0x11] = 0x55;
pADCReg[0x12] = 0x50; pADCReg[0x12] = 0x50;
pADCReg[0x13] = 0x55; pADCReg[0x13] = 0x55;//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
} }
void HCamDevice::HtCamResizeBuffer(int width, int height, int number) void HCamDevice::HtCamResizeBuffer(int width, int height, int number)
{ {
v4lWidth = width; v4lWidth = width;
@ -1452,7 +1398,6 @@ void HCamDevice::HtCamResizeBuffer(int width, int height, int number)
v4lBufferCount = number; v4lBufferCount = number;
HtCamExitVideoCapturing(); HtCamExitVideoCapturing();
init_fd();
init_sample(); init_sample();
init_capture(); init_capture();
init_video_buffer(); init_video_buffer();

View File

@ -46,9 +46,11 @@ public:
int get_height() { return v4lHeight; } int get_height() { return v4lHeight; }
void set_width_hegith(int , int); void set_width_hegith(int , int);
void HtCamSetPeriod(uint8_t reg_value); //设置扫描仪传感器占空比 void HtCamSetdivder (bool ); //设置扫描仪传感器使能
void HtCamGetPeriod(uint8_t &reg_value);//获取扫描仪传感器占空比 void HtCamGetPeriod(uint8_t &reg_value);//获取扫描仪传感器占空比
void HtCamSetPeriod(uint32_t *reg_value); //设置扫描仪传感器占空比
void HtCamGetFrameCnt(uint32_t &val);//获取设置采集的帧数 void HtCamGetFrameCnt(uint32_t &val);//获取设置采集的帧数
void HtCamGetFrameNum(uint32_t &val);//获取当前已经采集到的第几帧 void HtCamGetFrameNum(uint32_t &val);//获取当前已经采集到的第几帧
@ -56,9 +58,11 @@ public:
void HtCamSetFrameCnt(uint32_t val);//设置需要采集的帧数 void HtCamSetFrameCnt(uint32_t val);//设置需要采集的帧数
uint32_t HtCamReadFpgaRegs(uint8_t reg_addr); //读取寄存器值 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 &reg_value); //获取当前sptime void HtCamGetSpTime(uint32_t &reg_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 HtCamGetStSp(uint32_t &start_sample);
void HtCamSetVsnpTime(int color); void HtCamSetVsnpTime(int color);
@ -66,7 +70,7 @@ public:
void HtCamChangeExposureValueB(uint32_t* value); //曝光值设置 void HtCamChangeExposureValueB(uint32_t* value); //曝光值设置
//void HtCamWriteADCReg(uint8_t addr,uint8_t data); //写adc寄存器 //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/////////////////// ////////////////ADC 寄存器0x00 - 0x14///////////////////
@ -110,6 +114,7 @@ public:
void HtCamWriteAllADC(); void HtCamWriteAllADC();
void HtCamInitADCReg(); void HtCamInitADCReg();
void HtCamWriteADCReg(uint8_t addr,uint8_t data); void HtCamWriteADCReg(uint8_t addr,uint8_t data);
void HtCamWriteADCReg();
void HtCamReadADCReg(uint8_t addr, uint8_t *data); void HtCamReadADCReg(uint8_t addr, uint8_t *data);
void HtCamOverClockClear(); // 清除切换超频标志位 void HtCamOverClockClear(); // 清除切换超频标志位
@ -127,8 +132,6 @@ public:
private: private:
int init_fd();
int init_sample(); int init_sample();
int init_capture(); int init_capture();
int init_video_buffer(); int init_video_buffer();

View File

@ -98,6 +98,7 @@ void MultiFrameCapture::open()
{ {
i = video->HtCamReadCaptureFrame((void **)&buf, 10); i = video->HtCamReadCaptureFrame((void **)&buf, 10);
} }
printf("open_device\r\n");
} }
void MultiFrameCapture::snap() void MultiFrameCapture::snap()
@ -142,7 +143,9 @@ void *MultiFrameCapture::readFrameTest(int timeout)
uint32_t MultiFrameCapture::compute_frame(int paper_size,int dpi) uint32_t MultiFrameCapture::compute_frame(int paper_size,int dpi)
{ {
SIZE size = GetPaperSize((PaperSize)paper_size,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) SIZE MultiFrameCapture::GetPaperSize(PaperSize paper, int dpi)
{ {
@ -151,6 +154,7 @@ SIZE MultiFrameCapture::GetPaperSize(PaperSize paper, int dpi)
SIZE resize{2338,3307}; SIZE resize{2338,3307};
resize.cx = paper_map_[paper].cx * dpi / 25.4; resize.cx = paper_map_[paper].cx * dpi / 25.4;
resize.cy = paper_map_[paper].cy * 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 resize;
} }
return SIZE{2338, 3307}; return SIZE{2338, 3307};
@ -163,8 +167,10 @@ void MultiFrameCapture::UpdateScanParam(HG_ScanConfiguration config)
{ {
return ; return ;
} }
int config_dpi = config.params.dpi;
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_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; color_mode_ = config.params.isColor == 1 ? COLOR : GRAY;
is_correct_ = config.params.isCorrect; is_correct_ = config.params.isCorrect;
paper_size_ = config.params.pageSize; paper_size_ = config.params.pageSize;
@ -179,27 +185,35 @@ void MultiFrameCapture::UpdateScanParam(HG_ScanConfiguration config)
video->HtCamSetClolr(color_mode_); video->HtCamSetClolr(color_mode_);
video->HtCamSetDpi(resolution_); 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); 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); video->HtCamSetFrameCnt(cnt);
printf(" -----------------------设置帧数:%d------------------\r\n",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("resolution_:%d\r\n", resolution_);
printf("color_mode_:%d\r\n", color_mode_); 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("paper_size_:%d\r\n", paper_size_);
printf("cis_width_:%d\r\n", cis_width_); printf("cis_width_:%d\r\n", cis_width_);
printf("cis_height_:%d\r\n", cis_height_); printf("cis_height_:%d\r\n", cis_height_);
printf("pixels_width_:%d\r\n", pixels_width_); printf("pixels_width_:%d\r\n", pixels_width_);
@ -313,25 +327,12 @@ void MultiFrameCapture::setScanFlag(bool brun)
void MultiFrameCapture::reset_fpga() 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() 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->HtCamChangeExposureValueF(fpgaparam.ExposureF);
video->HtCamChangeExposureValueB(fpgaparam.ExposureB); video->HtCamChangeExposureValueB(fpgaparam.ExposureB);
std::vector<unsigned int> 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++) for (int i = 0; i < 6; i++)
{ {
video->HtCamWriteADCReg_ALL(true,true,i,fpgaparam.GainF[i]); video->HtCamWriteADCReg_ALL(true,true,i,fpgaparam.GainF[i]);
video->HtCamWriteADCReg_ALL(false,true,i,fpgaparam.OffsetF[i]); video->HtCamWriteADCReg_ALL(false,true,i,fpgaparam.OffsetF[i]);
video->HtCamWriteADCReg_ALL(true,false,i,fpgaparam.GainB[i]); video->HtCamWriteADCReg_ALL(true,false,i,fpgaparam.GainB[i]);
video->HtCamWriteADCReg_ALL(false,false,i,fpgaparam.OffsetB[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() int MultiFrameCapture::width()
{ {
@ -375,10 +396,13 @@ static int cnt = 0;
void MultiFrameCapture::snaprun() void MultiFrameCapture::snaprun()
{ {
//frame_info 发送得数据信息 channels 图像位深 num 需要取得帧数 time_out读图超时时间设置 //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; unsigned char *data = NULL;
int ret = video->HtCamReadCaptureFrame((void **)&data, time_out); int ret = video->HtCamReadCaptureFrame((void **)&data, time_out);
if (ret == -1 || ret == -2) if (ret == -1 || ret == -2)
{ {
printf("----------------获取图像超时或者失败------------\r\n"); printf("----------------获取图像超时或者失败------------\r\n");
@ -389,35 +413,51 @@ void MultiFrameCapture::snaprun()
printf("--------------fpga send line ------------:%d\r\n",sendLine); printf("--------------fpga send line ------------:%d\r\n",sendLine);
if (data) 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::Mat mat = cv::Mat(frame_info.height, frame_info.width, CV_8UC1, data, cv::Mat::AUTO_STEP);
//cv::imwrite("/home/root/test.png", mat); //cv::imwrite("/home/root/test.png", mat);
// printf("--------------frame_index------------:%d\r\n",frame_index); // printf("--------------frame_index------------:%d\r\n",frame_index);
// if (frame_index == 4) if (cnt == 2)
// { {
// savebitmap(data,15552,512,"1.bmp"); cv::imwrite("/home/root/test.bmp", mat);
// } //cv::imwrite("/home/root/test.bmp", mat);
frame_info.mat = mat.clone(); //savebitmap(data,15552,512,"1.bmp");
m_frameinfos.Put(frame_info); }
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; return ret;
}; };
static int ti = 0;
while (b_snap_run) while (b_snap_run)
{ {
std::unique_lock<std::mutex> lock(m_mtx_snap); std::unique_lock<std::mutex> lock(m_mtx_snap);
m_cv_snap.wait(lock); m_cv_snap.wait(lock);
V4L2_DATAINFO_Ex frame_info; V4L2_DATAINFO_Ex frame_info;
frame_info.pixtype = color_mode_; frame_info.pixtype = color_mode_;
frame_info.dpi = resolution_; frame_info.dpi = resolution_;
frame_info.width = pixels_width_; frame_info.width = pixels_width_;
@ -430,26 +470,33 @@ void MultiFrameCapture::snaprun()
int channels = color_mode_ == 1 ? 3 : 1; int channels = color_mode_ == 1 ? 3 : 1;
int color_mode = video->HtCamGetColorMode(); int color_mode = video->HtCamGetColorMode();
int func_sig = 0; 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; int time_out_cnt = 0;
uint32_t frame_num = 0; uint32_t frame_num = 0;
uint32_t frame_cnt = 0; uint32_t frame_cnt = 0;
video->HtCamGetFrameCnt(frame_cnt); video->HtCamGetFrameCnt(frame_cnt);
frame_info.frame_index = 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.width ------------------ :%d\r\n",frame_info.width );
printf("--------------------- frame_info.pixtype ------------------ :%d\r\n",frame_info.pixtype ); // printf("--------------------- frame_info.height ------------------ :%d\r\n",frame_info.height );
printf("--------------------- frame_info.dpi ------------------ :%d\r\n",frame_info.dpi ); // 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++) for (size_t i = 1; i <= frame_cnt; i++)
{ {
printf("***********设置的帧数:%d 正在采集第[%d]帧************\r\n",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 ) //当前帧取图超时,在取一次!!! 一直超时 不就卡死了??? 这个地方还是需要加个时间限制几秒内一帧未取出就退了,返回异常状态吧? if (func_sig == -1 ) //当前帧取图超时,在取一次!!! 一直超时 不就卡死了??? 这个地方还是需要加个时间限制几秒内一帧未取出就退了,返回异常状态吧?
{ {
i--; i--;
@ -465,11 +512,14 @@ void MultiFrameCapture::snaprun()
if (b_stop_snap) if (b_stop_snap)
{ {
video->HtCamGetFrameNum(frame_num); video->HtCamGetFrameNum(frame_num);
int val = frame_num - i; //剩余还未采集的帧数
while (frame_num-1 > func_sig) int ind = i++; //只是计数确认采集到低多少帧,无其他实用意义
while (val)
{ {
func_sig = snap_func(frame_info, channels,frame_num,time_out);//同上面一样 frame_info.last_frame = val == 1 ? true : false;
printf("-----------当前采集到第:[%d]帧 CIS总共采集[%d]帧 -------\r\n",func_sig+1,frame_num); func_sig = snap_func(frame_info, channels,time_out);//同上面一样
printf("-----------当前采集到第:[%d]帧 CIS总共采集[%d]帧 -------\r\n",ind,frame_num);
if (func_sig == -1 ) if (func_sig == -1 )
{ {
time_out +=200; time_out +=200;
@ -480,13 +530,23 @@ void MultiFrameCapture::snaprun()
} }
continue; continue;
} }
val--;
ind++;
//this_thread::sleep_for(std::chrono::milliseconds(65));
} }
break; break;
} }
////////////////////////////非常重要/////////////////////////
////////////////////////////采集速度18 - 20ms/////////////////////////
////////////////////////////传图速度88 - 89ms/////////////////////////
////////////////////////////采集过快会导致队列堆积/////////////////////////
////////////////////////////所以这个延时是采集速度和传图速度的差值/////////////////////////
////////////////////////////DPI 颜色不同 会导致数据大小不同所以这个地方延时肯定不一样 目前 60是200dpi/////////////////////////
this_thread::sleep_for(std::chrono::milliseconds(35));
} }
video->HtCamStopVideoCapturing(); video->HtCamStopVideoCapturing();
printf("----------停止采集图像 ----------\r\n"); printf("---------- 退出图像采集流程 ----------\r\n");
m_cv_snapdone.notify_all(); m_cv_snapdone.notify_all();
b_end_snap = true; b_end_snap = true;
@ -508,24 +568,39 @@ void MultiFrameCapture::procimage()
unsigned int frames_height; unsigned int frames_height;
unsigned int frames_width = 0; unsigned int frames_width = 0;
int cnt_ =0; int cnt_ =0;
StopWatch sw;
while (b_imgproc) while (b_imgproc)
{ {
sw.reset();
V4L2_DATAINFO_Ex frame = m_frameinfos.Take(); V4L2_DATAINFO_Ex frame = m_frameinfos.Take();
static int inx = 0; static int inx = 0;
if (!frame.mat.empty()) 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); 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.first_frame = frame.first_frame;
info.last_frame = frame.last_frame; info.last_frame = frame.last_frame;
info.index_frame = frame.frame_index; info.index_frame = frame.frame_index;
info.data_type = 0; info.data_type = 0;
info.width = frame.width; info.width = frame.width;
info.height = frame.height; 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); 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; continue;
} }
} }
static int temp_val = 0;
bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black) bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black)
{ {
int config_dpi = dpi == 1 ? 2 : dpi; int config_dpi = dpi == 1 ? 2 : dpi;
const int offset_indexs[] = {3, 4, 5, 2, 1, 0,0, 1, 2, 5, 4, 3}; const int offset_indexs[] = {3, 4, 5, 2, 1, 0 ,0, 1, 2, 5, 4, 3};
int channels = mode == IMAGE_COLOR ? 3 : 1; int channels = mode == IMAGE_COLOR ? 3 : 1;
int height = 60; int height = 60;
int width = config_dpi == 0x02 ? 864 : (config_dpi == 0x03 ? 1728 : 864); int width = config_dpi == 0x02 ? 864 : (config_dpi == 0x03 ? 1728 : 864);
int orgimgwidth = width * 2 * 3 * channels; int orgimgwidth = width * 2 * 3 * channels;
int dstwidth = width * 2 * 3; int dstwidth = width * 2 * 3;
bool isNeedSave = true; bool isNeedSave = true;
string log; string log;
@ -564,18 +639,25 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black)
cv::Mat src(height, orgimgwidth, CV_8UC1, data); cv::Mat src(height, orgimgwidth, CV_8UC1, data);
CImageMerge t_marge; 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); printf("mrgmat width = %d height = %d temp_val=%d\n", mrgmat.cols, mrgmat.rows,temp_val);
static int inx = 0; int inx = 0;
imwrite(to_string(++inx)+".bmp",mrgmat); if (temp_val == 0 && !black)
return 1; {
//inx+=1;
//temp_val++;
//imwrite(to_string(inx) + ".bmp", mrgmat);
}
//return 0;
FPGAConfigParam param = GetFpgaparam(dpi, mode); FPGAConfigParam param = GetFpgaparam(dpi, mode);
if (black) // 暗场 if (black) // 暗场
{ {
volatile double offValues[12]{0}; volatile double offValues[12]{0};
double offValues_min[12]{0}; double offValues_min[12]{0};
int blockcount = 12; int blockcount = 12;
int bandwidth = mrgmat.cols / blockcount; int bandwidth = mrgmat.cols / blockcount;
for (int n = 0; n < blockcount; n++) 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::Mat img = mrgmat(cv::Rect(bandwidth * n, 10, bandwidth, mrgmat.rows - 10)).clone();
cv::Scalar mean = cv::mean(img); cv::Scalar mean = cv::mean(img);
offValues[n] = mean.val[0]; offValues[n] = mean.val[0];
if(mode) if (mode)
{ {
auto tmp = *std::min_element(img.begin<cv::Vec3b>(), auto tmp = *std::min_element(img.begin<cv::Vec3b>(),
img.end<cv::Vec3b>(),[](cv::Vec3b a,cv::Vec3b b)->bool{return (a[0]+a[1]+a[2]) < (b[0]+b[1]+b[2]) ;}); img.end<cv::Vec3b>(), [](cv::Vec3b a, cv::Vec3b b) -> bool
offValues_min[n] = (tmp[0]+tmp[1]+tmp[2])/3.0; { 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 else
{ {
offValues_min[n] = *std::min_element(img.begin<std::uint8_t>(), offValues_min[n] = *std::min_element(img.begin<std::uint8_t>(),
img.end<std::uint8_t>(),[](std::uint8_t a,std::uint8_t b)->bool{return a < b;}); img.end<std::uint8_t>(), [](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++) 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; int k = s * 6 + j;
// double diff = BLACK_DIFF(offValues[k]); // double diff = BLACK_DIFF(offValues[k]);
//double diff = 8 - offValues[k]; // double diff = 8 - offValues[k];
double diff = 3-offValues_min[k]; double diff = 3 - offValues_min[k];
if(offValues[k] > 25) if (offValues[k] > 15)
{ {
diff = 25 -offValues[k]; diff = 15 - offValues[k];
} }
double step = radio * diff; double step = radio * diff;
// int preStep = offsetStep[k]; // int preStep = offsetStep[k];
@ -635,7 +719,7 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black)
printf("\r\n"); printf("\r\n");
isOutBounds |= offsets[j] <= 0 && step < 0; 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"; 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) if (isOutBounds)
log += "" + std::to_string(k) + "条带暗场校正异常,暗场值无法降低 \r\n"; log += "" + std::to_string(k) + "条带暗场校正异常,暗场值无法降低 \r\n";
else if (abs(step) > 1 || isMinStep) else if (abs(step) > 1 || isMinStep)
@ -673,7 +757,10 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black)
if (m_glue.m_deviceevent) if (m_glue.m_deviceevent)
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log);
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 // 明场 else // 明场
@ -681,13 +768,18 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black)
if (mode == IMAGE_COLOR) if (mode == IMAGE_COLOR)
{ {
volatile double values[2][3]; volatile double values[2][3];
cv::Scalar a = cv::mean(mrgmat(cv::Rect(0, 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, 0, mrgmat.cols / 2, mrgmat.rows))); 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++) for (char j = 0; j < 3; j++)
{ {
values[0][j] = a.val[j]; values[0][j] = a.val[2-j];
values[1][j] = b.val[j]; values[1][j] = b.val[2-j];
printf("values[0][%d] = %.2f values[1][%d] = %.2f\n", j,values[0][j], j,values[1][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"; log = "开始彩色明场校正 \r\n";
@ -700,8 +792,8 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black)
for (int x = 0; x < 3; x++) for (int x = 0; x < 3; x++)
{ {
int k = (3 * s + x); int k = (3 * s + x);
//int diff = LIGHT_DIFF(*((double *)values + k)); // int diff = LIGHT_DIFF(*((double *)values + k));
int diff = param.MaxBright - *((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"; log += " 明场:" + std::to_string(k) + ";diff" + std::to_string(diff) + "\r\n";
double step = diff * radio; double step = diff * radio;
@ -738,6 +830,7 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black)
memcpy((s == 0 ? &param.ExposureF[0] : &param.ExposureB[0]), (void *)exposures, sizeof(param.ExposureB)); memcpy((s == 0 ? &param.ExposureF[0] : &param.ExposureB[0]), (void *)exposures, sizeof(param.ExposureB));
} }
// ftt.append_log(log); // ftt.append_log(log);
printf("\n%s",log.c_str());
if (m_glue.m_deviceevent) if (m_glue.m_deviceevent)
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); 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) if (m_glue.m_deviceevent)
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log);
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 else
@ -763,8 +858,8 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black)
for (int s = 0; s < 2; s++) for (int s = 0; s < 2; s++)
{ {
int *exposures = (int *)(s == 0 ? param.ExposureF : param.ExposureB); int *exposures = (int *)(s == 0 ? param.ExposureF : param.ExposureB);
//int diff = LIGHT_DIFF(values[s]); // int diff = LIGHT_DIFF(values[s]);
int diff = param.MaxBright - values[s]; int diff = 170 - values[s];;//param.MaxBright - values[s];
double step = diff * radio; double step = diff * radio;
log += " 明场:" + to_string(s) + ";diff" + to_string(diff) + "\r\n"; log += " 明场:" + to_string(s) + ";diff" + to_string(diff) + "\r\n";
int preStep = expStep[s][0]; int preStep = expStep[s][0];
@ -820,7 +915,9 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black)
if (m_glue.m_deviceevent) if (m_glue.m_deviceevent)
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log);
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) void MultiFrameCapture::correctcolor(int correctmode)
{ {
StopWatch sw_correct; StopWatch sw_correct;
std::string loginfo = "Start Correctcolor 200DPI COLOR \r\n"; std::string loginfo = "Start Correctcolor 300DPI Gray \r\n";
if ((correctmode == 0) || (correctmode == 2)) printf("----------- %s \n",loginfo.c_str());
{ //creatcorrectconfig(0x02, IMAGE_GRAY);
loginfo = "Start Correctcolor 200DPI COLOR \r\n"; printf("----------- done \n",loginfo.c_str());
if (m_glue.m_deviceevent)
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); loginfo = "Start Correctcolor 300DPI COLOR \r\n";
creatcorrectconfig(0x01, IMAGE_COLOR); printf("----------- %s \n",loginfo.c_str());
loginfo = "-----------200DPI COLOR Correct Done----------- \r\n\r\n "; creatcorrectconfig(0x02, IMAGE_COLOR);
if (m_glue.m_deviceevent) printf("----------- done \n",loginfo.c_str());
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo);
}
if ((correctmode == 0) || (correctmode == 1)) // if ((correctmode == 0) || (correctmode == 2))
{ // {
loginfo = "Start Correctcolor 200DPI GRAY \r\n"; // loginfo = "Start Correctcolor 200DPI COLOR \r\n";
if (m_glue.m_deviceevent) // if (m_glue.m_deviceevent)
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo);
creatcorrectconfig(0x01, IMAGE_GRAY); // creatcorrectconfig(0x01, IMAGE_COLOR);
loginfo = "-----------200DPI Gray Correct Done----------- \r\n\r\n"; // loginfo = "-----------200DPI COLOR Correct Done----------- \r\n\r\n ";
if (m_glue.m_deviceevent) // if (m_glue.m_deviceevent)
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo);
} // }
if ((correctmode == 0) || (correctmode == 4)) // if ((correctmode == 0) || (correctmode == 1))
{ // {
loginfo = " Start Correctcolor 300DPI COLOR \r\n"; // loginfo = "Start Correctcolor 200DPI GRAY \r\n";
if (m_glue.m_deviceevent) // if (m_glue.m_deviceevent)
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo);
creatcorrectconfig(0x02, IMAGE_COLOR); // creatcorrectconfig(0x01, IMAGE_GRAY);
loginfo = "-----------300DPI COLOR Correct Done----------- \r\n\r\n "; // loginfo = "-----------200DPI Gray Correct Done----------- \r\n\r\n";
if (m_glue.m_deviceevent) // if (m_glue.m_deviceevent)
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo);
} // }
if ((correctmode == 0) || (correctmode == 3)) // if ((correctmode == 0) || (correctmode == 4))
{ // {
loginfo = "Start Correctcolor 300DPI GRAY \r\n"; // loginfo = " Start Correctcolor 300DPI COLOR \r\n";
if (m_glue.m_deviceevent) // if (m_glue.m_deviceevent)
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo);
creatcorrectconfig(0x02, IMAGE_GRAY); // creatcorrectconfig(0x02, IMAGE_COLOR);
loginfo = "-----------300DPI Gray Correct Done----------- \r\n\r\n "; // loginfo = "-----------300DPI COLOR Correct Done----------- \r\n\r\n ";
if (m_glue.m_deviceevent) // if (m_glue.m_deviceevent)
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo);
} // }
if ((correctmode == 0) || (correctmode == 6)) // if ((correctmode == 0) || (correctmode == 3))
{ // {
loginfo = "Start Correctcolor 600DPI COLOR \r\n"; // loginfo = "Start Correctcolor 300DPI GRAY \r\n";
if (m_glue.m_deviceevent) // if (m_glue.m_deviceevent)
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo);
creatcorrectconfig(0x03, IMAGE_COLOR); // creatcorrectconfig(0x02, IMAGE_GRAY);
loginfo = "-----------600DPI COLOR Correct Done----------- \r\n\r\n"; // loginfo = "-----------300DPI Gray Correct Done----------- \r\n\r\n ";
if (m_glue.m_deviceevent) // if (m_glue.m_deviceevent)
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo);
} // }
if ((correctmode == 0) || (correctmode == 5)) // if ((correctmode == 0) || (correctmode == 6))
{ // {
loginfo = " Start Correctcolor 600DPI GRAY \r\n"; // loginfo = "Start Correctcolor 600DPI COLOR \r\n";
if (m_glue.m_deviceevent) // if (m_glue.m_deviceevent)
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); // m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo);
creatcorrectconfig(0x03, IMAGE_GRAY); // creatcorrectconfig(0x03, IMAGE_COLOR);
loginfo = "-----------600DPI Gray Correct Done----------- \r\n\r\n "; // loginfo = "-----------600DPI COLOR Correct Done----------- \r\n\r\n";
if (m_glue.m_deviceevent) // if (m_glue.m_deviceevent)
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, loginfo); // 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)) if ((correctmode < 0) || (correctmode > 6))
{ {
loginfo = "不支持的校正模式...\r\n"; loginfo = "不支持的校正模式...\r\n";
@ -926,37 +1033,59 @@ void MultiFrameCapture::openDevice(int dpi, int mode)
int width = channelwidth * channels; int width = channelwidth * channels;
int frame_height = mode == 0x01 ? 60 * 3 : 60; int frame_height = mode == 0x01 ? 60 * 3 : 60;
int startsample = 202; // 205 int startsample = 202; // 205
auto fpgaparam = GetFpgaparam(dpi, mode);
int t_real_dpi = dpi == 1 ? 2 : (dpi == 2 ? 2 : 3); 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 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; color_mode_ = mode == 1 ? COLOR : GRAY;
cis_width_ = resolution_ == 0 ? WIDTH * 2 : WIDTH; //宽 :DPI不变下 彩色灰度是一样的 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; cis_height_ = mode == 0x01 ? 60 * 3 : 60;
pixels_width_ = color_mode_ == 1 ? cis_width_ * 3 : cis_width_; pixels_width_ = color_mode_ == 1 ? cis_width_ * 3 : cis_width_;
pixels_height_ = color_mode_ == 1 ? cis_height_ / 3 : cis_height_; 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); int config_dpi = resolution_ == DPI_600 ? 3 : 2;
printf("采集宽:%d 高:%d\r\n",cis_width_,cis_height_); int config_color = color_mode_ ==COLOR ? 1:0;
printf("像素宽:%d 高: %d\r\n",pixels_width_,pixels_height_);
configFPGAParam(mode, dpi);
StopWatch swwv4l2open; StopWatch swwv4l2open;
video->HtCamSetClolr(color_mode_); video->HtCamSetClolr(color_mode_);
video->HtCamSetDpi(resolution_); 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_); int ret = video->open_device(cis_width_,cis_height_);
if(ret < -1) if(ret < -1)
return; return;
@ -969,7 +1098,7 @@ void MultiFrameCapture::openDevice(int dpi, int mode)
} }
//video->close_video(); //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) void MultiFrameCapture::creatcorrectconfig(int dpi, int mode)
@ -981,16 +1110,21 @@ void MultiFrameCapture::creatcorrectconfig(int dpi, int mode)
radio = 1; radio = 1;
while (!isDone) // 先暗场 while (!isDone) // 先暗场
{ {
//break ;
string log = "==============================第" + to_string(i) + "次===============================\r\n"; string log = "==============================第" + to_string(i) + "次===============================\r\n";
// ftt.append_log(log); // ftt.append_log(log);
if (m_glue.m_deviceevent) if (m_glue.m_deviceevent)
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); 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); // ftt.append_log(log);
printf("log :%s\r\n",log.c_str()); printf("log :%s\r\n",log.c_str());
std::this_thread::sleep_for(std::chrono::milliseconds(5)); 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->HtCamChangeExposureValueF(F);
video->HtCamChangeExposureValueB(F); video->HtCamChangeExposureValueB(F);
std::this_thread::sleep_for(std::chrono::milliseconds(5)); 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)); 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 isDone = saveLutImg(dpi, mode, true); // 0 color_black 1 color_white 2 gray_balck 3 gray_white
video->HtCamStopVideoCapturing(); video->HtCamStopVideoCapturing();
//video->close_device(); //video->close_device();
this_thread::sleep_for(std::chrono::milliseconds(200)); this_thread::sleep_for(std::chrono::milliseconds(200));
i++; i++;
@ -1011,17 +1146,27 @@ void MultiFrameCapture::creatcorrectconfig(int dpi, int mode)
formatStep(); formatStep();
while (!isDone) // 后明场 while (!isDone) // 后明场
{ {
configFPGAParam(mode, dpi);
string log = "==============================第" + to_string(i) + "次===============================\r\n"; string log = "==============================第" + to_string(i) + "次===============================\r\n";
// ftt.append_log(log); // ftt.append_log(log);
if (m_glue.m_deviceevent) if (m_glue.m_deviceevent)
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log); 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)); 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)); std::this_thread::sleep_for(std::chrono::milliseconds(5));
m_capFpageregs->capture(); isDone = saveLutImg(dpi, mode, false); // 0 color_black 1 color_white 2 gray_balck 3 gray_white
std::this_thread::sleep_for(std::chrono::milliseconds(5)); video->HtCamStopVideoCapturing();
isDone = saveLutImg(dpi, mode, false); // video->close_device();
this_thread::sleep_for(std::chrono::seconds(2));
i++; i++;
} }
printf("creatcorrectconfig %s \n", (mode == IMAGE_COLOR ? " Color" : " Gray")); printf("creatcorrectconfig %s \n", (mode == IMAGE_COLOR ? " Color" : " Gray"));

View File

@ -12,7 +12,7 @@ class Gpio;
class GpioOut; class GpioOut;
#define WIDTH 5184 #define WIDTH 5184
#define HEIGHT 513 //只能为3的倍数 #define HEIGHT 513 //只能为3的倍数
#define DPI_600 0 #define DPI_600 0
#define DPI_300 1 #define DPI_300 1
#define COLOR 1 #define COLOR 1
@ -93,6 +93,8 @@ private:
unsigned int color_mode_; // 颜色模式 unsigned int color_mode_; // 颜色模式
unsigned int is_correct_; // 是否校正 unsigned int is_correct_; // 是否校正
unsigned int is_double_paper_; // 是否启动双张检测 unsigned int is_double_paper_; // 是否启动双张检测
cv::Mat lut;
std::map<PaperSize, SIZE> paper_map_ std::map<PaperSize, SIZE> paper_map_
{ {
{PaperSize::G400_A3,SIZE{297,420}}, {PaperSize::G400_A3,SIZE{297,420}},
@ -112,7 +114,7 @@ private:
}; };
SIZE GetPaperSize(PaperSize paper, int dpi); 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: public:
MultiFrameCapture(ScannerGlue glue, std::shared_ptr<FpgaComm> fpga, CISVendor vendor); MultiFrameCapture(ScannerGlue glue, std::shared_ptr<FpgaComm> fpga, CISVendor vendor);

View File

@ -73,8 +73,10 @@ Scanner::Scanner(ScannerGlue glue)
} }
}; };
sensor = std::make_shared<Sensor>(sysEvent); sensor = std::make_shared<Sensor>(sysEvent);
this_thread::sleep_for(std::chrono::milliseconds(50));
m_keyboard.reset(new huagao::Keyboard(btnevent)); m_keyboard.reset(new huagao::Keyboard(btnevent));
m_keyboard->init(); m_keyboard->init();
this_thread::sleep_for(std::chrono::milliseconds(50));
motorZouzhi.enablePower(true); motorZouzhi.enablePower(true);
motorZouzhi.setSpeed(4000); motorZouzhi.setSpeed(4000);
motorCuozhi.setSpeed(3000); motorCuozhi.setSpeed(3000);
@ -87,6 +89,7 @@ Scanner::Scanner(ScannerGlue glue)
FsmState::setScanner(this); FsmState::setScanner(this);
threadRunMessageLoop = std::thread(&Scanner::runMessageLoop, this); threadRunMessageLoop = std::thread(&Scanner::runMessageLoop, this);
Motor::enablePower(true); Motor::enablePower(true);
this_thread::sleep_for(std::chrono::milliseconds(200));
//meminfo = MemoryInfo::GetInstance(); //meminfo = MemoryInfo::GetInstance();
//GetSysInfo(); //GetSysInfo();
} }
@ -207,26 +210,39 @@ void Scanner::runScan()
{ {
LOG("-------------Scanner RunScan Start-------------\r\n"); LOG("-------------Scanner RunScan Start-------------\r\n");
capturer->open(); capturer->open();
printf("11111111111111111111\r\n");
motorZouzhi.start(); motorZouzhi.start();
motorCuozhi.pauseWaitForThread(); motorCuozhi.pauseWaitForThread();
//capturer->open(); //capturer->open();
sensor->enableDoubleSensor(false); sensor->enableDoubleSensor(false);
if (!isPaperInit) if (!isPaperInit)
{ {
preFeed(); preFeed();
isPaperInit = true; isPaperInit = true;
} }
for (size_t i = 0; i < 16; i++) // for (size_t i = 0; i < 16; i++)
{ // {
std::cout << string_format("reg[%d] = 0x%08x", i, capturer->read(i)) << std::endl; // std::cout << string_format("reg[%d] = 0x%08x", i, capturer->read(i)) << std::endl;
} // }
this_thread::sleep_for(std::chrono::milliseconds(200));
imageindex = 0; imageindex = 0;
capturer->setFPGATriggerMode(false, 0); //*capturer->setFPGATriggerMode(false, 0);
capturer->setFanMode(3);
//capturer->setFanMode(3);
sensor->resetPaperPin(); sensor->resetPaperPin();
capturer->clearimages(); capturer->clearimages();
capturer->resetimageremain(); capturer->resetimageremain();
capturer->setScanFlag(true); capturer->setScanFlag(true);
bool b_autosize = m_config.params.pageSize==(int)PaperSize::G400_AUTO || bool b_autosize = m_config.params.pageSize==(int)PaperSize::G400_AUTO ||
m_config.params.pageSize==(int)PaperSize::G400_MAXAUTO || 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) if(m_config.params.pageSize == 17 || m_config.params.pageSize == 19)
max = 200; max = 200;
LOG("paper pauseWaitForThread \n"); LOG("paper pauseWaitForThread \n");
waitpapertime = 400; waitpapertime = 200;
while (!sensor->waitPaperOut(waitpapertime) && i < max) while (!sensor->waitPaperOut(waitpapertime) && i < max)
{ {
i++; 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(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()); LOG("\nclose b_autosize %s\n",GetCurrentTimeStamp(2).c_str());
capturer->stopsnap(b_autosize); capturer->stopsnap(b_autosize);
capturer->waitsnapdone(m_isDoublePaper || m_jamPaper);//等待采集完成 capturer->waitsnapdone(m_isDoublePaper || m_jamPaper);//等待采集完成
@ -383,10 +399,16 @@ void Scanner::runScan()
break; break;
} }
sw.reset(); 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(); std::this_thread::yield();
//printf("7777777777777777777777777777777777777\r\n");
this_thread::sleep_for(std::chrono::milliseconds(200));
}
else else
{ {
LOG("\n ----------------EXIT 3333---------------- \n"); LOG("\n ----------------EXIT 3333---------------- \n");

View File

@ -23,23 +23,31 @@ Sensor::Sensor(BlockingQueue<ScanEvent> &sysEvents)
sensor_power(PIN_PORT_7010::SENSOR_POWER) sensor_power(PIN_PORT_7010::SENSOR_POWER)
{ {
pwm2.enable(Gpio::High);
pwm2.setFreq(2583); 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); coverPin.setDirection(Gpio::in);
paperPin.setDirection(Gpio::in); paperPin.setDirection(Gpio::in);
scanPin.setDirection(Gpio::in);
double_out0_Pin.setDirection(Gpio::in); double_out0_Pin.setDirection(Gpio::in);
double_out1_Pin.setDirection(Gpio::in); double_out1_Pin.setDirection(Gpio::in);
//paperJamPin.setDirection(Gpio::in); sensor_power.setDirection(Gpio::in);
scanPin.setDirection(Gpio::in);
scanPin.setEdge(Gpio::both);
doubleEnablePin.setDirection(Gpio::out); doubleEnablePin.setDirection(Gpio::out);
//////////中断模式///////
double_out0_Pin.setEdge(Gpio::both);
double_out1_Pin.setEdge(Gpio::both);
doubleEnablePin.setEdge(Gpio::both);
coverPin.setEdge(Gpio::both); coverPin.setEdge(Gpio::both);
paperPin.setEdge(Gpio::both); paperPin.setEdge(Gpio::both);
double_out0_Pin.setEdge(Gpio::both); scanPin.setEdge(Gpio::both);
double_out1_Pin.setEdge(Gpio::both);
//std::cout<<"scanPin "<< scanPin.getValue()<<std::endl; //std::cout<<"scanPin "<< scanPin.getValue()<<std::endl;
thread_monitor = std::thread(&Sensor::monitor, this); thread_monitor = std::thread(&Sensor::monitor, this);
@ -181,8 +189,8 @@ void Sensor::monitor2()
std::vector<Gpio *> gpios; std::vector<Gpio *> gpios;
gpios.push_back(&coverPin); gpios.push_back(&coverPin);
gpios.push_back(&paperPin); gpios.push_back(&paperPin);
//gpios.push_back(&double_out0_Pin); gpios.push_back(&double_out0_Pin);
//gpios.push_back(&double_out1_Pin); gpios.push_back(&double_out1_Pin);
std::vector<pollfd> pollfds; std::vector<pollfd> pollfds;
pollfd pfd; pollfd pfd;
int ret = 0; int ret = 0;
@ -224,25 +232,57 @@ void Sensor::monitor2()
{ {
if (pollfds[i].revents) if (pollfds[i].revents)
{ {
fd = pollfds[i].fd; ret = readfile(pollfds[i].fd,num,buf);
lseek(fd, 0, SEEK_SET);
num = read(fd, buf, 8);
buf[num - 1] = '\0';
ret = atoi(buf);
//LOG("event id : %d i= %d \n",evts[i * 2 + ret] , i ); //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()); double_1 = ret;
enableDoubleSensor(false); 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); 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);
}

View File

@ -35,6 +35,7 @@ public:
bool waitPaperStandBy(int timeout_ms); bool waitPaperStandBy(int timeout_ms);
//取消等待纸张 //取消等待纸张
void cancelWaitPaper(); void cancelWaitPaper();
//双张使能
private: private:
@ -59,7 +60,9 @@ private:
std::thread thread_monitor2; std::thread thread_monitor2;
volatile bool bMonitor = true; volatile bool bMonitor = true;
volatile bool bMonitor2 = true; volatile bool bMonitor2 = true;
volatile bool double_1 = false;
volatile bool double_2 = false;
void monitor(); void monitor();
void monitor2(); void monitor2();
int readfile(int fd,int num , char* buf);
}; };

View File

@ -126,6 +126,7 @@ UsbScanner::UsbScanner() : m_startscan(false),
{ {
imageremain++; imageremain++;
m_images.Put(imageinfo); 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); // LOG("Enqueue image index :%d ptr:%p length:%d\n", ++enqueueindex,imageinfo.pJpegData, imageinfo.DataLength);
}; };

View File

@ -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))); 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) void creatLUTData(int dpi, int mode)
{ {
printf("eneter creatLUTData \n"); printf("eneter creatLUTData \n");
@ -159,6 +167,45 @@ void creatLUTData(int dpi, int mode)
printf("exit creatLUTData \n"); 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) FPGAConfigParam GetFpgaparam(int dpi, int mode)
{ {
return correctparam.GetFpgaparam(dpi, mode); return correctparam.GetFpgaparam(dpi, mode);
@ -180,7 +227,7 @@ cv::Mat colMean(const cv::Mat &image)
float gamma(float value, float ex) 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 #define GAMMA_EX 1.7f
@ -327,8 +374,8 @@ cv::Mat createLUT(const std::vector<cv::Mat> &mats, bool isTextCorrect)
cv::Mat calcLUT(const cv::Mat &black, const cv::Mat &white, bool isTextCorrection) cv::Mat calcLUT(const cv::Mat &black, const cv::Mat &white, bool isTextCorrection)
{ {
std::vector<cv::Mat> w; std::vector<cv::Mat> w;
w.push_back(colMean(black)); w.push_back(black);
w.push_back(colMean(white)); w.push_back(white);
cv::Mat lut = createLUT(w, isTextCorrection); cv::Mat lut = createLUT(w, isTextCorrection);
for (size_t i = 0, block = lut.rows / CHANNEL; i < block; i++) 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; 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) cv::Mat create_lut(const cv::Mat &black, const cv::Mat &white, int dpi, bool colormode)
{ {
#ifndef USE_NEWFLAT #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) 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);
} }

View File

@ -16,14 +16,20 @@ void setOffset(int *config, int step);
cv::Mat calcLUT(const cv::Mat& black, const cv::Mat& white, bool isTextCorrection); 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); cv::Mat extractRepresentRow2(const cv::Mat& src);
void initLut(const std::string lutpath,bool iscolor); 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, int dpi,int mode,bool isTextCorrect=true);
void correctColor(cv::Mat& src, cv::Mat& lut);
void creatLUTData(int dpi , int mode); void creatLUTData(int dpi , int mode);
cv::Mat creatLUTData_7010(int dpi , int mode);
FPGAConfigParam GetFpgaparam(int dpi,int mode); FPGAConfigParam GetFpgaparam(int dpi,int mode);
void SaveFpgaparam(FPGAConfigParam& param); void SaveFpgaparam(FPGAConfigParam& param);

View File

@ -255,7 +255,8 @@ int main(int argc, char *argv[])
while (b_runloop) while (b_runloop)
{ {
StopWatch sw;
sw.reset();
if (!m_scanner->is_connect()) if (!m_scanner->is_connect())
{ {
printf("USB DISCONNECT DISCONNECT DISCONNECT DISCONNECT DISCONNECT DISCONNECT DISCONNECT\n"); printf("USB DISCONNECT DISCONNECT DISCONNECT DISCONNECT DISCONNECT DISCONNECT DISCONNECT\n");
@ -273,6 +274,7 @@ int main(int argc, char *argv[])
continue; continue;
} }
// printf("Usb command %d \n",usbcb.Command); // printf("Usb command %d \n",usbcb.Command);
switch ((USBCommand)usbcb.Command) switch ((USBCommand)usbcb.Command)
{ {
case USBCommand::GET_DSP_STATUS: case USBCommand::GET_DSP_STATUS:
@ -337,88 +339,54 @@ int main(int argc, char *argv[])
break; break;
case USBCommand::GET_IMAGE: case USBCommand::GET_IMAGE:
{ {
HG_JpegCompressInfo info = m_scanner->GetImage(); 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) if (info.pJpegData != nullptr && info.DataLength != 0)
{ {
int tt = m_scanner->write_bulk((void*)&info, sizeof(int)*7); 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; //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); //LOG("GET_IMAGE info.pJpegData =%p info.DataLength=%d \n", info.pJpegData, info.DataLength);
int index = 0; int index = 0;
while (info.DataLength > 0) int total = info.DataLength;
while (total > 0)
{ {
int dstlength = 1024 * 512; int dstlength = 1024 * 512;
if (info.DataLength <= dstlength) if (total <= dstlength)
{ {
dstlength = info.DataLength; dstlength = total;
info.DataLength = 0; // jpeg图像小于1MB 则一次传输 total = 0; // jpeg图像小于1MB 则一次传输
} }
else //压缩大于1MB的图像 分包传输 else //压缩大于1MB的图像 分包传输
{ {
info.DataLength -= dstlength; total -= dstlength;
} }
int tt = m_scanner->write_bulk(info.pJpegData + index, 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) if (tt <= -1)
{ {
LOG("FAIL GET_IMAGE write bulk data error\n"); 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; break;
} }
else else
index += tt; index += tt;
} }
//free(info.pJpegData);
tjFree(info.pJpegData); tjFree(info.pJpegData);
LOG("Free info.pJpegData done\n"); LOG("Free info.pJpegData done\n");
printf("TIME!!!!!!!!!!!!! :%f info.DataLength:%d\r\n",sw.elapsed_ms(),info.DataLength);
} }
} }
break; break;

View File

@ -37,7 +37,7 @@ using namespace std;
#ifdef _LOG #ifdef _LOG
#define LOG printf #define LOG printf
#else #else
#define LOG printf #define LOG //printf
#endif #endif
#ifdef G400 #ifdef G400
@ -89,6 +89,7 @@ struct HG_JpegCompressInfo
unsigned int width; unsigned int width;
unsigned int height; unsigned int height;
unsigned char *pJpegData; unsigned char *pJpegData;
//cv::Mat mat;
}; };
struct HG_JpegCompressInfo_data struct HG_JpegCompressInfo_data
{ {