新增200dpi

This commit is contained in:
modehua 2023-09-26 02:16:56 -07:00
parent 0fcc2d8a5d
commit d613a1dd16
6 changed files with 76 additions and 80 deletions

View File

@ -14,7 +14,7 @@ cv::Mat CImageMerge::MergeImage(cv::Mat &srcMat, int dstwidth, int dstheight, in
{
//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 (!mode ) // gray mode
{
matdst = srcMat;
}

View File

@ -78,6 +78,7 @@ union CamZ_Reg_A_New
unsigned int psincdec : 1; //相移动反向
unsigned int clr_psedon : 1;//清除相完成 写低写高
unsigned int dpi: 1; //1: 300DPI 0: 600DPI
unsigned int dpi_200: 1; //dpi=1的时候 dpi_200=1 200dpi dpi=1的时候 dpi_200=0 300dpi dpi=0的时候 dpi_200=0 600dpi
};
};

View File

@ -1228,15 +1228,25 @@ void HCamDevice::HtCamChangeTriggerInAndEXt(int in_out)
void HCamDevice::HtCamSetDpi(int dpi)
{
uint32_t *pCamCtrlReg = virBaseAddr;
if (dpi)
CamZ_Reg_A_New rega;
rega.value = HtCamReadFpgaRegs(0x0A);
printf("dpi:%d\r\n",dpi);
if (dpi == 1 )
{
pCamCtrlReg[10] |= (0x00000800);
rega.dpi_200 = 1;
rega.dpi = 1;
}
else if (dpi == 2)
{
rega.dpi_200 = 0;
rega.dpi = 1;
}
else
{
pCamCtrlReg[10] &= ~(0x00000800);
rega.dpi_200 = 0;
rega.dpi = 0;
}
HtCamWriteFpgaRegs(0x0A,rega.value);
}
void HCamDevice::HtCamSetClolr(int color)

View File

@ -37,7 +37,9 @@ public:
int HtCamGetTriggerMode(); //获取触发模式
int HtCamGetColorMode(); //获取颜色模式
void HtCamSetClolr(int color); //设置颜色模式
void HtCamSetDpi(int dpi); //设置dpi
//设置dpi dpi =0 200dpi ,dpi =1 300dpi,dpi =2 600dpi
//注意协议的逻辑 11号寄存器设置1 12号设置1 200dpi 11号寄存器设置1 12号设置0 300dpi 11号寄存器设置0 12号设置0 600dpi
void HtCamSetDpi(int dpi);
int HtCamReadCaptureFrame(void **pbuf, int timeout); //读图 <较重要>

View File

@ -101,8 +101,8 @@ void MultiFrameCapture::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)
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,54 +477,33 @@ 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)
{
video->HtCamGetFrameNum(frame_num);
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"));

View File

@ -12,9 +12,10 @@ class Gpio;
class GpioOut;
#define WIDTH 5184
#define HEIGHT 951 //只能为3的倍数
#define DPI_600 0
#define DPI_300 1
#define HEIGHT 600 //只能为3的倍数
#define DPI_600 3
#define DPI_300 2
#define DPI_200 1
#define COLOR 1
#define GRAY 0
typedef struct hg_tag_SIZE
@ -83,7 +84,7 @@ private:
//void myFloodFill(cv::Mat& image, bool isTwoSide);
private:
unsigned int resolution_; // 分辨率 //0:600dpi 1:300dpi
unsigned int resolution_; // 分辨率 //3:600dpi 2:300dpi 1:200dpi
unsigned int v4l2_width_; // v4l2 图像宽
unsigned int v4l2_height_; // v4l2 图像高