调整整体流程

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));
auto graymerge = [](cv::Mat& src,cv::Mat dst)->cv::Mat
if (b7010)
{
int width_block = src.cols / 12;
int heigh_block = src.rows;
// 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++)
//printf("7010 7010 10 7010 7010 7010 7010 7010 7010!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n");
cv::Mat matdst;
if (srcMat.cols == 5184 || srcMat.cols == 10368) // gray mode
{
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();
matdst = srcMat;
}
return graymerge(retMat,dst);
}
return srcMat;
}
else
{
// 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)
{
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);
/*TEMP MERGE ALGORITHM*/
int width = srcMat.cols / 3;
int height = srcMat.rows;
cv::Mat m_dst(height, width, CV_8UC(3));
std::vector<cv::Mat> m_items;
std::vector<int> index = {0, 2, 1};
for (size_t i = 0; i < 3; i++)
{
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
{
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++)
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
{
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};
int width_block = src.cols / 12;
int heigh_block = src.rows;
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);
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);
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)
{
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);
m_splits.clear();
return srcMat;
}
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)
{
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));
for (int i = 0; i < size; i++)
{
auto itemimg = frames[i];
itemimg = MergeImage(type, itemimg, dstwidth + abortwidth, itemimg.rows);
itemimg.copyTo(matdst(cv::Rect(0, itemimg.rows * i, itemimg.cols, itemimg.rows)));
itemimg.release();
// auto itemimg = frames[i];
// itemimg = MergeImage(type, itemimg, dstwidth + abortwidth, itemimg.rows);
// itemimg.copyTo(matdst(cv::Rect(0, itemimg.rows * i, itemimg.cols, itemimg.rows)));
// itemimg.release();
}
return matdst;
}

View File

@ -9,7 +9,7 @@ public:
CImageMerge(/* args */);
~CImageMerge();
public:
cv::Mat MergeImage(cv::Mat& srcMat,int dstwidth,int dstheight,int mode);
cv::Mat MergeImage(bool iscolor,cv::Mat& srcMat,int dstwidth,int dstheight);
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 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_INCLUDE 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/holdtecs/zzm-linux/fs/usr/lib)

View File

