⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stepcali.cpp

📁 又VC++实现的基于TWAIN的扫描仪图像输入处理软件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/	  静态增益校正参数及效果参数写入fp文件		/	
/==============================================*/
void Gain_Disp(CString Cali_Title,FILE *fp)
{
	//从上传效果参数中提取底层实际使用的静态增益参数
	for (int i=0;i<32;i++)
		Def_Stp_Para[i+150+64]=Stp_Cai_XGP[i+64];	//以上传值更新保存参数值

	int	JZP,XGP;			//对应校正步号返回的校正参数及效果参数的位置

	fprintf(fp,"   \n");   
	fprintf(fp,"   \n");   
	fprintf(fp,"==========================================================        %s        ======================================================\n",Cali_Title);
	fprintf(fp,"   \n");   
	fprintf(fp,"                                             增益目标码: %d  偏色系数下限: %d  偏色系数上限: %d\n",((Def_Stp_Para[152]<<8) | (Def_Stp_Para[153])),(Def_Stp_Para[274]-100),(Def_Stp_Para[273]-100));
	fprintf(fp,"   \n");   
	fprintf(fp,"                                                               ==偏色调整系数==\n");
	fprintf(fp,"                                                                R通道  G通道  B通道\n");

	i=150+120;			//
	fprintf(fp,"                                                           整体:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
	i=150+96;
	fprintf(fp,"                                                           CCD1:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
	i=150+99;
	fprintf(fp,"                                                           CCD2:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
	i=150+102;
	fprintf(fp,"                                                           CCD3:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
	i=150+105;
	fprintf(fp,"                                                           CCD4:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
	i=150+108;
	fprintf(fp,"                                                           CCD5:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
/*	i=150+111;
	fprintf(fp,"                                                           CCD6:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
	i=150+114;
	fprintf(fp,"                                                           CCD7:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
	i=150+117;
	fprintf(fp,"                                                           CCD8:%4d%7d%7d\n",Def_Stp_Para[i+0]-100,Def_Stp_Para[i+1]-100,Def_Stp_Para[i+2]-100);
*/
	JZP=214;				//CCD头静态增益校正参数在Def_Stp_Para缓冲区中的起始位置=214
	XGP=150+720;			//CCD头静态增益校正效果参数在Stp_Cai_XGP缓冲区中的起始位置=150+720
	fprintf(fp,"   \n");   
	fprintf(fp,"                                                       ==静态增益校正参数及校正效果参数==\n");
	Cali_Disp(JZP,XGP,fp);	//静态增益校正参数及校正效果参数格式化写入
	
	JZP=1;					//CCD头动态偏移参数没有上传,设置JZP=1,决定在写入时单另处理。
	XGP=150+960;			//CCD头动态偏移状况参数在Stp_Cai_XGP缓冲区中的起始位置=150+960
	fprintf(fp,"   \n");   
	fprintf(fp,"                                                          ==动态偏移状况参数==\n");
	Cali_Disp(JZP,XGP,fp);	//动态偏移状况参数格式化写入
	
	JZP=1;					//CCD头动态增益参数没有上传,设置JZP=1,决定在写入时单另处理。
	XGP=150+1200;			//CCD头动态增益校正效果参数在Stp_Cai_XGP缓冲区中的起始位置=150+1200
	fprintf(fp,"   \n");   
	fprintf(fp,"                                                          ==动态增益校正效果参数==\n");
	Cali_Disp(JZP,XGP,fp);	//动态增益校正参数及校正效果参数格式化写入

	JZP=150+88;				//CCD头增益范围参数在Def_Stp_Para缓冲区中的起始位置=150+88
	XGP=150+1440;			//CCD头动态增益校正状况参数在Stp_Cai_XGP缓冲区中的起始位置=150+1440
	fprintf(fp,"   \n");   
	fprintf(fp,"                                                          ==动态增益校正状况参数==\n");
	Cali_DGain_Dsp(JZP,XGP,fp);	//动态增益校正状况参数格式化写入
	
}

/*==========================================================================/
/				*****动态增益校正状况参数显示格式行写入*****			/
/		将Def_Stp_Para数组JZP开始的校正参数及Stp_Cai_XGP数组XGP开始的		/
/	效果参数写入fp文件														/	
/==========================================================================*/
void Cali_DGain_Dsp(int JZP,int XGP,FILE *fp)
{
	int	HEADnum=5;			//扫描头的个数	
	//状况参数值在Stp_Cai_XGP缓冲区为每头14字节,2字节总数+3通道各4字节状况值。显示时先将2字节的参数转换成1个字。
	int	XGbuf[56];			//5个头共35个字。
	//写入显示格式行
	fprintf(fp,"                           ----------  R通道  ---------        ----------  G通道  ---------        ----------  B通道  ---------   \n");
	fprintf(fp,"增益范围  有效像点总数  校正不足的像点数  校正过量的像点数  校正不足的象点数  校正过量的象点数  校正不足的象点数  校正过量的象点数  \n");
	
	int	i;
	double Range;
	for(i=0;i<7*HEADnum;i++)	//将上传的2字节效果参数值转换成1个字
		XGbuf[i]= (Stp_Cai_XGP[XGP+2*i]<<8) | (Stp_Cai_XGP[XGP+2*i+1]);

	for(i=0;i<HEADnum;i++)		//将HEADnum个头的校正参数和效果参数写入fp文件
		{
			if (Def_Stp_Para[JZP]==1) Range=1.5;
			if (Def_Stp_Para[JZP]==2) Range=2.0;
			if (Def_Stp_Para[JZP]==3) Range=3.0;
			if ((Def_Stp_Para[JZP]<1) || (Def_Stp_Para[JZP]>3)) Range=9.9;

			fprintf(fp,"%6.1f%12d%16d%18d%18d%18d%18d%18d\n",Range,XGbuf[7*i+0],XGbuf[7*i+1],XGbuf[7*i+2],XGbuf[7*i+3],XGbuf[7*i+4],XGbuf[7*i+5],XGbuf[7*i+6]);
			JZP=JZP+1;
		}
}

/*==========================================================================/
/				*****分步校正效果参数显示格式行写入*****					/
/		将Def_Stp_Para数组JZP开始的校正参数及Stp_Cai_XGP数组XGP开始的		/
/	效果参数写入fp文件														/	
/==========================================================================*/
void Cali_Disp(int JZP,int XGP,FILE *fp)
{
	int	HEADnum=5;			//扫描头的个数	
	//效果参数值在Stp_Cai_XGP缓冲区为每通道10字节,每个头为3*10字节。显示时先将2字节的效果参数转换成1个字。
	int	XGbuf[120];			//5个头的效果参数值缓冲区,每通道5个字,每头3*5个字,5个头共75个字。
	//写入显示格式行
	fprintf(fp,"    ---------------  R通道  ----------------        -----------------  G通道  -----------------       -----------------  B通道  -----------------   \n");
	fprintf(fp,"参数值 最大值 象点数 最小值 象点数 平均值 大÷小  参数值 最大值 象点数 最小值 象点数 平均值 大÷小  参数值 最大值 象点数 最小值 象点数 平均值 大÷小\n");
	
	int	i;
	double Max_div_Min;
	for(i=0;i<15*HEADnum;i++)	//将上传的2字节效果参数值转换成1个字
		XGbuf[i]= (Stp_Cai_XGP[XGP+2*i]<<8) | (Stp_Cai_XGP[XGP+2*i+1]);

	if (JZP==1)						//校正效果参数写入fp文件
	{
		for(i=0;i<HEADnum;i++)		//将HEADnum个头的校正参数和效果参数写入fp文件
		{
			Max_div_Min=M_Div_N(XGbuf[15*i+0],XGbuf[15*i+2]);
			fprintf(fp,"%11d%7d%7d%7d%7d%8.2f",XGbuf[15*i+0],XGbuf[15*i+1],XGbuf[15*i+2],XGbuf[15*i+3],XGbuf[15*i+4],Max_div_Min);				//R
			Max_div_Min=M_Div_N(XGbuf[15*i+5],XGbuf[15*i+7]);
			fprintf(fp,"%14d%7d%7d%7d%7d%8.2f",XGbuf[15*i+5],XGbuf[15*i+6],XGbuf[15*i+7],XGbuf[15*i+8],XGbuf[15*i+9],Max_div_Min);			//G
			Max_div_Min=M_Div_N(XGbuf[15*i+10],XGbuf[15*i+12]);
			fprintf(fp,"%14d%7d%7d%7d%7d%8.2f\n",XGbuf[15*i+10],XGbuf[15*i+11],XGbuf[15*i+12],XGbuf[15*i+13],XGbuf[15*i+14],Max_div_Min);	//B
		}
	}
	else
		for(i=0;i<HEADnum;i++)		//将HEADnum个头的校正参数和效果参数写入fp文件
		{
			Max_div_Min=M_Div_N(XGbuf[15*i+0],XGbuf[15*i+2]);
			fprintf(fp,"%4d%7d%7d%7d%7d%7d%8.2f",Def_Stp_Para[JZP],XGbuf[15*i+0],XGbuf[15*i+1],XGbuf[15*i+2],XGbuf[15*i+3],XGbuf[15*i+4],Max_div_Min);
			JZP=JZP+1;				//指向G通道
			Max_div_Min=M_Div_N(XGbuf[15*i+5],XGbuf[15*i+7]);
			fprintf(fp,"%7d%7d%7d%7d%7d%7d%8.2f",Def_Stp_Para[JZP],XGbuf[15*i+5],XGbuf[15*i+6],XGbuf[15*i+7],XGbuf[15*i+8],XGbuf[15*i+9],Max_div_Min);
			JZP=JZP+1;				//指向B通道
			Max_div_Min=M_Div_N(XGbuf[15*i+10],XGbuf[15*i+12]);
			fprintf(fp,"%7d%7d%7d%7d%7d%7d%8.2f\n",Def_Stp_Para[JZP],XGbuf[15*i+10],XGbuf[15*i+11],XGbuf[15*i+12],XGbuf[15*i+13],XGbuf[15*i+14],Max_div_Min);
			JZP=JZP+1;				//指向下一头的R通道
		}
}

/*==========================================================================/
/				*****静态偏移分步校正效果参数显示格式行写入*****			/
/		将Def_Stp_Para数组JZP开始的校正参数及Stp_Cai_XGP数组XGP开始的		/
/	效果参数写入fp文件														/	
/==========================================================================*/
void Cali_OFF_Dsp(int JZP,int XGP,FILE *fp)
{
	int	HEADnum=5;			//扫描头的个数	
	//效果参数值在Stp_Cai_XGP缓冲区为每通道10字节,每个头为3*10字节。显示时先将2字节的效果参数转换成1个字。
	int	XGbuf[120];			//5个头的效果参数值缓冲区,每通道5个字,每头3*5个字,5个头共75个字。
	//写入显示格式行
	fprintf(fp,"    ---------------  R通道  ----------------        -----------------  G通道  -----------------       -----------------  B通道  -----------------   \n");
	fprintf(fp,"参数值 最大值 象点数 最小值 象点数 平均值 大÷小  参数值 最大值 象点数 最小值 象点数 平均值 大÷小  参数值 最大值 象点数 最小值 象点数 平均值 大÷小\n");
	
	int	i;
	double Max_div_Min;
	for(i=0;i<15*HEADnum;i++)	//将上传的2字节效果参数值转换成1个字
		XGbuf[i]= (Stp_Cai_XGP[XGP+2*i]<<8) | (Stp_Cai_XGP[XGP+2*i+1]);

	int R,G,B;

	for(i=0;i<HEADnum;i++)		//将HEADnum个头的校正参数和效果参数写入fp文件
		{
			R=Def_Stp_Para[JZP];
			G=Def_Stp_Para[JZP+1];
			B=Def_Stp_Para[JZP+2];
			JZP=JZP+3;				//指向下一头的R通道

			if (R>31) R=32-R;
			if (G>31) G=32-G;
			if (B>31) B=32-B;

			Max_div_Min=M_Div_N(XGbuf[15*i+0],XGbuf[15*i+2]);
			fprintf(fp,"%4d%7d%7d%7d%7d%7d%8.2f",R,XGbuf[15*i+0],XGbuf[15*i+1],XGbuf[15*i+2],XGbuf[15*i+3],XGbuf[15*i+4],Max_div_Min);
			Max_div_Min=M_Div_N(XGbuf[15*i+5],XGbuf[15*i+7]);
			fprintf(fp,"%7d%7d%7d%7d%7d%7d%8.2f",G,XGbuf[15*i+5],XGbuf[15*i+6],XGbuf[15*i+7],XGbuf[15*i+8],XGbuf[15*i+9],Max_div_Min);
			Max_div_Min=M_Div_N(XGbuf[15*i+10],XGbuf[15*i+12]);
			fprintf(fp,"%7d%7d%7d%7d%7d%7d%8.2f\n",B,XGbuf[15*i+10],XGbuf[15*i+11],XGbuf[15*i+12],XGbuf[15*i+13],XGbuf[15*i+14],Max_div_Min);
		}
}

/*---------------------------两整数相除-------------------------------------/
/					若除数为零,则结果=99.99								/
/--------------------------------------------------------------------------*/
double M_Div_N(int A,int B)
{
	double C;
	if (B==0) C=99.99;
		else C=1.0*A/(B*1.0);
	return(C);
}

/*=====================2004年2月18日增加====================================/
/			*****初始化Def_Stp_Para数组内的缺省参数及分步参数*****			/
/		从jiaose.ini中读取并初始化Def_Stp_Para数组内的300字节下传参数		/
/				在校正设置界面打开及每次扫描前调用							/
/==========================================================================*/
void Stp_Para_INI()
{
	Stp_DefuP_INI();	//读取jiaose.ini文件内的缺省参数初始化Def_Stp_Para缓冲区中下传参数包的前150字节
	
	Stp_GanG_INI();		//初始化Def_Stp_Para数组后150字节中的感光参数

	Stp_Offset_INI();	//初始化Def_Stp_Para数组后150字节中的静态偏移参数

 	Stp_GanPs_INI();	//初始化Def_Stp_Para数组后150字节中的静态增益及偏色系数参数

	Stp_Cai_CtrP_INI();				//初始化分步校正控制参数及动态增益均值滤波控制参数

}

//----------------				2004.3.24 初始化缺省参数				------------//
//		读jiaose.ini文件,初始化Def_Stp_Para数组中0~149单元的150字节的缺省参数		//
//----------------------------------------------------------------------------------//
void Stp_DefuP_INI()
{
	int i,Tmp;
	//	***CCD线阵缺省参数***
	Tmp=GetPrivateProfileInt("CCD_Para","CCD_DefP_Ena",0,InitDir2);	
    Def_Stp_Para[0]	=LOBYTE(Tmp);	//CCD缺省参数有效标志:有效=0xA5

	Tmp=GetPrivateProfileInt("CCD_Para","Max_Pixel",10708,InitDir2);
    Def_Stp_Para[1]	=HIBYTE(Tmp);	//CCD线阵象点数
	Def_Stp_Para[2]	=LOBYTE(Tmp);
	Tmp=GetPrivateProfileInt("CCD_Para","Dmp_Pixel",46,InitDir2);
    Def_Stp_Para[3]	=LOBYTE(Tmp);	//CCD线阵头部哑元数
	Tmp=GetPrivateProfileInt("CCD_Para","Blk_Pixel",34,InitDir2);
    Def_Stp_Para[4]	=LOBYTE(Tmp);	//CCD线阵头部黑点数
	Tmp=GetPrivateProfileInt("CCD_Para","Add_Pixel",12,InitDir2);
    Def_Stp_Para[5]	=HIBYTE(Tmp);	//CCD线阵的附加感光象点数
	Def_Stp_Para[6]	=LOBYTE(Tmp);

	//	***LM9812时序缺省参数***
	i=8;
	int j;
	char TmpStr[10];
	strcpy(TmpStr,"LM98_CCD1");
	for (j=1;j<=8;j++)
	{
		TmpStr[8]=LOBYTE(0x30+j);
		Tmp=GetPrivateProfileInt(TmpStr,"Reg16",10,InitDir2);
		Def_Stp_Para[i+0]	=LOBYTE(Tmp);	//TR脉冲的宽度
		Tmp=GetPrivateProfileInt(TmpStr,"Reg18",10,InitDir2);
		Def_Stp_Para[i+1]	=LOBYTE(Tmp);	//TR沿距Q1沿的距离
		Tmp=GetPrivateProfileInt(TmpStr,"Reg19",10,InitDir2);
		Def_Stp_Para[i+2]	=LOBYTE(Tmp);	//光学黑点钳位的开始时刻
		Tmp=GetPrivateProfileInt(TmpStr,"Reg20",22,InitDir2);
		Def_Stp_Para[i+3]	=LOBYTE(Tmp);	//光学黑点钳位的开始时刻
		Tmp=GetPrivateProfileInt(TmpStr,"Reg21",0xad,InitDir2);
		Def_Stp_Para[i+4]	=LOBYTE(Tmp);	//RS脉冲的宽度及位置
		Tmp=GetPrivateProfileInt(TmpStr,"Reg22",10,InitDir2);
		Def_Stp_Para[i+5]	=LOBYTE(Tmp);	//参考电平采样的位置
		Tmp=GetPrivateProfileInt(TmpStr,"Reg23",22,InitDir2);
		Def_Stp_Para[i+6]	=LOBYTE(Tmp);	//信号电平采样的位置
		Tmp=GetPrivateProfileInt(TmpStr,"Reg27",0x40,InitDir2);
		Def_Stp_Para[i+7]	=LOBYTE(Tmp);	//测试波形输出(CDS/Clamp)
		i=i+8;
	}
 	
	//	*****  头尾重叠下传参数  *****
	int	Head,End,Adj;
	char HStr[10],EStr[9],AStr[9];

	i=72;
	strcpy(HStr,"Head_CNT1");
	strcpy(EStr,"End_CNT1");
	strcpy(AStr,"END1_Adj");

	for (j=1;j<=8;j++)
	{
		HStr[8]=LOBYTE(0x30+j);
		EStr[7]=LOBYTE(0x30+j);
		AStr[3]=LOBYTE(0x30+j);
		Head=GetPrivateProfileInt("CCD_Pj",HStr,10,InitDir2);
		End=GetPrivateProfileInt("CCD_Pj",EStr,10,InitDir2);
		Adj=GetPrivateProfileInt("CCD_Adjust",AStr,0,InitDir2);
		Def_Stp_Para[i+0]=HIBYTE(Head);		//头部重叠区象素数
		Def_Stp_Para[i+1]=LOBYTE(Head);
		Def_Stp_Para[i+2]=HIBYTE(End+Adj);  //尾部重叠区象素数
		Def_Stp_Para[i+3]=LOBYTE(End+Adj);
		i=i+4;
	}
	//修改第一头的头部重叠数:将头部剪切量加进去
	Head=GetPrivateProfileInt("CCD_Pj","Head_CNT1",10,InitDir2);
    Adj=GetPrivateProfileInt("CCD_Adjust","Head_Adj",10,InitDir2);
	Def_Stp_Para[72]=HIBYTE(Head+Adj);		//头部重叠区象素数+头部剪切量
	Def_Stp_Para[73]=LOBYTE(Head+Adj);


    //A0扫描仪:将尾部修改剪切量加到第五头的尾部剪切值中去
	//A1扫描仪:将尾部修改剪切量加到第三头的尾部剪切值中去
	End=GetPrivateProfileInt("CCD_Pj","End_CNT5",10,InitDir2);
    Adj=GetPrivateProfileInt("CCD_Adjust","END5_Adj",10,InitDir2);
	Def_Stp_Para[90]=HIBYTE(End+Adj);		//第5头尾部重叠区象素数+尾部剪切量
	Def_Stp_Para[91]=LOBYTE(End+Adj);

	//***分步校正缺省参数***
	i=104;
	Tmp=GetPrivateProfileInt("Step_JZ","Beg_CCD",1,InitDir2);
    Def_Stp_Para[i+0]	=LOBYTE(Tmp);	//开始的CCD号
	Tmp=GetPrivateProfileInt("Step_JZ","End_CCD",3,InitDir2);
    Def_Stp_Para[i+1]	=LOBYTE(Tmp);	//结束的CCD号
	Tmp=GetPrivateProfileInt("Step_JZ","Exp_ContFLG",0,InitDir2);
    Def_Stp_Para[i+2]	=LOBYTE(Tmp);	//强制感光控制标志:=0xA5-->关闭感光;=其它-->扫描仪控制

	Tmp=GetPrivateProfileInt("Step_JZ","Lin_Num",8,InitDir2);
    Def_Stp_Para[i+3]	=LOBYTE(Tmp);	//校正扫描行
	Tmp=GetPrivateProfileInt("Step_JZ","Lin_Num_Mi",3,InitDir2);
    Def_Stp_Para[i+4]	=LOBYTE(Tmp);	//校正扫描行数的幂
	Tmp=GetPrivateProfileInt("Step_JZ","Step_Vec",30000,InitDir2);
    Def_Stp_Para[i+5]	=HIBYTE(Tmp);	//校正步进速度
	Def_Stp_Para[i+6]	=LOBYTE(Tmp);

	//***电机速度控制缺省参数***
/*
	i=114;	//零位搜索
	Tmp=GetPrivateProfileInt("Motor_Zero","Start_Vec",25000,InitDir2);
    Def_Stp_Para[i+0]	=HIBYTE(Tmp);	//启动速度
	Def_Stp_Para[i+1]	=LOBYTE(Tmp);
	Tmp=GetPrivateProfileInt("Motor_Zero","Max_Vec",2500,InitDir2);
    Def_Stp_Para[i+2]	=HIBYTE(Tmp);	//最高速度
	Def_Stp_Para[i+3]	=LOBYTE(Tmp);
	Tmp=GetPrivateProfileInt("Motor_Zero","Max_Acc",100,InitDir2);
    Def_Stp_Para[i+4]	=HIBYTE(Tmp);	//加速度最大值
	Def_Stp_Para[i+5]	=LOBYTE(Tmp);
	Tmp=GetPrivateProfileInt("Motor_Zero","Max_Acc_Stp",500,InitDir2);
    Def_Stp_Para[i+6]	=HIBYTE(Tmp);	//最大加速步数
	Def_Stp_Para[i+7]	=LOBYTE(Tmp);

*/
	i=122;	//移动定位
	Tmp=GetPrivateProfileInt("Motor_Move","Start_Vec",25000,InitDir2);
    Def_Stp_Para[i+0]	=HIBYTE(Tmp);	//启动速度

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -