Android Camera 3A概述

📅 2026/7/26 8:47:06
Android Camera 3A概述
Android Camera 3A 详解 (AE / AF / AWB)1. 什么是 3A3A是相机系统中三个核心自动控制算法的统称:3A = AE + AF + AWB AE (Auto Exposure) 自动曝光 → 控制画面亮度 AF (Auto Focus) 自动对焦 → 控制画面清晰度 AWB (Auto White Balance) 自动白平衡 → 控制画面色彩3A 是相机画质的基石。没有正确的 3A,再好的 Sensor、ISP、算法都无法输出好照片。3A 在相机系统中的位置: App → Framework → HAL → 3A 算法 → Sensor/ISP/Actuator │ ├─ AE → 控制 Sensor 曝光时间 + 增益 + ISP 增益 ├─ AF → 控制 Actuator 透镜位置 └─ AWB → 控制 ISP 白平衡增益 + 色彩矩阵2. 3A 系统架构2.1 整体架构┌─────────────────────────────────────────────────────────────────┐ │ 3A 系统架构 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ ISP Stats 硬件 │ │ │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │ │ │ BF │ │AWB_BG│ │BHIST │ │RS │ │CS │ │IHIST │ │ │ │ │ │AF用 │ │AWB用 │ │AE用 │ │AE用 │ │AE用 │ │AE用 │ │ │ │ │ └──┬───┘ └──┬───┘ └──┬───┘ └──┬───┘ └──┬───┘ └──┬───┘ │ │ │ └─────┼────────┼────────┼────────┼────────┼────────┼──────┘ │ │ │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ 3A 算法库 (用户空间) │ │ │ │ │ │ │ │ ┌──────────────────┐ │ │ │ │ │ AE 算法 │ ← BHIST/RS/CS/IHIST/HDR_BE │ │ │ │ │ 计算曝光参数 │ → shutter, gain, iso │ │ │ │ └──────────────────┘ │ │ │ │ │ │ │ │ ┌──────────────────┐ │ │ │ │ │ AF 算法 │ ← BF Stats + PDAF Stats │ │ │ │ │ 计算对焦位置 │ → lens_position (DAC) │ │ │ │ └──────────────────┘ │ │ │ │ │ │ │ │ ┌──────────────────┐ │ │ │ │ │ AWB 算法 │ ← AWB_BG Stats + IHIST │ │ │ │ │ 计算白平衡增益 │ → r_gain, g_gain, b_gain │ │ │ │ └──────────────────┘ │ │ │ │ │ │ │ └─────────────────────────────────────────────────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Sensor │ │ Actuator │ │ ISP │ │ │ │ 曝光/增益│ │ 透镜位置 │ │ WB/CCM │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘2.2 ISP Stats 硬件模块高通 Spectra ISP 提供以下 Stats 硬件模块供 3A 使用:Stats 模块缩写用途数据内容BF StatsBFAFBayer Focus, 区域亮度+对比度AWB BG StatsAWB_BGAWB区域 R/G/B 平均值BHIST StatsBHISTAEBayer 直方图RS StatsRSAE/Flicker行求和统计CS StatsCSAE列求和统计IHIST StatsIHISTAE/AWB图像直方图 (Y/R/G/B)HDR BE StatsHDR_BEAE (HDR)短曝光区域亮度HDR BHIST StatsHDR_BHISTAE (HDR)短曝光直方图PDAF StatsPDAFAF相位差数据TL BG StatsTL_BGAE/AWB三层背景统计// 高通 IFE Stats 资源定义 (cam_isp_ife.h)#defineCAM_ISP_IFE_OUT_RES_STATS_HDR_BE(BASE+10)#defineCAM_ISP_IFE_OUT_RES_STATS_HDR_BHIST(BASE+11)#defineCAM_ISP_IFE_OUT_RES_STATS_TL_BG(BASE+12)#defineCAM_ISP_IFE_OUT_RES_STATS_BF(BASE+13)#defineCAM_ISP_IFE_OUT_RES_STATS_AWB_BG(BASE+14)#defineCAM_ISP_IFE_OUT_RES_STATS_BHIST(BASE+15)#defineCAM_ISP_IFE_OUT_RES_STATS_RS(BASE+16)#defineCAM_ISP_IFE_OUT_RES_STATS_CS(BASE+17)#defineCAM_ISP_IFE_OUT_RES_STATS_IHIST(BASE+18)#defineCAM_ISP_IFE_OUT_RES_PDAF(BASE+5)3. AE (Auto Exposure, 自动曝光)3.1 AE 的任务AE 的目标是控制画面亮度,使图像既不过曝也不欠曝。AE 控制的参数: ┌──────────────────────────────────────────┐ │ AE 输出 │ │ │ │ 1. 曝光时间 (Shutter / Exposure Time) │ │ 控制进光量的时间维度 │ │ 范围: 1/8000s ~ 1s │ │ │ │ 2. 传感器增益 (Sensor Gain) │ │ ├─ Analog Gain (模拟增益) │ │ └─ Digital Gain (数字增益) │ │ 放大传感器信号 │ │ 范围: 1x ~ 64x │ │ │ │ 3. ISP 增益 (ISP Digital Gain) │ │ ISP 端数字增益 │ │ 范围: 1x ~ 16x │ │ │ │ 4. 闪光灯 (Flash) │ │ 补充光照 │ │ │ └──────────────────────────────────────────┘3.2 AE 算法核心流程// AE 核心算法流程structae_context{// 输入: Stats 数据structae_stats{uint32_tbhistorgram[256];// BHIST 直方图uint32_trow_sum[MAX_ROWS];// RS 行求和uint32_tcol_sum[MAX_COLS];// CS 列求和uint32_tihist_y[256];// IHIST Y 通道直方图floatregion_luma[64][64];// 区域亮度floathdr_be_luma[64][64];// HDR 短曝光亮度}stats;// 输出: 曝光参数structae_output{floatshutter_us;// 曝光时间 (微秒)floatanalog_gain;// 模拟增益floatdigital_gain;// 数字增益floatisp_gain;// ISP 增益uint32_tiso;// ISO 值bool flash_needed;// 是否需要闪光灯floatlux_index;// 环境亮度索引}output;// 内部状态floattarget_luma;// 目标亮度floatcurrent_luma;// 当前亮度floatconvergence_speed;// 收敛速度};// AE 主循环voidae_process(structae_context*ae){// Step 1: 统计分析floatscene_luma=analyze_scene_luma(ae-stats);floatscene_dynamic_range=analyze_dynamic_range(ae-stats);enumscene_typescene=detect_scene_type(ae-stats);// Step 2: 目标亮度计算ae-target_luma=calculate_target_luma(scene_luma,scene);// Step 3: 曝光计算floatrequired_exposure=ae-target_luma/scene_luma;// Step 4: 曝光分配 (快门 vs 增益)allocate_exposure(required_exposure,scene_dynamic_range,ae-outp