一段时间自适应曝光的代码,跟随不算太好。有兴趣的同学可以自行改进。
/*变量初始化
g_Con.timer = 0;
g_barCode_feature.exposureTime = 10;
g_barCode_feature.threshold = 140;
*/
/* CCD结构体 */
typedef
struct
{
// uint8 status;//属性
/*
属性分配 ------
0x80 : 增加曝光时间
0x01 : 减少曝光时间
*/
uint8 img[128];// 原始图像
uint8 max;// 图像最大值
uint8 min;// 图像最小值
uint16 aver;// 图像平均值
uint8 threshold;// 检测阈值
uint16 exposureTime;// 曝光时间
}
__CCD_get_barCode;
/* 中断 */
void PIT0_IRQHandler()
{
PIT_Flag_Clear(PIT0);
if( g_barCode_feature.exposureTime == g_Con.timer )
{
g_barCode_feature = sg_ccdVar_AutoAdjust(g_barCode_feature);// 时间自适应调整
g_Con.timer = 0;
}
g_Con.timer ++;// 控制时间自加
}
/* 自适应调整 */
__CCD_get_barCode sg_ccdVar_AutoAdjust( __CCD_get_barCode Gaia )
{
CCD1get(Gaia.img);
Gaia.max = 0;Gaia.min = 255;
for(uint8 loop=0;loop<128;loop++)
{
Gaia.aver = Gaia.aver + Gaia.img[loop];
if(Gaia.img[loop]>Gaia.max){Gaia.max = Gaia.img[loop];}
if(Gaia.img[loop]<Gaia.min){Gaia.min = Gaia.img[loop];}
}
Gaia.aver = Gaia.aver/128;
if( Gaia.aver > Gaia.threshold + 5 )
{
if(Gaia.aver > Gaia.threshold + 20)
{
if( (Gaia.exposureTime - (Gaia.aver - Gaia.threshold)) > 0 )
{
Gaia.exposureTime -= (Gaia.aver - Gaia.threshold);
}
else
{
Gaia.exposureTime = 1;
}
}
else{Gaia.exposureTime--;}
}
if( Gaia.aver < Gaia.threshold - 5 )
{
if(Gaia.aver < Gaia.threshold - 20){Gaia.exposureTime += (Gaia.threshold - Gaia.aver);}
else{Gaia.exposureTime++;}
}
if(Gaia.exposureTime<1){Gaia.exposureTime = 1;}
return Gaia;
}