@ -49,7 +49,7 @@ union CamZ_Reg_4_New
unsigned int unuse_0 : 2;
unsigned int color_mode : 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_adc2_cfg:1; //使能ADC 配置 脉冲有效(写低写高)
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
{
int value;

View File

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

View File

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

View File

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

View File

@ -12,7 +12,7 @@ class Gpio;
class GpioOut;
#define WIDTH 5184
#define HEIGHT 513 //只能为3的倍数
#define HEIGHT 513 //只能为3的倍数
#define DPI_600 0
#define DPI_300 1
#define COLOR 1
@ -93,6 +93,8 @@ private:
unsigned int color_mode_; // 颜色模式
unsigned int is_correct_; // 是否校正
unsigned int is_double_paper_; // 是否启动双张检测
cv::Mat lut;
std::map<PaperSize, SIZE> paper_map_
{
{PaperSize::G400_A3,SIZE{297,420}},
@ -112,7 +114,7 @@ private:
};
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:
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);
this_thread::sleep_for(std::chrono::milliseconds(50));
m_keyboard.reset(new huagao::Keyboard(btnevent));
m_keyboard->init();
this_thread::sleep_for(std::chrono::milliseconds(50));
motorZouzhi.enablePower(true);
motorZouzhi.setSpeed(4000);
motorCuozhi.setSpeed(3000);
@ -87,6 +89,7 @@ Scanner::Scanner(ScannerGlue glue)
FsmState::setScanner(this);
threadRunMessageLoop = std::thread(&Scanner::runMessageLoop, this);
Motor::enablePower(true);
this_thread::sleep_for(std::chrono::milliseconds(200));
//meminfo = MemoryInfo::GetInstance();
//GetSysInfo();
}
@ -207,26 +210,39 @@ void Scanner::runScan()
{
LOG("-------------Scanner RunScan Start-------------\r\n");
capturer->open();
printf("11111111111111111111\r\n");
motorZouzhi.start();
motorCuozhi.pauseWaitForThread();
//capturer->open();
sensor->enableDoubleSensor(false);
if (!isPaperInit)
{
preFeed();
isPaperInit = true;
}
for (size_t i = 0; i < 16; i++)
{
std::cout << string_format("reg[%d] = 0x%08x", i, capturer->read(i)) << std::endl;
}
// for (size_t i = 0; i < 16; i++)
// {
// std::cout << string_format("reg[%d] = 0x%08x", i, capturer->read(i)) << std::endl;
// }
this_thread::sleep_for(std::chrono::milliseconds(200));
imageindex = 0;
capturer->setFPGATriggerMode(false, 0);
capturer->setFanMode(3);
//*capturer->setFPGATriggerMode(false, 0);
//capturer->setFanMode(3);
sensor->resetPaperPin();
capturer->clearimages();
capturer->resetimageremain();
capturer->setScanFlag(true);
bool b_autosize = m_config.params.pageSize==(int)PaperSize::G400_AUTO ||
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)
max = 200;
LOG("paper pauseWaitForThread \n");
waitpapertime = 400;
waitpapertime = 200;
while (!sensor->waitPaperOut(waitpapertime) && i < max)
{
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(500));
//std::this_thread::sleep_for(std::chrono::milliseconds(500));
LOG("\nclose b_autosize %s\n",GetCurrentTimeStamp(2).c_str());
capturer->stopsnap(b_autosize);
capturer->waitsnapdone(m_isDoublePaper || m_jamPaper);//等待采集完成
@ -383,10 +399,16 @@ void Scanner::runScan()
break;
}
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();
//printf("7777777777777777777777777777777777777\r\n");
this_thread::sleep_for(std::chrono::milliseconds(200));
}
else
{
LOG("\n ----------------EXIT 3333---------------- \n");

View File

@ -23,23 +23,31 @@ Sensor::Sensor(BlockingQueue<ScanEvent> &sysEvents)
sensor_power(PIN_PORT_7010::SENSOR_POWER)
{
pwm2.enable(Gpio::High);
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);
paperPin.setDirection(Gpio::in);
scanPin.setDirection(Gpio::in);
double_out0_Pin.setDirection(Gpio::in);
double_out1_Pin.setDirection(Gpio::in);
//paperJamPin.setDirection(Gpio::in);
scanPin.setDirection(Gpio::in);
scanPin.setEdge(Gpio::both);
sensor_power.setDirection(Gpio::in);
doubleEnablePin.setDirection(Gpio::out);
//////////中断模式///////
double_out0_Pin.setEdge(Gpio::both);
double_out1_Pin.setEdge(Gpio::both);
doubleEnablePin.setEdge(Gpio::both);
coverPin.setEdge(Gpio::both);
paperPin.setEdge(Gpio::both);
double_out0_Pin.setEdge(Gpio::both);
double_out1_Pin.setEdge(Gpio::both);
scanPin.setEdge(Gpio::both);
//std::cout<<"scanPin "<< scanPin.getValue()<<std::endl;
thread_monitor = std::thread(&Sensor::monitor, this);
@ -181,8 +189,8 @@ void Sensor::monitor2()
std::vector<Gpio *> gpios;
gpios.push_back(&coverPin);
gpios.push_back(&paperPin);
//gpios.push_back(&double_out0_Pin);
//gpios.push_back(&double_out1_Pin);
gpios.push_back(&double_out0_Pin);
gpios.push_back(&double_out1_Pin);
std::vector<pollfd> pollfds;
pollfd pfd;
int ret = 0;
@ -224,25 +232,57 @@ void Sensor::monitor2()
{
if (pollfds[i].revents)
{
fd = pollfds[i].fd;
lseek(fd, 0, SEEK_SET);
num = read(fd, buf, 8);
buf[num - 1] = '\0';
ret = atoi(buf);
ret = readfile(pollfds[i].fd,num,buf);
//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());
enableDoubleSensor(false);
double_1 = ret;
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);
}
}
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);
//取消等待纸张
void cancelWaitPaper();
//双张使能
private:
@ -59,7 +60,9 @@ private:
std::thread thread_monitor2;
volatile bool bMonitor = true;
volatile bool bMonitor2 = true;
volatile bool double_1 = false;
volatile bool double_2 = false;
void monitor();
void monitor2();
int readfile(int fd,int num , char* buf);
};

View File

@ -126,6 +126,7 @@ UsbScanner::UsbScanner() : m_startscan(false),
{
imageremain++;
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);
};

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)));
}
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)
{
printf("eneter creatLUTData \n");
@ -159,6 +167,45 @@ void creatLUTData(int dpi, int mode)
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)
{
return correctparam.GetFpgaparam(dpi, mode);
@ -180,7 +227,7 @@ cv::Mat colMean(const cv::Mat &image)
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
@ -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)
{
std::vector<cv::Mat> w;
w.push_back(colMean(black));
w.push_back(colMean(white));
w.push_back(black);
w.push_back(white);
cv::Mat lut = createLUT(w, isTextCorrection);
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;
}
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)
{
#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)
{
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);
void calcLUT(int dpi , int mode, bool isTextCorrection, cv::Mat& lut);
cv::Mat extractRepresentRow2(const cv::Mat& src);
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, cv::Mat& lut);
void creatLUTData(int dpi , int mode);
cv::Mat creatLUTData_7010(int dpi , int mode);
FPGAConfigParam GetFpgaparam(int dpi,int mode);
void SaveFpgaparam(FPGAConfigParam& param);

View File

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

View File

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