跳转至

一、亮度与曝光的光电过程

1.1 光学过程

光与颜色 与相机结构看:一个物体因主动发光或反射光,其一个点上具有光亮度(Luminance);物体的一个面元(物方面元)上具有一发光强度(Luminous intensity),该面元上的光发散传播到镜头镜面上形成一光通量(Luminous flux);对于对焦了的物体,镜面上的光又通过凸透镜原理重新汇聚成像方面元,其具有与镜头镜面上相同的光通量,只不过由于摄影倍率的不同,面元的大小也不同,因此可得到像方面元上的照度(Illuminance);sensor 感光一定时间后,得到一曝光量(photometric exposure)

光与颜色_镜面与漫反射.png 来源

可以看出上述物理过程,总的来说主要涉及三个物理量:发光强度、光圈系数(详见 六、光圈系数公式推导)、曝光时间。

在非理想模型/实际物理模型下,还需考虑:

  • the lens transmittance(透镜透射率)
  • the lens illumination falloff(透镜照明衰减)
  • the flare light present at the sensor(到达 sensor 的杂散光)
  • the level and spectral distribution of the scene radiances incident on the camera lens(入射到镜头的场景辐射的光谱分布)

1.2 光电过程

来源

光电过程.png

sensor 有了曝光量,就会相应地转换出电信号,通过调节放大器的模拟增益(Analog Gain,Sensor Gain)和模数采样增益(Digital Gain,ISP Gain)获取 pure RAW 的亮度值(Brightness)。

为了将光电过程进行标准量量化,标准化协会定义了 ISO 这个统计量(详见 ISO 与 SNR)。

Ensure image brightness is linear increasing while shutter time / ISO is increased, in order to avoid blinking issues. (保证亮度随 shutter/ISO 单调线性变化,避免画面闪烁。)

1.3 亮度后处理

  • gamma 校正:经过光电过程获取的是物理的亮度值,人眼对光的感知是呈对数的,故为了更好地存储颜色,需进行 gamma 校正,从而实现物理亮度转颜色亮度的变换。 AE_gamma校正.png (中性灰:RGB 值 122,122,122 也被称为 18% 中性灰,因为该颜色的反射率是标准白色反射率的 18%。)
  • tone mapping
  • global tone mapping(如画面对比度)
  • local tone mapping(在高动态环境下拍照)
  • tone & color(TNC)
  • feature:supernight、multi frame HDR …

二、自动曝光机制

Auto Exposure 即自动曝光,是相机根据外界光线的强弱自动调整曝光量和增益,防止曝光过度或不足的一种机制 来源

AE 的输入为当前影像的亮度值 Y,输出为可调整亮度的参数。当 AE algorithm 得到当前帧的亮度后,便会与 target Y 做比较,然后计算出下一次需要调整的参数,以便让影像的亮度越来越接近 target Y,如下所示。

AE_控制回路.png

PS:target 并非一个固定值,而是一个 range;亮度运算模块往往也被称为 AE target。

2.1 策略

由于手机相机硬件限制,一般自动曝光算法仅调整 ISO/Shutter;而数码相机则可控制内置 GND 镜、光圈系数。因此 AE 大致的实现策略为:

AE_实现策略1.png

AE_实现策略2.png

AE_实现策略3.png

可认为该策略可再分为三步:

  1. 测光方案
  2. 参数具体化:即将 AE target 转换为具体的控制参数(ISO/shutter)。常见的策略为曝光表。
  3. 自动控制/平滑策略:常见的有 PID 控制。对于典型的安防应用场景,一般建议经过 8~16 帧图像过渡到理想亮度;而对于运动和车载型应用,由于场景动态变化大且快,一般建议经过 3~4 帧图像过渡到理想亮度 来源。一般会针对不同的场景使用不同的策略,如高动态场景和低动态场景。

一些低端的 sensor 中自带 AE 功能;而手机中一般是 ISP 获取统计信息,CPU 进行算法计算,即分为 AE 统计模块AE 算法模块 来源

三、测光方式

目的

  • 由于物理世界中的物体反光率整体在 18% 左右,因此一般选择 18% 为中间调。如果有相应的场景景别算法,则可修改该中间调。
  • AE target 是对图片亮度的统计。因为这是一个从高维数据转低维的过程,那就存在策略选择上的问题,即测光方式。

3.1 测光区域

