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

server/2025/1/15 19:23:19/

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

二、软光敏逻辑
两大点:①如何判断环境亮度 ②黑白模式下,如何分辨当前场景这光亮是环境光还是机器自己的红外灯反光。实现这两点软光敏基本就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/server/158635.html

相关文章

软件系统分析与设计综合实践-家庭维修服务系统小程序(代码见附录,私发)

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代…

Java堆内存分析

(一)、线上查看堆内存统计 # 命令用于打印堆内存中每个类的实例数量及其占用的内存&#xff0c;并且只包括活动对象&#xff08;即存活的对象&#xff09; jmap -histo:live <pid># 输出到文件方便查看 jmap -histo:live 12345 > aaa.txt(二)、下载dump文件&#xff0…

Microsoft Sql Server 2019 函数理解

说到函数&#xff0c;首先和存储过程作个比较吧&#xff0c;两者有一个共同点都是预编译优化后存储在磁盘中&#xff0c;所以效率 要比T-SQL高一点点。值得注意的是&#xff0c;存储过程可以创建或访问临时表&#xff0c;而函数不可以&#xff1b; 同时函数不可 以修改表中的数…

springcloud负载均衡原理

Spring Cloud负载均衡的原理主要涉及到客户端负载均衡的实现方式&#xff0c;特别是在微服务架构中如何均匀分配请求到多个服务实例上。以下是Spring Cloud负载均衡的详细原理&#xff1a; 1. 负载均衡概述 负载均衡&#xff08;Load Balancing&#xff09;是在分布式系统中&…

Oracle+11g+笔记(9)-控制文件及日志文件的管理

Oracle11g笔记(9)-控制文件及日志文件的管理 9、控制文件及日志文件的管理 Oracle 数据库包含有三种类型的物理文件&#xff0c;分别是数据文件、控制文件和日志文件&#xff0c;其中数据文件是用来存储数 据的&#xff0c;而控文件和日志文件则用于维护和保障 Oracle 数据库…

selenium在Linux环境下截屏(save_screenshot)中文乱码的问题

在Linux环境下会browser.save_screenshot方法保存的图片中中文乱码&#xff0c;不便于排查问题&#xff0c;解决办法如下&#xff1a; 1、设置浏览器options选项 options.add_argument("--langzh-CN") # 设置语言为中文 2、安装中文字体 apt-get update apt-get in…

GitLab CI/CD使用runner实现自动化部署前端Vue2 后端.Net 7 Zr.Admin项目

1、查看gitlab版本 建议安装的runner版本和gitlab保持一致 2、查找runner 执行 yum list gitlab-runner --showduplicates | sort -r 找到符合gitlab版本的runner&#xff0c;我这里选择 14.9.1版本 如果执行出现找不到下载源&#xff0c;添加官方仓库 执行 curl -L &quo…

基于springboot+vue的 嗨玩-旅游网站

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…