安防摄像头 白天 ↔ 全彩 模式切换逻辑设计

目录

一、先明确核心定义

二、最终切换逻辑

三、为什么这套逻辑最适配

四、参数推荐值

五、高级防误触发策略

六、极简伪代码

七、最终总结


核心条件:

  1. 全彩模式 :环境暗(AE 参数大)→ 开启补光灯 → 开启后AE 参数依然偏大
  2. 白天模式:环境亮 → 关闭补光灯 → AE 参数小
  3. 核心难点:全彩模式开灯后 AE 不会降回白天水平,不能单纯用 AE 绝对值判断模式

一、先明确核心定义

1. AE 参数是什么?

安防常用:曝光时间 (shutter) * 增益 ( gain ) 统一用一个值判断:AE 评分 = 曝光时间 +*增益权重(权重自己调,比如增益 ×2)

2. 两个关键阈值

  • TH_DARK:环境暗阈值(AE > 此值 = 环境暗)
  • TH_BRIGHT:环境亮阈值(AE < 此值 = 环境亮)
  • 规则:TH_DARK > TH_BRIGHT(用迟滞回差,防止频繁切)

3. 模式定义

  • 白天模式:补光灯关闭,AE 由环境光自然调节
  • 全彩模式:满足暗条件 → 开补光灯,AE 保持大参数(硬件特性)

二、最终切换逻辑

核心原则

  1. 白天 → 全彩 :只看关灯状态下的 AE
  2. 全彩 → 白天 :只看开灯状态下的 AE
  3. 加入防抖延时,杜绝频闪 / 反复切换

完整逻辑流程图

1. 白天模式 → 全彩模式

复制代码
当前状态:白天模式(补光灯 OFF)
持续判断:
  如果 【AE > TH_DARK】 并且 【持续 N 帧】
  则:
    切换为 全彩模式
    打开补光灯

2. 全彩模式 → 白天模式

复制代码
当前状态:全彩模式(补光灯 ON)
持续判断:
  如果 【AE < TH_BRIGHT】 并且 【持续 M 帧】
  则:
    切换为 白天模式
    关闭补光灯

三、为什么这套逻辑最适配

  1. 白天切全彩 关灯测 AE → 真的暗 → 才切 不会误触发

  2. 全彩切白天 开灯测 AE → 虽然 AE 比白天大,但环境足够亮时,开灯后的 AE 会明显降低 只要低于亮阈值,就说明环境已经亮到不需要补光


四、参数推荐值

参数 推荐值 说明
TH_DARK(暗阈值) 环境很暗才触发
TH_BRIGHT(亮阈值) 中等 开灯后 AE 明显下降即满足
迟滞回差 TH_DARK - TH_BRIGHT ≥ 30% 防止来回跳变
防抖帧数 N 10~30 帧 白天切全彩,稍灵敏
防抖帧数 M 30~50 帧 全彩切白天,更保守

举例: TH_DARK = 100 TH_BRIGHT = 60 回差 40,非常稳定


五、高级防误触发策略

1. 梯度切模

复制代码
白天 → 预备全彩(不开灯)→ 确认暗 → 全开彩

2. 强光抑制

如果画面有强光点(车灯、路灯),但整体环境暗 → 不切白天图像整体亮度均值辅助判断,不要只看 AE。其实,也可以根据分块的图像亮度信息进行判断。当分块亮度小于一定阈值切满足EV条件才切,否则不切,避免频繁切换的操作。

3. 时间辅助

配合当地时间

  • 白天 6:00~18:00:优先白天模式
  • 夜晚 18:00~6:00:优先全彩模式 纯光控也可以,时间只是辅助更稳。

六、极简伪代码

cpp 复制代码
// 状态机
typedef enum {
    MODE_DAY,
    MODE_FULLCOLOR
} WorkMode;

WorkMode current_mode = MODE_DAY;
int dark_cnt = 0;
int bright_cnt = 0;

#define TH_DARK    100
#define TH_BRIGHT  60
#define N_FRAME    20
#define M_FRAME    40

void ae_check_task(int ae_value)
{
    if (current_mode == MODE_DAY) {
        // 白天 → 全彩:关灯测AE
        if (ae_value > TH_DARK) {
            dark_cnt++;
            if (dark_cnt >= N_FRAME) {
                // 切换
                current_mode = MODE_FULLCOLOR;
                open_light();
                dark_cnt = 0;
            }
        } else {
            dark_cnt = 0;
        }
    }
    else if (current_mode == MODE_FULLCOLOR) {
        // 全彩 → 白天:开灯测AE
        if (ae_value < TH_BRIGHT) {
            bright_cnt++;
            if (bright_cnt >= M_FRAME) {
                // 切换
                current_mode = MODE_DAY;
                close_light();
                bright_cnt = 0;
            }
        } else {
            bright_cnt = 0;
        }
    }
}

七、最终总结

  1. 白天切全彩:关灯测 AE,大于暗阈值 → 切
  2. 全彩切白天:开灯测 AE,小于亮阈值 → 切
  3. 迟滞 + 防抖帧数:杜绝反复切换

全彩模式开灯后 AE 依然偏大 → 不影响判断,因为我们用开灯后的相对 AE做切回条件。


相关推荐
大熊背6 天前
树莓派 libcamera IPA 框架解析
linux·ipa·isppipeline
大熊背11 天前
树莓派IspPipeline LSC模块原理详解
算法·lsc·isppipeline·mesh lsc
大熊背14 天前
树莓派相机自动白平衡详解(四)
算法·树莓派·白平衡·isppipeline
大熊背16 天前
树莓派相机自动白平衡详解(二)
算法·白平衡·isppipeline
大熊背2 个月前
双目拼接亮度差优化
isppipeline·双目拼接·亮度差消除
大熊背4 个月前
ISP Pipeline中Lv实现方式探究之七--lv值计算框架final_version
自动曝光·对数函数·定点计算·isppipeline
大熊背4 个月前
Serial over TCP实现原理
网络·tcp·isppipeline
大熊背5 个月前
如何利用Lv值实现三级降帧
算法·自动曝光·lv·isppipeline
大熊背5 个月前
ISP Pipeline中Lv实现方式探究之三--lv计算定点实现
数据结构·算法·自动曝光·lv·isppipeline