今天突然遇到手机相机拍出的照片没有多帧降噪效果了,Tunning很多的效果调试需要基于多帧降噪进行处理,最后很坑爹的发现多帧降噪居然与EIS、AIS等防抖的处理有关系;带着满脸的黑人问号研究了一下相机的多帧降噪以及AIS、EIS的防抖处理。
1.多帧降噪和防抖的联系:
联系与底层的宏控有关,下面列举一下不同宏控所对应的不同处理方式:
device\mediateksample\k62v1_32_bsp_2g_ago\ProjectConfig.mk
-MTK_CAM_MFB_BUILDIN_SUPPORT = 0 //多帧降噪开关
+MTK_CAM_MFB_BUILDIN_SUPPORT = 1
MTK_CAM_MFB_MAX_FRAME = 6
-MTK_CAM_MFB_SUPPORT = 0 //多帧降噪的不同处理方式
+MTK_CAM_MFB_SUPPORT = 3
MTK_CAM_MFB_SUPPORT = 1 :项目支持MFLL功能(多张合成降噪功能),通过应用层控制开启或者关闭;
MTK_CAM_MFB_SUPPORT = 2 :项目支持AIS功能(防止手震功能,会将shutter降低,拉高ISO的方式来防止曝光时间过长导致的手震现象,然后再进行多张合成进行降噪)
MTK_CAM_MFB_SUPPORT = 3 :项目支持MFLL以及AIS功能,应用层通过接口下发执行哪个功能
附:AIS和MFLL功能执行条件,要看拍照的当前环境或者手动设置的ISO值有没有达到400以上,超过400,才会真正的走AIS和MFLL的降噪处理。
2.dump是否经过多帧降噪处理的图片对比
上图为经过多帧降噪处理后的相机图片,可以看到ISO为3200以及MFNR下其他参数值是正常的, 需要在暗环境下拍照,有的算法会在夜景模式会除了算法处理再进行多张图片的多帧降噪合成处理,夜景拍出来的图片就处理的很厉害。
上面俩副图是未经过多帧降噪处理的,差别很明显,通过参数一目了然。
3.解决方法:
了解了多帧降噪和AIS之间的联系,应用层去处理一下相关的下发也容易的多,直接选用比较轻松成熟的控制模式,宏控MTK_CAM_MFB_SUPPORT = 3
应用层添加AIS feature, on下发AIS功能;off下发多帧降噪功能。这样不管如何底层的处理都会在跑;
@Override
public void configCaptureRequest(CaptureRequest.Builder captureBuilder) {
if (captureBuilder == null) {
return;
}
String value = mAis.getValue();
String overrideValue = mAis.getOverrideValue();
if (value == null) {
return;
}
if (VALUE_OFF.equals(value)) {
if (!VALUE_OFF.equals(overrideValue)
&& mSupportedValues.contains(VALUE_AUTO)) {
value = VALUE_AUTO;
}
}
if (VALUE_ON.equals(value)) {
value = VALUE_AIS;
}
int[] mode = new int[1];
mode[0] = convertStringToEnum(value);
LogHelper.d(TAG, "[configCaptureRequest], mode[0]:" + mode[0]);
captureBuilder.set(mAisRequestModeKey, mode); //下发on/off状态
}