调整整体流程
This commit is contained in:
parent
4aef383168
commit
f670bc5342
233
CImageMerge.cpp
233
CImageMerge.cpp
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
};
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
14
DevUtil.h
14
DevUtil.h
|
@ -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};
|
||||
};
|
||||
|
||||
|
|
471
HCamDevice.cpp
471
HCamDevice.cpp
|
@ -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 ®_value)
|
||||
{
|
||||
|
@ -1123,6 +1146,11 @@ void HCamDevice::HtCamGetSpTime(uint32_t ®_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();
|
||||
|
|
15
HCamDevice.h
15
HCamDevice.h
|
@ -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 ®_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 ®_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();
|
||||
|
|
|
@ -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 ? ¶m.ExposureF[0] : ¶m.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"));
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
42
Scanner.cpp
42
Scanner.cpp
|
@ -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");
|
||||
|
|
95
Sensor.cpp
95
Sensor.cpp
|
@ -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);
|
||||
}
|
5
Sensor.h
5
Sensor.h
|
@ -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);
|
||||
};
|
|
@ -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);
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
|
|
78
main.cpp
78
main.cpp
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue