本讲是android camera专题系列的第46讲,我们介绍android camera2 api专题的awb自动白平衡。
更多资源:
资源 | 描述 |
---|---|
在线课程 | |
知识星球 | 星球名称:深入浅出android camera 星球id: 17296815 |
极客笔记圈 |
为什么要做白平衡
人眼:在不同的光源下,人眼看到的白色物体总是白色的
图像传感器:在不同光源下,白色物体成像在sensor上是不一样的
因此需要把sensor的rgb相应各乘以一个系数来使得rgb相等
r’ = r x r_gain
g’ = g x g_gain
b’ = b x b_gain
使得 r’=g’=b’
什么是自动白平衡
自动白平衡 (auto white balance): 通过算法根据统计数据自动计算出r/g/b的gain值
android camera颜色处理流程
awb模式
capturerequest#control_awb_mode,通过cameracharacteristics#control_awb_available_modes判断支持哪些mode
control_awb_mode取值 | 描述 |
---|---|
control_awb_mode_off | awb算法disabled,app通过修改ccm和awb gain来手动控制白平衡 |
control_awb_mode_auto | awb算法enabled,白平衡由算法控制,app设置的ccm和awb gain会被忽略 |
control_awb_mode_fluorescent | awb算法disabled,使用荧光灯作为假定的场景照明来调节白平衡,app设置的ccm和awb gain会被忽略,匹配cie标准光源f2 |
control_awb_mode_warm_fluorescent | awb算法disabled,使用暖荧光灯作为假定的场景照明来调节白平衡,app设置的ccm和awb gain会被忽略,匹配cie标准光源f4 |
control_awb_mode_daylight | awb算法disabled,使用日光灯作为假定的场景照明来调节白平衡,app设置的ccm和awb gain会被忽略,匹配cie标准光源d65 |
control_awb_mode_cloudy_daylight | awb算法disabled,使用多云白天作为假定的场景照明来调节白平衡,app设置的ccm和awb gain会被忽略 |
control_awb_mode_twilight | awb算法disabled,使用黄昏作为假定的场景照明来调节白平衡,app设置的ccm和awb gain会被忽略 |
control_awb_mode_shade | awb算法disabled,使用阴影光作为假定的场景照明来调节白平衡,app设置的ccm和awb gain会被忽略 |
awb lock
判断是否支持
- 读取cameracharacteristics#control_awb_lock_available
capability为manual_post_processing 或 burst_capture 的设备必须支持
控制awb lock
- 通过控制capturerequest#control_awb_lock完成awb lock,设置为true后意味着awb算法的输出会固定在最新结果
- 只有当awb mode为auto时才能lock,其他模式不存在lock
- app在auto awb和manual awb间切换时,如果发现有闪烁现象,可通过如下流程解决
- awb 模式运行
- lock awb
- 从captureresult中等待lock完成
- 从captureresult中读取wb gain和ccm
- 使能manual wb并将step4读取到的ccm和wb gain设置下去
- 继续调整ccm或wb gain,进入manual wb流程
awb region
判断是否支持设置awb region
- 读取cameracharacteristics#control_max_regions_awb
- 大于0则表示支持控制awb region
设置awb region
- 通过capturerequest#control_awb_regions来设置,坐标系同ae/af region
awb state
读取captureresult#control_awb_state
android.control.awbmode != awb_mode_auto
android.control.awbmode awb_mode_auto
manual awb
手动白平衡 – 设置gain
- 需要将android.control.awbmode设置为off,android.colorcorrection.mode设置为transform_matrix
- 通过设置 android.colorcorrection.gains 来控制wb gain: [r_gain, g_even_gain, g_odd_gain, b_gain], gain的取值范围[1.0, 3.0]
手动白平衡 – 设置ccm
- 需要将android.control.awbmode设置为off,android.colorcorrection.mode设置为transform_matrix
- 通过设置android.colorcorrection.transform来控制ccm,3×3有理数矩阵,按行主顺序排列[ i0 i1 i2 i3 i4 i5 i6 i7 i8 ],每个元素的有效范围因不同的设备有差异,但[-1.5,3.0]范围内的值保证不会被裁剪。