|
|
|
@ -100,9 +100,9 @@ void MultiFrameCapture::snap()
|
|
|
|
|
std::lock_guard<std::mutex> m_lock(m_mtx_snap);
|
|
|
|
|
b_stop_snap = b_end_snap = false;
|
|
|
|
|
|
|
|
|
|
if (m_config.params.dpi == 3)
|
|
|
|
|
this_thread::sleep_for(std::chrono::milliseconds(160));
|
|
|
|
|
else if(m_config.params.dpi == 2)
|
|
|
|
|
if (m_config.params.dpi == 3 )
|
|
|
|
|
this_thread::sleep_for(std::chrono::milliseconds(140));
|
|
|
|
|
else if(m_config.params.dpi == 2 && m_config.params.pageSize != (int)PaperSize::G400_AUTO)
|
|
|
|
|
this_thread::sleep_for(std::chrono::milliseconds(45));
|
|
|
|
|
else
|
|
|
|
|
this_thread::sleep_for(std::chrono::milliseconds(10));
|
|
|
|
@ -150,12 +150,12 @@ uint32_t MultiFrameCapture::compute_frame(int paper_size,int dpi)
|
|
|
|
|
void MultiFrameCapture::compute_height(int width,int height)
|
|
|
|
|
{
|
|
|
|
|
//////这块配置一定要注意
|
|
|
|
|
v4l2_width_ = resolution_ == 0 ? width * 2 : width; //宽 :DPI不变下 彩色灰度是一样的
|
|
|
|
|
v4l2_width_ = resolution_ == DPI_600 ? width * 2 :(resolution_ == DPI_300 ? width :(float)width / 1.5) ; //宽 :DPI不变下 彩色灰度是一样的
|
|
|
|
|
//width_ = paper_size_ == PaperSize::G400_MAXSIZE || paper_size_ ==PaperSize::G400_MAXAUTO &&
|
|
|
|
|
v4l2_height_ = height;
|
|
|
|
|
|
|
|
|
|
pixels_width_ = color_mode_ == 1 ? v4l2_width_ * 3 : v4l2_width_;
|
|
|
|
|
pixels_height_ = color_mode_ == 1 ? v4l2_height_ / 3 : v4l2_height_;
|
|
|
|
|
pixels_width_ = color_mode_ == COLOR ? v4l2_width_ * 3 : v4l2_width_;
|
|
|
|
|
pixels_height_ = color_mode_ == COLOR ? v4l2_height_ / 3 : v4l2_height_;
|
|
|
|
|
}
|
|
|
|
|
SIZE MultiFrameCapture::GetPaperSize(PaperSize paper, int dpi)
|
|
|
|
|
{
|
|
|
|
@ -180,8 +180,8 @@ void MultiFrameCapture::UpdateScanParam(HG_ScanConfiguration config)
|
|
|
|
|
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;
|
|
|
|
|
resolution_ = config.params.dpi; //0:600dpi 1:300dpi config.params.dpi = 2||3 pc 1 代表200 2代表300 3代表600
|
|
|
|
|
color_mode_ = config.params.isColor;
|
|
|
|
|
is_correct_ = config.params.isCorrect;
|
|
|
|
|
paper_size_ = config.params.pageSize;
|
|
|
|
|
is_double_paper_ = config.params.doubleFeeded;
|
|
|
|
@ -190,17 +190,17 @@ void MultiFrameCapture::UpdateScanParam(HG_ScanConfiguration config)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//int height = resolution_ == DPI_600 ? 342 : 900;
|
|
|
|
|
int height = config.params.dpi == 3 ? 342 :(config.params.dpi == 2?999:513);
|
|
|
|
|
int height = config.params.dpi == 3 ? 900 :(config.params.dpi == 2?999:300);
|
|
|
|
|
compute_height(WIDTH , height);
|
|
|
|
|
|
|
|
|
|
video->HtCamSetClolr(color_mode_);
|
|
|
|
|
video->HtCamSetDpi(resolution_);
|
|
|
|
|
|
|
|
|
|
FPGAConfigParam fpgaparam = GetFpgaparam(config_dpi, config_color);
|
|
|
|
|
video->HtCamSetSpTime(fpgaparam.Sp, fpgaparam.MaxExp); // 2344 灰色 //2023-8-10 最新2650
|
|
|
|
|
video->HtCamSetSpTime(fpgaparam.Sp,49); // 2344 灰色 //2023-8-10 最新2650
|
|
|
|
|
if (color_mode_)
|
|
|
|
|
{
|
|
|
|
|
video->HtCamSetSpTime2(fpgaparam.HRatio);
|
|
|
|
|
video->HtCamSetSpTime2(fpgaparam.Sp * 3);
|
|
|
|
|
}
|
|
|
|
|
video->HtCamSetStSp(fpgaparam.MaxBright);
|
|
|
|
|
|
|
|
|
@ -214,19 +214,21 @@ void MultiFrameCapture::UpdateScanParam(HG_ScanConfiguration config)
|
|
|
|
|
{
|
|
|
|
|
cnt -=1 ;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (m_config.params.dpi == 3)
|
|
|
|
|
{
|
|
|
|
|
cnt +=1 ;
|
|
|
|
|
}
|
|
|
|
|
video->HtCamSetFrameCnt(cnt);
|
|
|
|
|
printf(" -----------------------设置帧数:%d------------------\r\n",cnt);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf("颜色模式:%s\r\n",color_mode_== COLOR ? "彩色":"灰色");
|
|
|
|
|
printf("分辨率:%d\r\n",resolution_ == DPI_600?600:300);
|
|
|
|
|
printf("分辨率:%d\r\n",resolution_);
|
|
|
|
|
printf("V4L2宽:%d 高:%d\r\n",v4l2_width_,v4l2_height_);
|
|
|
|
|
printf("像素宽:%d 高: %d\r\n",pixels_width_,pixels_height_);
|
|
|
|
|
printf("fpga_height_:%d\r\n", fpga_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_);
|
|
|
|
@ -388,14 +390,14 @@ void MultiFrameCapture::snaprun()
|
|
|
|
|
//HG_JpegCompressInfo info = cmp.GetCompressedImg(mat);
|
|
|
|
|
|
|
|
|
|
HG_JpegCompressInfo info ;
|
|
|
|
|
if (m_config.params.dpi == 3 )
|
|
|
|
|
{
|
|
|
|
|
printf("600做拷贝\r\n");
|
|
|
|
|
info.pJpegData = (unsigned char *)malloc(frame_info.height * frame_info.width);
|
|
|
|
|
memcpy(info.pJpegData , data , frame_info.height * frame_info.width);
|
|
|
|
|
info.dpi = true ;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
// if (resolution_ == DPI_600 )
|
|
|
|
|
// {
|
|
|
|
|
// printf("600做拷贝\r\n");
|
|
|
|
|
// info.pJpegData = (unsigned char *)malloc(frame_info.height * frame_info.width);
|
|
|
|
|
// memcpy(info.pJpegData , data , frame_info.height * frame_info.width);
|
|
|
|
|
// info.dpi = 1 ;
|
|
|
|
|
// }
|
|
|
|
|
// else
|
|
|
|
|
{
|
|
|
|
|
info.pJpegData = data;
|
|
|
|
|
info.dpi = false ;
|
|
|
|
@ -412,7 +414,7 @@ void MultiFrameCapture::snaprun()
|
|
|
|
|
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);
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
m_glue.m_imageready(info);
|
|
|
|
|
|
|
|
|
@ -443,7 +445,7 @@ void MultiFrameCapture::snaprun()
|
|
|
|
|
int channels = color_mode_ == 1 ? 3 : 1;
|
|
|
|
|
int color_mode = video->HtCamGetColorMode();
|
|
|
|
|
int func_sig = 0;
|
|
|
|
|
int time_out = resolution_ == DPI_600 ? 1000 : 600; ///这个时间是根据每帧的数据量来进行调测的
|
|
|
|
|
int time_out = resolution_ == DPI_600 ? 2000 : 600; ///这个时间是根据每帧的数据量来进行调测的
|
|
|
|
|
int time_out_cnt = 0;
|
|
|
|
|
|
|
|
|
|
if (color_mode_)
|
|
|
|
@ -475,24 +477,11 @@ void MultiFrameCapture::snaprun()
|
|
|
|
|
sw.reset();
|
|
|
|
|
for (size_t i = 0; i <= frame_cnt ; i++) //frame_cnt -1 目前最好一帧采集会超时 所以多采集一帧
|
|
|
|
|
{
|
|
|
|
|
printf("***********设置的帧数:%d 正在采集第[%d]帧************\r\n",frame_info.frame_index,i);
|
|
|
|
|
|
|
|
|
|
printf("***********设置的帧数:%d 正在采集第[%d]帧************\r\n",frame_info.frame_index,i +1);
|
|
|
|
|
frame_info.first_frame = i == 0 ? true : false;
|
|
|
|
|
frame_info.last_frame = i == frame_cnt ? true : false;
|
|
|
|
|
|
|
|
|
|
func_sig = snap_func(frame_info, channels,time_out,i);
|
|
|
|
|
|
|
|
|
|
// if (func_sig == -1 ) //当前帧取图超时,在取一次!!! 一直超时 不就卡死了??? 这个地方还是需要加个时间限制几秒内一帧未取出就退了,返回异常状态吧?
|
|
|
|
|
// {
|
|
|
|
|
// i--;
|
|
|
|
|
// time_out +=200;
|
|
|
|
|
// time_out_cnt ++;
|
|
|
|
|
// if (time_out_cnt >=5)
|
|
|
|
|
// {
|
|
|
|
|
// break;
|
|
|
|
|
// }
|
|
|
|
|
// continue;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
if (b_stop_snap)
|
|
|
|
|
{
|
|
|
|
@ -500,29 +489,21 @@ void MultiFrameCapture::snaprun()
|
|
|
|
|
int ind = i + 1; //已采集了的帧数
|
|
|
|
|
int val = frame_num - ind; //剩余还未采集的帧数
|
|
|
|
|
|
|
|
|
|
while (val)
|
|
|
|
|
while (val > 0)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
frame_info.last_frame = val == 1 ? true : false;
|
|
|
|
|
frame_info.frame_index = frame_num;
|
|
|
|
|
func_sig = snap_func(frame_info, channels,time_out ,ind);//同上面一样
|
|
|
|
|
printf("-----------当前采集到第:[%d]帧 CIS总共采集[%d]帧 -------\r\n",ind,frame_num);
|
|
|
|
|
|
|
|
|
|
// if (func_sig == -1 )
|
|
|
|
|
// {
|
|
|
|
|
// time_out +=200;
|
|
|
|
|
// time_out_cnt ++;
|
|
|
|
|
// if (time_out_cnt >=5)
|
|
|
|
|
// {
|
|
|
|
|
// break;
|
|
|
|
|
// }
|
|
|
|
|
// continue;
|
|
|
|
|
// }
|
|
|
|
|
val--;
|
|
|
|
|
ind++;
|
|
|
|
|
|
|
|
|
|
if(m_config.params.dpi == 3)
|
|
|
|
|
printf("-----------当前采集到第:[%d]帧 CIS总共采集[%d]帧 -------\r\n",ind,frame_num);
|
|
|
|
|
|
|
|
|
|
video->HtCamGetFrameNum(frame_num);
|
|
|
|
|
val = frame_num - ind;
|
|
|
|
|
if(resolution_ == DPI_600)
|
|
|
|
|
{
|
|
|
|
|
int d = 80;
|
|
|
|
|
int d = 200;
|
|
|
|
|
this_thread::sleep_for(std::chrono::milliseconds(d));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -536,7 +517,7 @@ void MultiFrameCapture::snaprun()
|
|
|
|
|
////////////////////////////DPI 颜色不同 会导致数据大小不同所以这个地方延时肯定不一样 目前 60是200dpi/////////////////////////
|
|
|
|
|
if(m_config.params.dpi == 3)
|
|
|
|
|
{
|
|
|
|
|
int d = 80;
|
|
|
|
|
int d = 200;
|
|
|
|
|
this_thread::sleep_for(std::chrono::milliseconds(d));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -616,13 +597,15 @@ static int temp_val = 0;
|
|
|
|
|
bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black)
|
|
|
|
|
{
|
|
|
|
|
printf("校正DPI[%d] 校正颜色:%s\n",dpi==1?200:(dpi==2?300:600),mode == IMAGE_COLOR?"彩色":"灰色");
|
|
|
|
|
int config_dpi = dpi == 1 ? 2 : dpi;
|
|
|
|
|
|
|
|
|
|
int config_dpi = 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 width = config_dpi == 0x02 ? 864 : (config_dpi == 0x03 ? 1728 : 576);
|
|
|
|
|
int orgimgwidth = width * 2 * 3 * channels;
|
|
|
|
|
printf("orgimgwidth:%d\r\n",orgimgwidth);
|
|
|
|
|
|
|
|
|
|
int dstwidth = width * 2 * 3;
|
|
|
|
|
|
|
|
|
@ -775,10 +758,10 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black)
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
// if(indxxx <= 10)
|
|
|
|
|
// {
|
|
|
|
|
// cv::imwrite(std::to_string(++indxxx)+".bmp",mrgmat);
|
|
|
|
|
// }
|
|
|
|
|
for (char j = 0; j < 3; j++)
|
|
|
|
|
{
|
|
|
|
|
values[0][j] = a.val[2-j];
|
|
|
|
@ -1023,7 +1006,7 @@ void MultiFrameCapture::openDevice(int dpi, int mode)
|
|
|
|
|
printf("openDevice dpi:%d mode:%d \r\n",dpi,mode);
|
|
|
|
|
reset_fpga();
|
|
|
|
|
bool dunnancis = true;
|
|
|
|
|
int channelwidth = dpi == 0x02 ? 864 : (dpi == 0x03 ? 1728 : 864); // 1296 2592 864
|
|
|
|
|
int channelwidth = dpi == 0x02 ? 864 : (dpi == 0x03 ? 1728 : 576); // 1296 2592 864
|
|
|
|
|
int channels = mode == 0x01 ? 3 : 1;
|
|
|
|
|
int width = channelwidth * channels;
|
|
|
|
|
int frame_height = mode == 0x01 ? 60 * 3 : 60;
|
|
|
|
@ -1031,13 +1014,13 @@ void MultiFrameCapture::openDevice(int dpi, int 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
|
|
|
|
|
resolution_ = dpi; //dpi 1代表200 2代表300 3代表600
|
|
|
|
|
color_mode_ = mode == 1 ? COLOR : GRAY;
|
|
|
|
|
|
|
|
|
|
compute_height(WIDTH , HEIGHT);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int config_dpi = resolution_ == DPI_600 ? 3 : 2;
|
|
|
|
|
int config_dpi = resolution_;
|
|
|
|
|
int config_color = color_mode_ ==COLOR ? 1:0;
|
|
|
|
|
|
|
|
|
|
StopWatch swwv4l2open;
|
|
|
|
@ -1048,10 +1031,10 @@ void MultiFrameCapture::openDevice(int dpi, int mode)
|
|
|
|
|
|
|
|
|
|
FPGAConfigParam fpgaparam = GetFpgaparam(config_dpi, config_color);
|
|
|
|
|
|
|
|
|
|
video->HtCamSetSpTime(fpgaparam.Sp,fpgaparam.MaxExp); // 2344 灰色 //2023-8-10 最新2650
|
|
|
|
|
video->HtCamSetSpTime(fpgaparam.Sp,49);
|
|
|
|
|
if (color_mode_)
|
|
|
|
|
{
|
|
|
|
|
video->HtCamSetSpTime2(fpgaparam.HRatio);
|
|
|
|
|
video->HtCamSetSpTime2(fpgaparam.Sp * 3);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
video->HtCamSetStSp(fpgaparam.MaxBright);
|
|
|
|
@ -1065,11 +1048,10 @@ void MultiFrameCapture::openDevice(int dpi, int mode)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
printf("颜色模式:%s\r\n",color_mode_== COLOR ? "彩色":"灰色");
|
|
|
|
|
printf("分辨率:%d\r\n",resolution_ == DPI_600?600:300);
|
|
|
|
|
printf("分辨率:%d\r\n",resolution_);
|
|
|
|
|
printf("V4L2宽:%d 高:%d\r\n",v4l2_width_,v4l2_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_);
|
|
|
|
@ -1104,7 +1086,7 @@ void MultiFrameCapture::creatcorrectconfig(int dpi, int mode)
|
|
|
|
|
if (m_glue.m_deviceevent)
|
|
|
|
|
m_glue.m_deviceevent((int)HG_ScannerStatus::AUTO_FLATTING, log);
|
|
|
|
|
|
|
|
|
|
int config_dpi = resolution_ == DPI_600 ? 3 : 2;
|
|
|
|
|
int config_dpi = resolution_;
|
|
|
|
|
int config_color = color_mode_ ==COLOR ? 1:0;
|
|
|
|
|
|
|
|
|
|
configFPGAParam(mode, dpi);
|
|
|
|
@ -1144,7 +1126,7 @@ void MultiFrameCapture::creatcorrectconfig(int dpi, int mode)
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(5));
|
|
|
|
|
isDone = saveLutImg(dpi, mode, false); // 0 color_black 1 color_white 2 gray_balck 3 gray_white
|
|
|
|
|
video->HtCamStopVideoCapturing();
|
|
|
|
|
this_thread::sleep_for(std::chrono::seconds(2));
|
|
|
|
|
this_thread::sleep_for(std::chrono::milliseconds(200));
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
printf("creatcorrectconfig %s \n", (mode == IMAGE_COLOR ? " Color" : " Gray"));
|
|
|
|
|