多帧采集策略:Burst模式与ZSL模式、帧率与曝光时间的权衡、AE收敛策略
各位同学,咱们直接进入正题。夜景多帧处理的第一步,不是算法,不是参数,而是——怎么把这几帧数据拿到手。采集策略选错了,后面算法再牛也白搭。我在高通平台上调了这么多年,见过太多团队在采集阶段就埋了坑。
Burst模式 vs ZSL模式:两种思路,两种代价
先说Burst模式。说白了就是让sensor以最高帧率连续拍一组raw图,比如30fps连拍10帧。优点是实现简单,sensor和ISP的配置基本不用动。但缺点也很明显——帧间间隔太大。你想想看,30fps意味着每帧间隔33ms,10帧拍完就是300ms。手持夜景时,这300ms里手抖造成的位移,足够让后面的对齐算法头疼了。
ZSL(Zero Shutter Lag)模式就不一样了。它利用sensor的流水线架构,在用户按下快门前,系统已经在环形buffer里缓存了若干帧。按下快门那一刻,直接取buffer里最近几帧就行。帧间间隔可以做到1-2帧的延迟,也就是几毫秒。
核心差异一句话总结:Burst模式是“拍完再取”,ZSL是“边预览边存”。ZSL的帧间一致性更好,但内存和带宽开销更大。
我个人习惯,在高端平台(比如骁龙8 Gen系列)上优先用ZSL。原因很简单——夜景多帧最怕的就是帧间运动太大。ZSL能把帧间间隔压到最低,对齐算法的压力小很多。但如果是中低端平台,内存带宽吃紧,Burst模式反而是更务实的选择。
| 对比维度 | Burst模式 | ZSL模式 |
|---|---|---|
| 帧间间隔 | 33ms@30fps | 几毫秒 |
| 内存开销 | 低(逐帧处理) | 高(环形buffer常驻) |
| 实现复杂度 | 低 | 高(需协调preview/ capture流) |
| 对齐难度 | 高(帧间位移大) | 低(帧间位移小) |
| 适用平台 | 中低端 | 高端 |
我曾经踩过的坑:在某款中端平台上强行上ZSL,结果环形buffer占用了大量DDR带宽,导致preview掉帧。后来改成Burst模式+短曝光连拍,反而效果更好。所以别迷信ZSL,得看平台能力。
帧率与曝光时间的权衡:不是越快越好
这里有个常见的误区——很多人觉得夜景多帧,帧率越高越好。其实不是。帧率高了,每帧的曝光时间就短,信噪比就低。你想想看,如果每帧都是噪点,合出来还是噪点。
我一般遵循一个原则:单帧信噪比优先,帧率够用就行。具体来说,夜景模式下单帧曝光时间建议控制在1/15s到1/30s之间。太短(比如1/60s)信噪比不够,太长(比如1/8s)手持模糊风险太大。
那帧率怎么定?假设你决定拍6帧,每帧曝光1/20s(50ms)。如果选30fps(帧间隔33ms),那曝光时间比帧间隔还长,sensor根本跑不满30fps。这时候就得降帧率,比如降到15fps(帧间隔66ms),留出16ms给sensor读出和ISP处理。
经验公式:帧间隔 ≥ 曝光时间 + sensor读出时间 + ISP处理时间。留余量,别卡死。
我在项目中遇到过一种情况:某款sensor的读出时间特别长(接近30ms),导致即使曝光时间只有20ms,帧间隔也得留50ms以上。最后只能把帧率压到18fps左右。所以一定要查sensor的datasheet,读出时间这个参数很容易被忽略。
AE收敛策略:让每一帧都“刚刚好”
多帧夜景的AE(自动曝光)策略和单帧完全不同。单帧你只需要收敛到目标亮度就行。但多帧不一样——你希望每一帧的曝光量都略有差异,这样才能在融合时保留更多动态范围。
我常用的策略叫“锚帧+包围曝光”:
- 先做一次快速AE收敛,找到场景的“锚点”曝光值(比如EV0)。
- 以锚点为中心,生成一组包围曝光:比如EV-2, EV-1, EV0, EV+1, EV+2。每帧的曝光时间按这个偏移量调整。
- 帧率保持不变,但每帧的曝光时间不同。注意最长的曝光帧不能超过帧间隔。
这样做的好处是:暗部细节靠长曝光帧,亮部细节靠短曝光帧,中间调靠锚帧。融合后的动态范围能提升2-3档。
关键点:AE收敛不是一次性的。在连拍过程中,如果场景亮度突然变化(比如有人开了闪光灯),需要动态调整后续帧的曝光参数。我一般会在每帧的ISP统计信息里加一个亮度检测,如果偏差超过阈值,就重新触发AE收敛。
嗯,这里要注意一个细节:AE收敛的速度不能太快。如果收敛步长太大,帧与帧之间的亮度跳变会很明显,融合时会出现亮度不连续。我习惯把收敛步长控制在0.3EV以内,宁可多花几帧收敛,也不要亮度跳变。
整体采集流程框架
下面这张图是我在实际项目中总结的采集流程框架,大家可以参考一下:
这个流程看起来简单,但每个环节都有细节。比如场景检测,我习惯用histogram-based方法,统计亮度直方图的均值和标准差,判断是极暗场景还是普通夜景。极暗场景我会把锚点曝光时间拉长到1/15s,普通夜景用1/30s。
一个小技巧:在AE收敛阶段,可以同时做一次运动检测。如果场景中有明显运动(比如行人),我会减少连拍帧数(从6帧降到4帧),缩短总采集时间,避免运动模糊。运动检测可以用两帧之间的SAD(差和)来判断,计算量不大。