3. 3A算法基础(上):自动曝光(AE)原理
各位好,我是老张。在高通平台摸爬滚打了八年,经手了从骁龙820到8 Gen 3的十几款旗舰机,要说哪个模块最让人又爱又恨,我第一个投票给AE——自动曝光。
AE做得好,用户随手一拍就是好片;AE调不好,白天过曝、晚上死黑,用户直接骂娘。今天咱们就把AE的底裤扒干净,从原理到实战,一条龙讲透。
3.1 AE到底在干什么?
说白了,AE就是相机的"瞳孔"。人眼看亮处会缩瞳,看暗处会散瞳,AE干的是同一件事——根据场景亮度,自动调整三个参数:
- 曝光时间(Exposure Time):传感器收集光的时间,单位毫秒或行数
- 模拟增益(Analog Gain):传感器读出前的电压放大,单位dB
- 数字增益(Digital Gain):ISP内部的数字放大,单位倍数
这三个参数组合起来,决定了最终图像的亮度。高通平台把这套机制封装在cam_ae_module里,我们调试时主要跟它打交道。
核心公式:
最终亮度 = 曝光时间 × 模拟增益 × 数字增益
这个公式贯穿整个AE调试,你调的任何参数最终都会落到这三个变量上。
3.2 AE收敛速度:快还是慢?
收敛速度,就是相机从当前亮度调整到目标亮度需要多少帧。我见过不少工程师一上来就问:"老张,收敛速度设多少合适?"
我的回答是:看场景。
高通平台通过AE Convergence Speed参数控制收敛速度,单位是"帧"。举个例子:
// 高通AE收敛速度配置示例
ae_convergence_speed = {
.fast_speed = 5, // 快速收敛:5帧完成
.normal_speed = 15, // 正常收敛:15帧完成
.slow_speed = 30 // 慢速收敛:30帧完成
}
这里有个坑——不是越快越好。我曾经在一个项目中把收敛速度调到3帧,结果用户从室内走到室外,画面像抽风一样忽明忽暗,体验极差。
我的经验:
预览模式下,收敛速度建议设在8-15帧。太快了画面闪烁,太慢了用户等不及。拍照模式可以适当放慢到20-30帧,追求更稳定的曝光。
3.3 目标亮度调节:你到底想要多亮?
目标亮度(Target Luminance)是AE的"靶心"。高通平台用target_luma来表示,单位是Y值(0-255)。
默认值通常是110-120,但实际项目中很少直接用默认值。为什么?因为不同场景对亮度的要求完全不同:
| 场景 | 推荐目标亮度 | 说明 |
|---|---|---|
| 普通白天 | 110-120 | 标准亮度,细节保留好 |
| 夜景 | 80-100 | 压低亮度,减少噪点 |
| 人像 | 130-140 | 提亮肤色,显得通透 |
| 逆光 | 100-110 | 平衡高光和阴影 |
你想想看,如果夜景也用120的目标亮度,那画面噪点会多到没法看。所以目标亮度必须跟场景绑定。
注意:
目标亮度不是越高越好。我见过有人把目标亮度调到160,结果人脸惨白,高光全爆。记住:亮≠好,平衡才是王道。
3.4 AE权重表(Metering):让相机"看"对地方
权重表,说白了就是告诉相机:画面里哪些区域更重要。高通平台把画面分成若干个格子,每个格子分配一个权重值。
默认的权重表是平均测光——所有格子权重一样。但实际场景中,我们往往需要让相机"偏袒"某些区域。
举个例子,人脸测光:
// 高通平台人脸测光权重表示例(5x5网格)
ae_metering_weight = {
{1, 1, 2, 1, 1},
{1, 3, 5, 3, 1},
{2, 5, 8, 5, 2},
{1, 3, 5, 3, 1},
{1, 1, 2, 1, 1}
}
这个权重表把中心区域的权重设到8,边缘只有1。这样AE会优先保证中心区域的曝光准确。
我在项目中遇到过一个问题:某款手机拍文档时,中心区域总是过曝。排查了半天,发现是权重表太"偏心"了——中心权重太高,导致AE为了压暗中心,把整体曝光拉低,结果边缘全黑了。
避坑指南:
我曾经在调试一款折叠屏手机时,发现展开和折叠状态下,权重表需要完全不同的配置。展开时屏幕大,用户更关注中心;折叠时屏幕小,用户更关注整体。所以权重表一定要跟屏幕尺寸和用户习惯挂钩。
3.5 实战:配置一个合理的AE策略
好了,理论讲完了,咱们来点实际的。下面是我在一个项目中用过的AE配置方案:
// 实战AE配置(高通平台)
ae_config = {
// 收敛速度
.convergence_speed = {
.preview = 10, // 预览模式:10帧收敛
.capture = 25, // 拍照模式:25帧收敛
.video = 15 // 录像模式:15帧收敛
},
// 目标亮度
.target_luma = {
.normal = 115, // 普通场景
.night = 90, // 夜景
.portrait = 135, // 人像
.backlight = 105 // 逆光
},
// 权重表(中心加权)
.metering_weight = {
{1, 2, 3, 2, 1},
{2, 4, 6, 4, 2},
{3, 6, 9, 6, 3},
{2, 4, 6, 4, 2},
{1, 2, 3, 2, 1}
}
}
这个配置的核心思路是:预览快、拍照稳、场景自适应。预览时快速收敛让用户看到画面变化,拍照时慢速收敛追求最佳曝光,不同场景用不同的目标亮度。
3.6 AE调试的"三板斧"
最后,分享我调试AE时的三个核心步骤:
- 先定目标亮度:根据场景确定合适的Y值,这是所有工作的基础
- 再调收敛速度:在目标亮度确定后,调整收敛速度到"不闪不慢"
- 最后配权重表:根据用户关注区域,设计合理的权重分布
这三步走下来,AE基本不会出大问题。当然,实际项目中会遇到各种奇葩场景——比如强光下的人脸、全黑环境下的夜景、运动中的物体——这些都需要针对性地微调。
嗯,AE的内容今天就到这儿。记住一句话:AE不是调得越亮越好,而是调得越"准"越好。这个"准"字,就是咱们工程师要追求的境界。