日夜切换

更新时间:2023-08-09 09:25:02下载pdf

本文介绍 IPC(IP Camera)设备的日夜切换函数的调用和内部处理流程。

功能描述

日夜切换用于切换 IPC 设备的 白天模式夜间模式,区别在于 IR-CUT (infrared cut)器件的开启和关闭。

  • 当设备位于白天模式时:设备关闭红外灯,镜头的 IR-CUT 器件切换为禁止透过红外光模式。此时,透过可见光、过滤掉红外光,视频显示彩色画面。

  • 当设备位于夜间模式时:设备开启红外灯,镜头的 IR-CUT 器件切换为全透光模式。此时,透过可见光、透过红外光,视频显示黑白画面。

工作原理

组件通过调用底层接口获取光敏传感器(硬光敏)或 ISP 计算画面亮度(软光敏)的方式,获取当前环境亮度,通过内部逻辑判断当前日夜状态,并通过发送消息通知其他组件对红外灯、IR-CUT 和 DSP 模式等进行控制,实现与设备环境匹配的日夜切换功能。

日夜切换

开发指导

运行环境

关联组件

  • tkl_media:用于获取软光敏亮度值。实现载入日夜对应图像效果,控制帧率和彩色/黑白模式切换等
  • app_sys_msg:用于发送日夜切换控制消息
  • app_user_event:用于接收和执行日夜切换控制消息
  • app_sys_ad:用于获取硬件光敏值(可选)

使用方法

  • 用户设置初始化参数 TY_SYS_DN_ATTR_S,指定场景触发判断时间间隔、切换临界场景连续触发次数等,设置获取底层外设参数回调从对应设备获取光敏亮度值。
  • 调用初始化函数 ty_sys_dn_switch_init
  • 调用成功后即启动日夜切换线程,自动调用回调获取当前亮度和进行日夜切换。

数据结构

typedef struct TY_SYS_DN_ATTR_
{
    unsigned int u32lock_time;                             ///< 1 分钟连续 5 次切换上锁时长,0 则不上锁
    unsigned int u32trigger_interval;                      ///< 场景触发判断时间间隔(s),不为 0
    unsigned int u32trigger_times;                         ///< 切换临界场景连续触发次数,不为 0
    int s32day2night_threshold;                            ///< 白天切换阈值
    int s32night2day_threshold;                            ///< 夜晚切换阈值
    int whiteled_patch1;                                   ///< 白光灯补偿
    int whiteled_patch2;                                   ///< 白光灯补偿
    TKL_ISP_DN_MODE_E e32init_mode;                        ///< 初始模式(默认白天)
    TY_GET_PERIPHERAL_PARAM_CB get_peripheral_param_cb;    ///< 获取底层外设参数(必要)
} TY_SYS_DN_ATTR_S;

API 说明

日夜切换初始化

初始化日夜切换功能,启动日夜切换线程。输入参数必须提供 get_peripheral_param_cb,设置初始模式,u32trigger_intervalu32trigger_times 不能为 0

/**
 * @brief
 *
 * @param dn_attr
 * @return int
 */
int ty_sys_dn_switch_init(TY_SYS_DN_ATTR_S *dn_attr);

使能日夜切换

/**
 * @brief 使能日夜切换
 *
 * @param on_off 0-off 1-on
 */
void ty_sys_dn_set_enable(bool on_off);

获取日夜开关状态

/**
 * @brief 获取日夜开关状态
 *
 * @param on_off 0-off 1-on
 */
void ty_sys_dn_get_enable(bool *on_off);

设置日夜切换模式

/**
 * @brief
 *
 * @param mode day and night mode
 */
void ty_sys_dn_set_config_mode(TKL_ISP_DN_MODE_E mode);

获取日夜切换模式列表

/**
 * @brief
 *
 * @param mode
 */
void ty_sys_dn_get_config_mode(TKL_ISP_DN_MODE_E *mode);

