18、3A协同调优:AE/AF/AWB优先级管理、3A状态机设计、场景切换时的3A平滑过渡
3A算法——自动曝光(AE)、自动对焦(AF)、自动白平衡(AWB)——是相机成像的三大支柱。单独调好每一个不难,难的是让它们三个在同一个场景里「好好相处」。我见过太多项目,AE和AF抢控制权,或者场景一换AWB突然跳色,用户直接骂街。
今天我们就来聊聊,怎么让这三个家伙协同工作。
3A优先级管理:谁说了算?
先问一个问题:AE、AF、AWB同时需要调整时,谁先动?
答案是:AE优先,AF次之,AWB最后。
为什么?你想想看,曝光不对,画面要么全黑要么过曝,AF算法根本找不到对比度特征,AWB也白搭。曝光稳定了,AF才能准确对焦。对焦完成后,AWB再根据最终画面的色彩分布做白平衡校正。
我在项目中遇到过一种情况:用户从室内走到室外,AE先响应,把曝光降下来。但AF模块看到画面变暗了,以为场景变了,立刻重新对焦。结果对焦过程中画面模糊,AWB又误判了色温。这就是典型的优先级混乱。
我建议的优先级策略是这样的:
| 场景 | 优先级顺序 | 说明 |
|---|---|---|
| 亮度突变(如进出室内) | AE > AF > AWB | 先稳住曝光,再对焦,最后调白平衡 |
| 场景切换(如从风景切人像) | AF > AE > AWB | 先对焦到人脸,再微调曝光,最后校正色彩 |
| 色温变化(如日落) | AWB > AE > AF | 色温变化通常较慢,AWB先响应,AE和AF做微调 |
说白了,优先级不是死的。要根据场景动态调整。我习惯在3A引擎里加一个「场景分类器」,先判断当前属于哪种变化类型,再决定谁先动。
3A状态机设计:让算法有「记忆」
3A协同不能每次都是「从零开始」。你需要一个状态机来管理它们的工作状态。
我常用的状态机分四个状态:
- IDLE(空闲):画面稳定,3A不做主动调整,只做低功耗监控。
- CONVERGING(收敛中):检测到场景变化,3A开始调整,但还没稳定。
- LOCKED(锁定):3A已经收敛到目标值,输出稳定。
- HOLD(保持):用户手动干预(比如触摸对焦),3A暂停自动调整。
状态切换的逻辑是这样的:
// 伪代码示例
if (scene_change_detected) {
state = CONVERGING;
// 按优先级启动对应算法
start_ae_convergence();
// AF和AWB延迟启动
schedule_af(50ms);
schedule_awb(100ms);
} else if (all_converged) {
state = LOCKED;
// 降低算法运行频率,省电
set_algorithm_fps(5);
} else if (user_touch_focus) {
state = HOLD;
// 暂停自动调整,只响应手动操作
pause_auto_3a();
}
嗯,这里要注意:状态切换不能太频繁。我曾经在一个项目里把状态切换阈值设得太敏感,结果用户在阳光下走路,3A状态在CONVERGING和LOCKED之间来回跳,画面一直在「调整-稳定-再调整」的循环里,体验极差。
后来我加了一个「去抖」机制:状态切换必须持续3帧以上才生效。效果立竿见影。
场景切换时的3A平滑过渡
场景切换是3A协同最大的挑战。比如用户从暗光环境切换到强光环境,或者从拍风景切换到拍人像。
粗暴的做法是:检测到场景变化,立刻重置所有3A参数,重新收敛。但这样会导致画面出现明显的「跳变」——曝光突然变亮或变暗,对焦突然模糊再清晰,白平衡突然偏色。
我推荐的做法是「渐进式过渡」。
具体来说:
- 检测到场景变化后,先不急着调整。等待2-3帧,确认变化是持续的,不是噪声。
- 计算目标值。用新的场景信息计算出AE、AF、AWB的目标值。
- 分步逼近。不是一步到位,而是每帧向目标值移动20%-30%。比如当前曝光值是+2EV,目标值是-1EV,那么第一帧调到+1.4EV,第二帧调到+0.8EV,第三帧调到-0.2EV,第四帧稳定在-1EV。
- AF单独处理。AF的平滑过渡比较特殊,不能直接插值对焦位置。我习惯用「搜索范围逐步缩小」的方式:先在大范围内粗搜,找到大致位置后,再在小范围内精搜。这样用户不会感觉到镜头来回拉风箱。
核心原则:场景切换时,3A调整的「速度」要让用户感知不到,而不是让用户看到「调整的过程」。
3A协同调优的实战经验
最后分享几个我踩过的坑:
避坑指南:我曾经在一个旗舰机项目里,AE和AWB用了同一个亮度统计信息。结果AWB调整时改变了增益,AE以为亮度变了,又去调整曝光时间。两个算法互相「打架」,画面一直在闪烁。解决方案是:给AE和AWB分别使用独立的统计窗口,或者加一个「互斥锁」,AWB调整期间AE不响应。
警告:不要在高帧率模式下做3A平滑过渡。60fps的预览流里,每帧都做渐进调整,CPU和ISP的负载会飙升。我建议在30fps以下做平滑过渡,60fps时直接做快速收敛,用户反而感知不到。
还有一个细节:3A状态机要记录「历史状态」。比如用户从室内走到室外,再走回室内。如果状态机只记得当前状态,第二次回到室内时又要重新收敛。但如果记录了「室内-室外-室内」的切换历史,可以直接恢复到之前室内场景的3A参数,几乎零延迟。
说白了,3A协同调优的核心就三件事:谁先动、怎么动、动多快。优先级管理解决「谁先动」,状态机解决「怎么动」,平滑过渡解决「动多快」。把这三点想清楚,你的相机体验就不会差。
最后说一句:3A调优没有银弹。每个传感器、每个镜头模组、每个ISP的特性都不一样。我建议你在调优时,先把AE和AF的协同调好,再加入AWB。三个一起调,问题会复杂很多。
公众号:蓝海资料掘金营,微信deep3321