【分享代码】一段时间自适应曝光的代码,跟随不算太好。

一段时间自适应曝光的代码,跟随不算太好。有兴趣的同学可以自行改进。
/*变量初始化
    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;
}

永不止步步 发表于11-13 15:08 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67417个|学分:381091个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号