君正ISP记录三:AE与AWB衍生功能“软光敏“

embedded/2025/1/11 19:45:56/

一、软光敏介绍
消费类摄像机,一般都存在全彩模式和黑白模式,即环境照度较高画面全彩,环境照度较低 画面黑白、开红外补光灯。这时候涉及一个切换问题,如何判断当前的环境照度。
最开始使用的都是硬光敏,即光敏电阻,后需便开发完善了软光敏,主要目的就是代替硬光敏实现判断功能。

二、软光敏逻辑
两大点:①如何判断环境亮度 ②黑白模式下,如何分辨当前场景这光亮是环境光还是机器自己的红外灯反光。实现这两点软光敏基本就OK了

1、基本实现原理
使用AE模块的EV值(增益和曝光行合起来的一个参数)来判断画面亮度,AWB模块的RGB分量来判断红外灯反光场景。
白天只判断亮度,超过阈值后切黑白、开红外灯;夜视下通过EV值来判断亮度,RGB分量判断红外占比,到达一定亮度,且红外灯占比很小时切全彩、关灯板

2、实现流程
①获取画面所需信息

/*获取AE曝光值*/
iRet = IMP_ISP_Tuning_GetAeExprInfo(0,&ExpAttr);
if (iRet != 0) {UTIL_ERR();return -1;
}
ev = ExpAttr.ExposureValue;/*拿到AWB 统计信息*/
iRet = IMP_ISP_Tuning_GetAwbStatistics(0,&awb_zone);
if (iRet != 0) {UTIL_ERR("", iRet);return -1;
}
memcpy(zone_r,awb_zone.awb_r.statis,225 * 4);
memcpy(zone_g,awb_zone.awb_g.statis,225 * 4);
memcpy(zone_b,awb_zone.awb_b.statis,225 * 4);


②处理获取到的awb信息

	/*计算画面总的RBG分量*/for(i = 0;i < 15; i++) {for(j = 0;j < 15; j++) {r_sum += zone_r[i][j];g_sum += zone_g[i][j];b_sum += zone_b[i][j];}}if(g_sum > 0) {rg = (r_sum*100)/g_sum; //计算rg的100倍bg = (b_sum*100)/g_sum; //计算bg的100倍rgdiff = abs(rg - 100); //r跟g分量的差值bgdiff = abs(bg - 100); //b跟g分量的差值diff = (rgdiff + bgdiff)/2;}


③软光敏具体功能实现

	if(1 == Day_Night) {/*当前白天,判断是否切换夜视*/if((int)ev > to_night_ev) { /*to_night_ev 根据不同sensor设的切换阈值*//*ev值很大,说明当前场景很黑,所以切换夜视模式*/night_count++;if (night_count > 3) {night_count = 0;/*这里放切黑白夜视的需要的各种函数,灯板、ISP模式、IRCUT等*/}}}else {night_count = 0;}}else if(0 == IR_Mode_Is_Day_Night) {   /*当前夜视,判断是否切换白天*/if (ev < to_day_ev && diff > 8 ) {/*to_day_ev 根据不同sensor设的切换阈值*//*diff 处理的awb信息,实测基本上所有sensor都适配这个数,有特殊的可以单独拎重设*/day_count ++;}if (day_count > 6) {/*这里放切黑白夜视的需要的各种函数,灯板、ISP模式、IRCUT等*/day_count = 0;}}}


这样基本功能就实现了

3、延伸
①一些主控没通过类似方法判断红外灯反光,还坚持要上软光敏的话,可以退而求其次,使用模式锁逻辑。
具体原理:软光敏在一定时间内反复切,比如 一分钟内来回切换了五次,就判断为红外灯反光场景,直接固定黑白模式一定时间,不走软光敏。该原理也可用于白光灯补光但需要上软光敏的项目
②有时候白切黑\黑切白阈值 设置的太近了,也会出发频切
③有些场景有些杂光混合,不好判断,也不想上模式锁的话,可在软光敏新增一个预切机制
具体原理:黑切白前,记住当前场景的参数,即上文代码里的diff,先关灯板切到白天,如果EV值达到白切黑的阈值,那便切到晚上,在之前记住的参数的一定范围内,不做模式切换。

                        
原文链接:https://blog.csdn.net/sashimi69/article/details/140639210


http://www.ppmy.cn/embedded/153103.html

相关文章

HTML 迷宫游戏

HTML 迷宫游戏 相关资源文件已经打包成压缩文件&#xff0c;可双击index.html直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着开源精神的想法&#xff0c;望大家喜欢&#xff0…

React中 Reconciliation算法详解

React 中的 Reconciliation&#xff08;协调算法&#xff09;详解 Reconciliation 是 React 用来更新 UI 的核心算法。它的主要目标是在更新组件时&#xff0c;尽可能高效地找出需要改变的部分&#xff0c;并将这些变更应用到真实 DOM 中。 一、Reconciliation 的核心概念 Re…

kubernetes第七天

1.影响pod调度的因素 nodeName 节点名 resources 资源限制 hostNetwork 宿主机网络 污点 污点容忍 Pod亲和性 Pod反亲和性 节点亲和性 2.污点 通常是作用于worker节点上&#xff0c;其可以影响pod的调度 语法&#xff1a;key[value]:effect effect:[ɪˈfek…

【STM32】利用SysTick定时器定时1s

1.SysTick简单介绍 SysTick定时器是一个24位的倒计数定时器&#xff0c;当计数到0时&#xff0c;将从RELOAD寄存器中自动重装载定时初值&#xff0c;开始新一轮计数。 SysTick定时器用于在每隔一定的时间产生一个中断&#xff0c;即使在系统睡眠模式下也能工作。 关于SysTic…

《机器学习》从入门到实战——决策树

目录 一、简介 二、基本结构 三、构建过程 四、API接口解析 1、决策树--分类 &#xff08;1&#xff09;、接口调用方法 &#xff08;2&#xff09;、参数解析 2、决策树--回归 &#xff08;1&#xff09;、接口调用方法 &#xff08;2&#xff09;、参数解析 五、代…

计算机网络之---数据传输与比特流

数据传输的概念 数据传输是指将数据从一个设备传输到另一个设备的过程。传输过程涉及将高层协议中的数据&#xff08;如包、帧等&#xff09;转化为比特流&#xff0c;在物理介质上传输。 比特流的概念 比特流是数据传输中最基本的单位&#xff0c;它是由0和1组成的连续比特…

Swift UI开发指南:修饰器特性(modifiers)

SwiftUI开发指南&#xff1a;修饰器特性&#xff08;Modifiers&#xff09; 什么是修饰器&#xff1f;修饰器的特性示例&#xff1a;改变文本颜色代码&#xff1a;效果&#xff1a; 常用修饰器列表修饰器的最佳实践总结 在SwiftUI中&#xff0c;修饰器&#xff08;modifiers&am…

[免费]微信小程序(高校就业)招聘系统(Springboot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序(高校就业)招聘系统(Springboot后端Vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序(高校就业)招聘系统(Springboot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项目介绍…