多帧采集策略: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(自动曝光)策略和单帧完全不同。单帧你只需要收敛到目标亮度就行。但多帧不一样——你希望每一帧的曝光量都略有差异,这样才能在融合时保留更多动态范围。

我常用的策略叫“锚帧+包围曝光”:

  1. 先做一次快速AE收敛,找到场景的“锚点”曝光值(比如EV0)。
  2. 以锚点为中心,生成一组包围曝光:比如EV-2, EV-1, EV0, EV+1, EV+2。每帧的曝光时间按这个偏移量调整。
  3. 帧率保持不变,但每帧的曝光时间不同。注意最长的曝光帧不能超过帧间隔。

这样做的好处是:暗部细节靠长曝光帧,亮部细节靠短曝光帧,中间调靠锚帧。融合后的动态范围能提升2-3档。

关键点:AE收敛不是一次性的。在连拍过程中,如果场景亮度突然变化(比如有人开了闪光灯),需要动态调整后续帧的曝光参数。我一般会在每帧的ISP统计信息里加一个亮度检测,如果偏差超过阈值,就重新触发AE收敛。

嗯,这里要注意一个细节:AE收敛的速度不能太快。如果收敛步长太大,帧与帧之间的亮度跳变会很明显,融合时会出现亮度不连续。我习惯把收敛步长控制在0.3EV以内,宁可多花几帧收敛,也不要亮度跳变。

整体采集流程框架

下面这张图是我在实际项目中总结的采集流程框架,大家可以参考一下:

多帧采集流程框架 场景亮度检测 AE快速收敛到锚点 选择Burst或ZSL模式 生成包围曝光参数序列 多帧连拍采集 说明:连拍过程中需持续监测场景亮度,若变化超过阈值则回退到AE收敛步骤 帧率与曝光时间的权衡在参数生成阶段完成,确保每帧曝光时间 ≤ 帧间隔 - 读出时间

这个流程看起来简单,但每个环节都有细节。比如场景检测,我习惯用histogram-based方法,统计亮度直方图的均值和标准差,判断是极暗场景还是普通夜景。极暗场景我会把锚点曝光时间拉长到1/15s,普通夜景用1/30s。

一个小技巧:在AE收敛阶段,可以同时做一次运动检测。如果场景中有明显运动(比如行人),我会减少连拍帧数(从6帧降到4帧),缩短总采集时间,避免运动模糊。运动检测可以用两帧之间的SAD(差和)来判断,计算量不大。