当需要对一件事情进行统计时,首要的问题就是如何确立统计口径,或者说如何分配统计权重。不同的统计口径计算出的结果会存在较大差异。这是一个开放的问题,没有对错之分,更多是主观取舍。常用的统计方法有以下几种。

  • 全局统计:将图像全部像素都统计进来,像素的权重完全一样。
  • 中央权重统计:只统计图像中间部分,这主要是因为人们关注的重点通常位于图像的中间部分;镜头的成像效果也是中央部分清晰度最高,越到边缘清晰度越低。
  • 中央加背景:图像中间部分占 50% 权重,图像整体作为背景占 50% 权重。
  • 加权平均统计:将图像分为不同的部分,如 9 宫格或者 13~15 个分散的曝光格,每一部分赋予不同的权重,通常中间部分赋予较大权重,相应的边缘部分则赋予较小的权重。
  • 用户 ROI:用户通过人机界面划定一个窗口,AE 只统计这个固定窗口内的像素值,如高光优先。

实际中央权重测光面积不一定很小,可能占画面的 1/3。

AE_中央权重测光.png

3.2 touch AE

Q:平均测光若是取景框中亮度的平均计算,那么怎么还能光焦分离?手动选择光焦点后,预览画面亮度还变化了。

A:平均测光指的是测光模式,是整张画面统计亮度的方式;touch 和平均测光不冲突,touch 之后只会关注实际 touch 框内的亮度作为 target 运算,但整张画面的统计亮度方式没有变化。从实际效果看,有些机型是纯粹以 touch 区域为中心进行测光,测光模式只改变测光区域的大小;更多的机型则是同时兼顾中心和 touch。最后总有一些机型点测光没生效而没被发现。

touch 2s 左右将 lock AE;拖动可实现光焦分离,区域大小由 APP 控制。

3.3 face AE

取景画面中出现人脸,人脸识别功能将默认工作,在取景画面的人脸上将出现匹配人脸大小的识别框并随动,同时执行针对人脸区域自动曝光和 C-AF 动作。

3.4 测光原则

Apical AE 算法 来源

  • 令直方图的实际高点尽可能向 sensor 设备能力的最大可用高点移动,设计意图是充分利用设备提供的动态范围。
  • Apical 定义了 LDR target 参数,要求直方图的 mean 不能超过此 target(防止 LDR 场景过曝)。
  • 定义了 WDR target 参数,要求直方图的 mean 不能低于此 target(保证 WDR 场景的细节)。

Apical 的 AE 算法采用了第 N+3 帧生效的设计方案,这个设计给软件预留了两帧的时间用于处理 3A 运算和刷新 ISP 硬件寄存器。

四、AE 算法与收敛控制

4.1 快门控制的 AE 算法

4.1.1 带光照条件检测的算法

Lighting conditions can be classified as normal lit, excessive back lit or high contrast.[1]

The green component mostly contributes to the luminance of an image. Therefore, to reduce computational complexity, the proposed system uses the green (G) component as the luminance of an image and all steps are performed based on this component.

\[ D_L = Bl_{mean} - Bl_{med} \]

注:逆光和高对比度时,\(|D_L|\) 大;正常光下,\(|D_L|\) 小。

\[ Bl = k \times L \times G \times T \times D^{-2} \]

where \(Bl\) is the brightness level of the captured image, \(k\) is a constant, \(L\) is the luminance of the ambient light, \(G\) is the gain of the automatic gain control, \(D\) is an aperture value, and \(T\) is the integration time. So:

\[ \log_2 T_{opt} = \log_2 T_n - \log_2 Bl_n + \log_2 Bl_{opt} \]

AE_快门AE算法.png

4.1.2 加权平均算法

[3]

AE_加权平均算法.png

4.2 曝光表(AEPline)

曝光表的发展史:将相机对着灯箱,调节灯箱的亮度为 \(L_s\),计算出对应的 \(B_v\) 值;调节相机曝光参数 \((A_v, T_v, S_v)\),使得照片亮度适合人眼;不断改变灯箱的亮度,重复上述步骤,可得测光表

\[ (B_{v\_i}) \to (A_{v\_i},\ T_{v\_i},\ S_{v\_i},\ AE_{target\_i}) \]

测光,是相机在使用时计算环境光亮度(即计算 \(B_v\))。

AE_测光表.png

