本文来自于我的前同事-小卢,一个很有个性,能力又不错的年轻小伙子!
(文章已经得他本人同意分享)
AE 基本概念
cmos sensor通过光电转换将光信号最终转换成电信号,再通过 ISP 处理将电信号转换成模拟信号(即一张正常的图片)。当图片亮度与预设值的目标亮度差异过大时,AE 算法会调整 sensor 的放大倍数以及曝光时间来获得合适的亮度。
曝光加法公式: AV + TV = EV = BV + SV,其中
AV:光圈级数
TV:快门级数
BV:环境亮度级数
SV:感光度,即 ISO
(sensor 放大器作用于公式中的 ISO,曝光时间对应于 TV)
AE 算法
AE 算法会计算当前图像亮度,并与 AE param 中的阈值进行比较,从而控制 sensor 选择更合适的快门组合。而计算亮度最重要的是配置合适的计算区域。
1. 曝光表
曝光表定义了放大倍数和曝光时间
例如对于 {256, 1} 这一组,代表 gain = 1.0,line_count = 1.
曝光表通过 exp_index 建立索引,exp_index 越大,代表使用的 gain 和 line_count 越大,也意味着环境亮度越低。
exp_index 与 lux_index 不同,当 target_luma = cur_luma 时,
exp_index = lux_index
2. 测光区域
即定义如何计算当前图像的亮度。
- 帧平均(整张图片的平均亮度)
- 中心权重(中心占比最大,四周依次减小)
点测光(只考虑画面中心,一般用于 touch AE)
image.png
测光区域为一 16*16 的矩阵,对应位置的值越大,代表该区域亮度占比最大
(AE Parameter 中会配置两个矩阵,一个用于中心权重,一个用于点测光,根据 HAL 所传参数的不同,会调用对应的权重表;当前平台只支持前三种权重表,其它的需要客制化)
3. 目标亮度
目标亮度有多种选择,根据不同的场景,目标亮度会有所不同,这也是平台差异化比较大的地方,高端的平台针对大部分场景都有特定的目标机制,例如夜景、平坦景、高光区域、背光区域等等。MSM8909 主要的亮度目标机制是 default AE target 和 outdoor AE target(夜景的 AE target 参数中不支持,但可在 q3a 中设置)。
// #define AEC_LOW_LIGHT_LUMA_TARGET_INIT 26
// #define AEC_LOW_LIGHT_LUMA_START_IDX_INIT 350
// #define AEC_LOW_LIGHT_LUMA_END_IDX_INIT 370
AE target:即 ISP 希望 sensor 输出的图片达到的亮度,对于第一次进相机,ISP 检测到当前帧的亮度 cur_luma 低于目标亮度 target_luma,就会增大 exp_index 获取新的 gain & line_count 进行重新曝光,直到 cur_luma 和 target_luma 相当
4. 目标亮度(人脸检测)
对于没有人物的场景,AE 算法会平衡整体图片的亮度,但当画面中人物占主体时,如果不作特别处理,当人物处于逆光场景时,人脸会很暗,当人物处于暗环境时,人脸又会过曝。这对于人物占主体的场景而言,是非常不合适的,因此,当检测到人脸时,需要有特别的 AE 算法。
MSM8909 支持人脸识别,也支持 face AE,当场景中检测到人脸时,会额外计算出人脸区域内的 face_luma,根据一定比例与 cur_luma 混合得到 final_luma,再将 final_luma 作为帧亮度与 AE Target 进行比较
8909 的 face AE 机制也很简单,weight 代表 face_luma 的占比
final_luma = face_luma ** weight + cur_luma * * (1 - weight)
人脸场景需要考虑两种情况:
- 逆光场景:该场景下环境亮度很高,当提升人脸亮度时,必然会使背景过曝,如果提升亮度后,背景过曝严重,则可提高 face weight;
- 夜景:由于环境亮度低,识别到人脸时,AE 会减小 exp_index 保证人脸不过曝
网友评论