获取当前日夜状态

/**
 * @brief
 *
 * @return int
 */
int ty_sys_dn_get_cur_mode(void);

获取当前日夜切换模式

/**
 * @brief 获取当前日夜切换模式
 *
 * @param mode
 */
void ty_sys_dn_get_cur_mode_config(TKL_ISP_DN_MODE_E *mode);

日夜切换全彩模式初始化

/**
 * @brief 日夜切换全彩模式初始化
 *
 * @param dn_attr
 * @param color_mode_init
 * @return int
 */
int ty_sys_dn_color_mode_init(TY_SYS_DN_ATTR_S *dn_attr, int color_mode_init);

设置 siren 开关接口

/**
 * @brief 设置 siren 开关接口
 *
 * @param status
 * @return int
 */
int ty_sys_siren_switch(int status);

设置日夜切换点阈值

/**
 * @brief 设置切换点阈值
 *
 * @param s32day2night_threshold 白天切夜视阈值
 * @param s32night2day_threshold 夜视切白天阈值
 * @return void
 */
void ty_user_dn_threshold_set(int s32day2night_threshold, int s32night2day_threshold);

设置白光灯亮灯的事件和白光灯亮灯时长

/**
 * @brief 设置白光灯亮灯的事件和白光灯亮灯时长
 *
 * @param human_flag 人形事件
 * @param flight_warn_on_off 子设备报警检测开关事件
 * @param whiteled_time 白光灯亮灯时长
 * @return int
 */

void ty_user_dn_light(int human_flag, int flight_warn_on_off, int whiteled_time);

常见问题

日夜切换为什么不生效?

  • 确认 IR-CUT 物料是否正常,IR-CUT 是否正常供电
  • 确认切换阈值设置是否正确,例如阈值错误设置为 0 或者极大值。

切换到夜视画面,为什么全黑?

  • 确认红外灯是否亮起。
  • 确认 IR-CUT 物料的极性是否配错了,夜视配成了红外光模式,导致红外光都被过滤掉。

切换到白天画面,为什么明显偏红?

确认 IR-CUT 物料的极性是否配错了,白天配成了白片,导致红外光也入射到传感器表面。

白天切晚上、晚上切白天的照度值,为什么和预想的偏差大?

一般是日夜切换阈值不合适,需要修改日夜切换阈值,修改建议如下:

  • 日切夜阈值越小,代表可见光照度越低时,才会切换夜晚模式。夜切日阈值越大,代表可见光照度越高时,才会切换白天模式。
  • 日切夜阈值跟夜切日阈值相同或者很接近时,非常容易发生日夜反复切换,一般建议夜切日阈值大于等于四倍的日切夜阈值。

当软光敏 IPC 贴着窗边或者贴着镜面物体放置,早上为什么无法从夜视切换白天?

当 IPC 附近有镜面物体时,会有较多红外光从镜面物体反射回镜头,导致日夜切换算法的原始数据出现偏差,算法认为当前需要将 IPC 停留在夜视。

此时建议优先考虑挪开镜面物体或者更换 IPC 摆放位置,其次再考虑尝试修改日夜切换的阈值。

当软光敏 IPC 对着某些近处镜面物体,为什么会发生来回反复切换然后锁死十几分钟?

跟上一个常见问题的原因类似,当 IPC 附近有镜面物体时,会有较多红外光从镜面物体反射回镜头,导致日夜切换算法的原始数据出现偏差,算法计算结果会在白天或夜视之间变化。

  • 此时建议优先考虑挪开镜面物体或者更换 IPC 摆放位置,其次再考虑尝试修改日夜切换的阈值。
  • 锁死十几分钟是因为 IPC 日夜切换算法存在保护逻辑,当发生 5 次 IR-CUT 切换以后,认为当前环境亮度不稳定,锁死 15 分钟来保护 IR-CUT 的寿命,等待 15 分钟后日夜切换逻辑自动解锁再继续运作。