程序线图(pline,Points & Line)可以有很多种设计方式,这取决于各家相机厂商的做法。这里给出佳能设计线图的三个原则:

  • \(E_v\) 值变化时,在快门和光圈值允许范围内,尽量以同等增量去改变光圈和快门,即保持快门和光圈组成的直线的斜率为 1。
  • 在光圈不可避免地达到最大或最小值时,直线会变成水平线(即光圈保持最大或最小值,只改变快门的值)。
  • \(E_v\) 值相同时,长焦对应的快门应该越快(为了防止相机抖动带来的画面模糊)。

来源

于是,这张曝光表就很容易理解了 来源

AE_曝光表示例.png

实现中的 AEPline:在手机实现中,pline 指 Points & Line——光圈固定,给定亮度后选择 Shutter 点并计算 ISO 值。pline 中提供若干对 (EV, shutter),基于点生成线。一般情况下拍照和预览使用相同的 pline,不同模式下的 pline 会有所不同。

4.3 PID 控制

AE 的自动控制常用 PID(比例-积分-微分)算法:把"当前亮度与 target 的误差"作为输入,输出曝光参数的调整量,逐帧迭代收敛。比例项加快响应、积分项消除稳态误差、微分项抑制超调与震荡。

4.4 收敛指标 MSV

The mean sample value (MSV)[2]

\[ \mu = \frac{\sum^4_{i=0}(i+1)\bullet x_i }{\sum^4_{i=0}x_i} \]

AE_MSV指标.png

Using MSV, the image is correctly exposed when \(\mu \approx 2.5\).

4.5 AE Lock

  • Lock AE:pLine 不会再变,AE algo 会根据当前 pLine 来决定越来越高的 shutter 和 ISO。
  • no Lock AE:此种情况大不相同,AE algo 会认为外界环境不断在变化,因此会想要边计算边拉亮,再加上 AE algo 是由很多子判断项加权来取值的,因此更过曝的情形会更容易发生。

在调到最大 EV 值时,由于 ae lock 是在标准曝光表上进行曝光 index 增减的,而 ae no lock 是基于 target 来计算曝光 index 的——在正常 250 以内是线性变化的,但超过这个范围就是非线性的,所以曝光值就存在差异。target 不同,也会引起具体环境表现不同。

AE lock 场景:1. 算法需要(夜景、HDR);2. 长按两秒锁 AE。

五、曝光误差

曝光误差的量化:\(曝光误差 = 当前曝光值 - 参考曝光值\)

误差计算公式:

\[ 曝光误差 = \left(\log_{10}(实际像素值) - \log_{10}(像素参考值)\right)^{\gamma-1} \]
\[ 曝光误差 = (曝光误差_{11}+曝光误差_{22}+曝光误差_{33})/3 \]
\[ 曝光误差 = 曝光误差_{22} \]

(上式为按通道/区域加权后再取中心的内部统计方式。)

曝光误差的控制(已知 output 反推 input,即 gamma 编码的逆过程):

\[ Input = 255 \times \left(\frac{Output}{255}\right)^{gamma} \]

六、光圈系数公式推导

手机的光圈和焦距无法调整,故将该理论亮度影响因素放到最后。下述描述基于 AF光与颜色 两篇笔记的理论基础进行阐述。

\(\Phi = I \cdot S\)。在光圈不变的情况下,缩小焦距,那么视场角就变大了,物体变小了,意味着同样的光通量 \(\Phi\) 下,被观察物体的面积变小了(\(S\downarrow\)),于是照度就增大了(\(I\uparrow\))。

我们定义光圈系数(又称光圈值)\(F = f/d\),其中 \(f\) 为焦距,\(d\) 为光圈孔径。\(F\) 正比于 \(f\),反比于 \(d\)。之所以定义光圈系数,是因为该变量直接从空间维度影响成片的亮度;之所以称为光圈系数,是因为相对于焦距,一般首先调整光圈,但符号用 \(F\)(或 \(N\),或 f/xxx)表示,是因为其正比于焦距,而焦距的符号为 \(f\)

实际计算:\(E' \approx \dfrac{\pi L}{4F^2}\)。光圈系数越大,成片亮度越低。也可以认为是 f/xxx 中的 xxx 数值越大,成片亮度越低。于是有如下光圈系数:

  • f/1:1/1^2 = 1
  • f/1.4:1/1.4^2 = 0.5102
  • f/2:1/2^2 = 0.25

公式推导 来源

AE_光圈系数推导.png

\[ \textrm{d}\Phi = I \cdot \textrm{d}\Omega \\ I = L \cdot \textrm{d}S \]

由立体角微分可推导出:\(\textrm{d}\Omega = \sin u \cdot \cos u \cdot \textrm{d}\theta \cdot \textrm{d}u\)

\[ \textrm{d}\Omega = \frac{\textrm{d}A'}{R^2} \\ \textrm{d}A' = \cos u \cdot \textrm{d}A \\ r = \sin u \cdot R \;\Rightarrow\; \textrm{d}r = R \cdot \cos u \cdot \textrm{d}u \\ r = \sin u \cdot R \]

对光通量进行积分(先对立体角积分得 \(\Omega = \pi\sin^2 U\),再乘以 \(L\cdot\textrm{d}S\) 得光通量):

\[ \Omega = \iint_{u\in[0,U],\;\theta\in[0,2\pi]} \sin u \cdot \cos u \cdot \textrm{d}\theta \cdot \textrm{d}u = \pi \sin^2 U \\ \Phi = L \cdot \textrm{d}S \cdot \Omega = \pi L \cdot \textrm{d}S \cdot \sin^2 U \]

物方一个面元的光通量将通过透镜传送到像方对应面元上。设横向放大率 \(\beta\)(像方/物方尺寸比),则像方面元 \(\textrm{d}S' = \beta^2 \textrm{d}S\),因此像方照度为:

\[ E' = \frac{\Phi}{\textrm{d}S'} = \frac{\pi L \cdot \textrm{d}S \cdot \sin^2 U}{\beta^2 \textrm{d}S} = \frac{\pi L}{\beta^2}\sin^2 U \]

由于 \(F = f/A\),根据光学系统的拉格朗日不变量,得 \(\sin^2 U = \dfrac{\beta^2}{\beta^2 + 4F^2}\)。又由于 \(\beta \ll 1\),得:

\[ E' = \frac{\pi L}{\beta^2 + 4F^2} \approx \frac{\pi L}{4F^2} \]

有一个简单的结论:在相同 ISO/Shutter 下,不同 sensor 的曝光是不同的。

七、相关问题

7.1 静态问题

过曝、曝光不足。

7.2 动态问题

7.2.1 AE Peaking

AE 的峰值:图像亮度平稳时,突然出现亮度高的画面。

7.2.2 AE 震荡(AE flicker)/呼吸效应

图像亮度忽明忽暗。

图像质量呼吸:假设 AE 算法需要将画面亮度提高至 2 倍,则有两种选择——曝光时间 ×2(信噪比高)或 ISO ×2(放大了噪声,降低了信噪比)。虽然改变 sensor 曝光时间和改变 sensor 增益都可以实现提高画面平均亮度,但得到的图像质量其实是不同的。

举个极端但可能的例子:如果出于某种原因 AE 算法的输出频繁在两组参数(曝光 ×2,增益 ×1)和(曝光 ×1,增益 ×2)间振荡,则画面会在两种不同的图像质量效果间振荡,称为呼吸效应(breathing effect),会造成画面闪烁,是设计和调试算法时必须注意避免的一种现象。

亮度呼吸:当 AE 算法存在设计缺陷,或某些参数选择不周密时,AE 算法容易出现亮度振荡情况,即环境照明并没有变化时,AE 的控制输出却呈周期性波动,类似电子系统中的自激振荡。通常的原因是画面的平均亮度刚好处在亮度容差的边界值附近,当 AE 测量到容差偏大时就会触发微调,但由于设备的实际参数是离散的,原本的微调参数会被四舍五入到下一个离散点,实际导致超调,于是下一帧 AE 不得不回到过去的参数,如此循环往复,形成呼吸效应。

7.2.3 Flicker(banding)

AE_flicker条纹.png

对着日光灯看,是不是有一条条的明暗条纹?CMOS 的曝光方式是一行一行进行的,同一行上的每个 pixel 的曝光开始点和曝光的时间都是一样的,而在不同行之间虽然曝光时间都一样,但曝光的开始点是不同的。

交流电光源会有光强的波动,在中国交流电频率是 50Hz,如果 camera 曝光时间不是 10ms 的整数倍,图像上就会有明暗条纹(banding)。在交流电频率 60Hz 的国家,曝光时间就要是 8.33ms 的整数倍。在大家做机水平比较低的远古时代,相机软件里是会有一个菜单让用户选 "50Hz/60Hz" 的;后来大家做机水平进步之后,发现没什么用户知道这个选项什么意思,就从网络的国家代码查表获取交流电频率了;再后来,手机的处理能力提高之后,也可以用纯图像处理的算法判断当前是否产生 banding 并切换曝光参数了 来源

据悉,两个相同频率的光源,由于相位不同,将产生叠加频率,进而可能导致算法检测错误。

防灯带对比人为 ISO 优先:防条带功能与设备中相机应用程序的手动 ISO 设置存在利益冲突。在默认的 QTI 解决方案中,抗条带始终是重中之重,以免闪烁影响图像质量。结果是 ISO 值无法保持与相机应用程序设置的完全相同——例如,如果您在相机应用程序中将 ISO 速度设置为 800,则拍摄图像中的实际 ISO 值可能在 800 左右,例如 720 或 850。如果您的要求使得手动 ISO 优先于 antibanding,可通过 antibanding_vs_ISO_priority 参数重置优先级。

同频率不同相位正弦波分离:请问如何将频率相同但相位不同的正弦波从信号波中分离出来。(待解)

八、实现视角(3A 框架)

本节来自相机 3A 框架的实现笔记,补充 AE 在手机平台上的落地方式。其中代码细节(函数名、属性键、tuning 文件路径)属工程实现,会随平台/版本变化,仅作概念理解。

8.1 AE 分层架构(AP/MW/HAL/Driver)

自上而下分为 AP(应用/框架)、MW(请求与流管理)、HAL 3A(hal3a + AE 算法 + ae_mgr)、Driver/Sensor 四层。每帧数据沿「请求下发 → 统计回读 → 算法计算 → 参数下发 → 结果上报」闭环流动,即 二、自动曝光机制 控制回路的工程分层:

flowchart TB
    AP["AP 层:Camera App / CameraService<br/>CaptureRequest:AE 模式 / EVComp / Lock"]
    MW["MW 层:请求与流管理<br/>onProcessCaptureRequest → Req<br/>StreamJob::setup → Fid"]
    HAL3A["HAL 3A:hal3a doAE / Hal3AFlowCtrl<br/>doCapAE · doPvAE × FlowState"]
    ALGO["AE 算法:IAeFlow(m_pIAeFlowCPU)"]
    NVRAM[("AE_NVRAM<br/>pline 曝光表")]
    AEMGR["ae_mgr / ae_mgr_v4l2<br/>m_AEPerFrameInfo:rAEUpdateInfo · rAEISPInfo"]
    DRV["Driver / Sensor<br/>dmesg:exposure LLLE→SSSE · ana_gain"]
    P2["P2 / ISP<br/>P2ST 下发 + STT 统计配置"]
    META["MetadataHelper<br/>convertToMetaset 上报"]

    AP -- "下发请求与 3A 参数" --> MW
    MW -- "逐帧调 doAE" --> HAL3A
    HAL3A -->|调用| ALGO
    ALGO -->|m_rCPUCalOutput| HAL3A
    HAL3A -- "AE_NVRAM key 选表" --> NVRAM
    HAL3A -- "copyAEInfo2Mgr" --> AEMGR
    AEMGR -- "曝光行数 / 增益" --> DRV
    AEMGR -- "P2ST" --> P2
    P2 -. "AAO / STT 统计回读" .-> HAL3A
    HAL3A --> META
    META -. "result:State / ExpTime / ISO" .-> AP

8.1.1 各层职责与日志关键字

职责 代表日志/关键字
AP(App/CameraService) 下发 AE 模式、EV 补偿、Lock/Unlock(开相机或每次拍照都会下发 unlock);接收结果状态与 EXIF setAEEVCompIndexxiaomi.supernight.aeplinechecker(vendor tag 回显)
MW 请求排队与流管理,分配帧标识 onProcessCaptureRequestcapture req#StreamJob::setup
HAL 3A(hal3a / Hal3AFlowCtrl) 每帧 doAE:统计回读 → 算法 → 查表 → 下发;维护模式与流程状态机 Dev:F:Req/Mag/FidcopyAEInfo2MgrAlgo:P2STSTT
AE 算法(IAeFlow) 测光比较、收敛与策略计算 m_pIAeFlowCPUm_rCPUCalOutputbLVCTMEVD
ae_mgr 每帧 AE 信息管理、sensor 能力查询、手动设定、向 sensor/ISP 下发 getSensorInfogetAEManualSettingm_AEPerFrameInfo
Driver/Sensor 曝光行数与模拟增益的最终写入 dmesg exposure[LLLE->SSSE]ana_gain[...]

DX-2 相对 DX-1:AE 核心代码与函数名基本不变,但日志变化较大、关键字不同——查 AE 参数下发改用 UpdateSensorISPParamsupdateAEInfo2ISP

8.1.2 请求链路:帧怎么对齐

AP 下发 CaptureRequest(模式/EVComp/lock)→ MW onProcessCaptureRequest 分配请求 ID → HAL3A 逐帧执行 doAE。跨 log 对帧用三元组 Req/Mag/Fid

  • Req:MW 层 Request ID,对应 onProcessCaptureRequest(或 capture req#)所显示的 ID;
  • Mag:3A 的 Magic ID;
  • Fid:来自 StreamJob::setup()

8.1.3 doAE:算法入口 × 流程状态

hal3a 每帧日志头 [%s:%d] 由两个字段组成:算法入口 current_doAE_type 与流程状态 m_eAEFlowState。二者维度不同——前者决定用哪套计算与 pline,后者决定参数来源,组合后覆盖典型场景:

组合 场景 参数由谁定
doCapAE + CAPTURE(1) auto AE 的拍照 只做 EV 定档映射:预览收敛后的 EvIdx 映射到拍照 pline 的 S/ISO 档位("只调整 EV 的拍照")
doPvAE + PREVIEW(0) 预览、halfAE 的拍照 算法逐帧收敛(控制回路在跑)
doPvAE + MANUAL(3) 长曝光的拍照、手动模式的拍照和预览 AP 指定或自预览换算(见 8.3),算法不自由调参

(矩阵按各状态的场景标注整理。)halfAE 拍照走 doPvAE 而非 doCapAE,正是因为其 3A 参数转换自预览(等效 ISO 在预览流上算好,见 8.3),不再过拍照 pline 定档。

8.1.4 参数下发与真值链

AE 输出每帧经 copyAEInfo2Mgr 存入 ae_mgr 的 m_AEPerFrameInforAEUpdateInfo 状态更新信息;rAEISPInfo 为 reg&mag、基础 AE 信息、人脸、ROI、AI-Shutter、for tnc),再分两路下发:

  • sensor 侧:曝光行数与增益(ae_mgr_v4l2),最终落在 dmesg exposure[LLLE->SSSE] ana_gain[...]——多通道中只有通道 0 非零即单曝,stagger/VHDR 时长短曝通道有值;
  • ISP 侧P2ST(给 P2 的曝光设定 exp(us)/SensorGain/ISP Gain/ISO)与 STT 统计配置(含直方图、测光 ROI 权重;stagger HDR 时分长短曝)。

增益以两个基数为单位:AFE 1024ISP 4096,即 ISO = iso_base × afe/1024 × isp/4096。可用手动设定 log 交叉验证:manual shutter/ISO:4000000/6400 → setting:4000/65536/8192,即 \(6400 = 50 \times 64 \times 2\),shutter 由 ns 折成 us ✓。

由于 hack_ae 的存在,hal3a 的输出有时并不是最终输出。排查「日志显示 A、成片像 B」时按真值优先级看:

  1. dmesg:sensor 驱动实际写入值,最底层真值;
  2. convertToMetaset(MetadataHelper):最终生效并上报 AP 的 ExpTime/ISO/State(如 State:Ae 2->5 即 CONVERGED→PRECAPTURE_TRIGGER,见 8.4);
  3. hal3a / ae_mgr 日志:算法意图,可能与 1/2 不一致。

8.1.5 EvIdx 的层间传递(预览 → 拍照)

平台按当前亮度计算 m_i4EvIndexReal_x1000,但预览 pline 的 totalgain × shutter 上限固定,因此该值会被 pline 的 ev index min/max 裁切后才作为有效 m_i4EvIndex_x1000;拍照与预览等效转换,给拍照传 EvIdx 时传的就是裁切后的预览 EvIdx(详见 8.3)。EvIdx 即 APEX 的 \(B_v\)(毫档,×1000):

\[ EV_{index} = \log_2{N^2} + \log_2{\frac{1}{T}} - \log_2{(ISO/K)} \]

因此 S/ISO 未到极值时 EvIdx 可表征环境亮度;到极值后被钳住(如 EvIndex:-5803/Real:-7360——真实场景亮度低于 pline 可达下限)。两帧 EvIdx 之差可由曝光量反验(该例两帧 ISP gain 近似相等故可省略):

\[ \Delta EV_{index} = -1000 \cdot \log_2\frac{exp_1 \cdot ISO_1}{exp_2 \cdot ISO_2} \]

pline dump 中的 min/max 特指 EV0 下的可达边界;AE_NVRAM key(sensor/app/action/flash/project/feature/custom/mode/fps/module)决定当前选中 NVRAM 中的哪张 param/pline。

8.1.6 binning ↔ remosaic 换算

预览常用 binning、拍照 remosaic,两者亮度与 iso_base 不同(binning 的 iso_base 需经 getBinSumTransSetting() 转换,一般模式 iso_basemini_iso 相同),存在转换倍率:

\[ Bin_R=\frac{Exposure\ Setting\ of\ Remosaic\ Mode}{Exposure\ Setting\ of\ Binning\ Mode} \]

log 中 rSettingBeforeConv/rSettingAfterConv 即 binning 前后的值。该转换正是 8.3 中"预览与拍照极值不一致是 Bug"的防呆机制。

8.1.7 调试速查

目的 关键字段/日志 判读
环境亮度 EvIdx(未到极值时);EvIndexReal 毫档 Bv,更负=更暗;到极值后被 pline 钳位
AE 是否收敛 Stable\(LVChange=\frac{CWV-CWS}{CWS}\)CWR−CWV S/ISO 到极值时 stable 不代表亮度达标
最终曝光参数 P2STconvertToMetaset → dmesg 真值优先级见 8.1.4
pline 能力边界 pline dump(EV0 下 min/max)+ getSensorInfo MinTime(ns)= 最小行数 × LineTimefps 为 ×10 倍率
当前用哪张 pline AE_NVRAM key 按 sensor/app/action/flash/feature/mode/fps/module 选表
补偿实际生效多少 Comp vs EVComp(1000x) 极值处正补偿可能归零(曝光补偿见 EV
模式/流程判定 [%s:%d] doAE_type × FlowState 见 8.1.3 矩阵
跨 log 对帧 Req/Mag/Fid 见 8.1.2
拍照/预览一致性 Bin_R、Before/AfterConv、两条 pline dump 极值不一致即 Bug(见 8.3)
flicker FLK(AP/Image/ALS1/ALS2) AP 设定 vs 图像检测 vs 环境光传感器

8.2 AE 模式

手机平台的 AE 通常支持以下模式(AP 下发参数,HAL 执行):

  1. autoMode(自动模式):S/ISO 由算法决定。
  2. AE shutter priority(快门优先):AP 仅将 Shutter 写为定值。
  3. AE ISO priority(ISO 优先):AP 仅将 ISO 写为定值。
  4. ManualMode(手动模式):AP 将 ISO 和 S 都写为定值,或由 adb 命令直接指定参数(长曝光下 shutter priority 的拍照 ISO 参数计算自预览,故也归入手动模式)。
  5. HalfAEMode(半自动模式):笼统地说是 shutter priority + ISO priority,但长曝光时从代码上看不属于这个模式。

8.3 预览-拍照曝光一致性

为了保证预览流畅,要求预览帧率 \(fps_{pre} \ge 8\)。当拍照曝光时间 \(s_{cap} > 1/8\) 时,需根据曝光一致性原理把拍照曝光等效到预览上:

  • 手动模式下(等效 ISO 在 AP 计算):若 \(s_{cap} > 1/8,\ iso_{cap} \ne 0\),则
\[ s_{pre} = 1/8,\qquad iso_{pre} = \frac{s_{cap} \cdot iso_{cap}}{s_{pre}} \]
  • 优先模式下(等效 EV 在 AP 计算,等效 ISO 在 HAL 计算):若 \(s_{cap} > 1/8,\ 2^{EV_{cap}} = 1\),则
\[ s_{pre} = 1/8,\qquad 2^{EV_{pre}} = \frac{s_{cap} \cdot 2^{EV_{cap}}}{s_{pre}} \]

之后 AE algo 计算出 \(iso_{pre}\),于是

\[ iso_{cap} = \frac{s_{pre} \cdot iso_{pre}}{s_{cap}} \]

这样,正常情况下即使预览和拍照的帧率不同,曝光程度也是相同的。而在 ISO/S 达到 sensor 极值时,预览和拍照不一致就不可避免了——但若预览和拍照的极值不一致,则是需要处理的 Bug。此外,离散化、曝光表和 ISO 标定的准确性也会引入一定的曝光误差;AE 未收敛时拍照也会感觉拍照预览不一致。

8.4 AE 状态机与 precapture

AE 状态机与 AWB 基本相同,但 AE 额外有 FLASH_REQUIREDPRECAPTURE 状态(严谨表述见 Android 状态表)。

precapture(预捕获):HAL 层在拍照前做准备工作时,返回该状态来阻塞 AP 的拍照请求流程。在开始高质量静止捕获之前,应触发预捕获系列操作,以便做出最终的测光决定,并在启用闪光灯时触发预捕获闪光灯脉冲,以估计场景亮度和所需的最终捕获闪光灯功率 来源。高质量静止捕获的场景包括:1. 拍照时 AE 未收敛;2. 闪光灯预闪。若预捕获测光系列操作已完成,相机设备将隐式锁定 AE 以进行后续静止捕获。

AF trigger 和 precapture 可同时激活,但需要一个动作完成后才运行下一个动作。

8.5 双摄 AE 同步

应用场景:SAT、Bokeh。

AEC 同步校准(出厂校准,估计两个摄像头之间的相对增益差)分两步:

  1. 设置:找到最佳传感器参考增益和曝光时间,后续各模块的校准使用该数据。
  2. 校准单个模块:获取原传感器响应处的灵敏度比率,分别校准每个双摄像头模块,将相应数据写入 OTP。

AE 同步计算(Alignment 机制):主摄自动曝光,然后根据双摄 OTP 的 AE 信息,计算辅摄曝光,使辅摄亮度与主摄一致:

\[ exposure_{slave} = exposure_{master} \times multiplier \]
\[ multiplier = \frac{otpTime_{slave} \times gain_{slave}}{otpTime_{master} \times gain_{master} \times brightnessRatio} \]

辅摄优先与主摄使用相同的曝光时间,当辅摄增益超过范围时,再调整曝光时间。

以下为双摄相关: 目前,双摄手机工作原理主要有以下几种:[-] 1、彩色+彩色摄像头(RGB+RGB),优势在于可以计算景深,从而实现背景虚化和重新对焦(即先拍照后对焦); 2、彩色+黑白相机(RGB+Mono),优势在于可以提升暗光或夜晚手机成像质量; 3、广角+长焦镜头(Wide+Tele),这个组合最大优势在于可以实现光学变焦(目前大多数主流手机厂商采用的双摄原理); 4、彩色+深度相机(RGB+Depth),可以实现三围重建等。

8.6 AE 相关高级特性

实现中 AE 还串联了一些客制化曝光特性(均本质上是"修改 pline / 突破默认曝光限制"):

  • AI Shutter:检测到 flicker 后预览跳过 AIS;拍照链路为 AE algo → AIS → delicker
  • HDR:多帧 HDR,需要平台自定义的 HDR feature 标志(三帧里有两帧为 1)。
  • SuperNight(超夜)/ 超夜 SE:多帧拍照,有 EV0 和 EV-,曝光表默认从 gain 开始调;超夜 SE 是轻量级超夜,输入帧数更少,用同一算法。超夜通过不等效转换公式突破默认曝光限制。
  • Long Exposure(长曝光):璀璨星空、浪漫星轨等,超夜和长曝光共用了部分代码和 meta。

九、参考

  1. Vuong, Quoc Kien, Se-Hwan Yun, and Suki Kim. "A new auto exposure and auto white-balance algorithm to detect high dynamic range conditions using CMOS technology." Proceedings of the world congress on engineering and computer science. IEEE, 2008. PDF
  2. Nourani-Vatani, Navid, and Jonathan Roberts. "Automatic camera exposure control." Proceedings of the Australasian Conference on Robotics and Automation 2007. PDF
  3. Bernacki, Jarosław. "Automatic exposure algorithms for digital photography." Multimedia Tools and Applications (2020). PDF
  4. AE(自动曝光)系统简介 - CSDN
  5. 3A+ISP 之 AE 篇 - 知乎