MTK MFNR

本文详细介绍了MTK相机中的MFNR和MFLL多帧降噪算法,包括开关设置、决策流程、相关ADB命令以及日志分析的关键字。通过实例展示了从raw数据到降噪YUV图像的处理过程。
摘要由CSDN通过智能技术生成

一、MFNR 简介
二、MFNR 开关与决策
三、MFNR 相关的adb 命令
四、MFNR log 分析
五 参考文献

一、MFNR 简介

MFNR : Multiple Frame Noise Reduction
MFLL : Multiple Frame Low Light
BSS : Best Select Shot

MFNR 跟 MFLL 是两个功能一致,名称不同的简称,是MTK 推出的YUV domain 多帧降噪的算法。

MFNR 是在 P2_CaputureNode 中 CaptureFeaturePipe 的路径,多帧的raw 首先在rootnode 中做 bss,同时会做 recorder 动作,然后依次进入到 P2ANode 做 raw2yuv ,产生的yuv等image,送到 MultiFrameNode(挂载 MFNR 算法)中进行多帧降噪处理,产生一张降噪后的YUV;如果还挂在其他的单帧YUV算法,则送YUVNode 处理,最终送到MDPNode 做crop ,resize处理.

大致流程如下:
Raws--> RootNode(BSS)-->Raws-->P2A(Raw2Yuv)-->YUVs-->MultiFrameNode(MFNR)-->YUV-->YUVNode-->YUV-->MDPNode-->Yuv

二、MFNR 开关与决策

2.1 MFNR 开关设置

开关控制在:MTK_CAM_MFB_SUPPORT
代码路径:
/device/*/ProjectConfig.mk
如果支持,默认建议设置为 3
MTK_CAM_MFB_SUPPORT =3

 0: 关 MFLL 
 1:开 MFLL
 2:开 AIS 
 3:开 MFLL 和AIS
  • 1.不支持MFNR时,请在 app 中设置

MTK_MFNR_FEATURE_MFB_MODE 为 MTK_MFNR_FEATURE_MFB_OFF

  • 2.支持MFNR 时,请在 app 中设置

MTK_MFNR_FEATURE_MFB_MODE 为 MTK_MFNR_FEATURE_MFB_AUTO,由 CUST_MFLL_AUTO_MODE 决策走哪个模式

  • 3.当支持AIS时,可以使用下面二者任一种

1.MTK_MFNR_FEATURE_AIS_MODE = MTK_MFNR_FEATURE_AIS_ON
2.MTK_MFNR_FEATURE_MFB_MODE = MTK_MFNR_FEATURE_MFB_AIS

  • 4.当前面的meta确认为非 OFF 状态,则去判断tuning设置的threshold 是否满足,(mfll_iso_th 决策是否走MFNR)。

三、MFNR 相关的adb 命令

1.强制开、关 MFNR

adb shell setprop vendor.mfll.force 1 // 开 :1 、 关:0

2. dump MFNR 各阶段的图片

adb shell setprop vendor.mfll.dump.all 1
路径:/data/vendor/camera_dump

3.开MFNR 的log

adb shell setprop vendor.mfll.log_level 3

4.dump MFNR 需要的RaW 跟YUV 图

adb shell setprop vendor.debug.camera.p2.dump 1

5.dump bss 之前的RAW和RRZO

adb shell setprop vendor.debug.camera.bss.dump 1

四、MFNR log 分析

Log 关键字

log关键字:
MFNRPlugin|capture req|capture intent: 2|connect call|MfllCore

connect call|capture req|capture intent: 2|mfll_iso_th.*enablemfb|Mfll apply.*frames|Collected Selection|capture request frames count|BSS output|skip frame count|allocate memory|times to blend|funcprocessMemc|process.*collected request|doMsBlending|process.*callback request

关键字解释
connect call调用cameraservice的app 以及使用的api
capture req capture intent: 2拍照请求帧以及intent
MFNRPluginMFNR
origin_iso838 当前预览iso
mfll_iso_th:100多帧 iso 决策 ,
enableMfb:1开启 mfll
frameCapture:4多帧拍照张数4张
evaluateCaptureSetting拍照决策 mainFrame:1 subFrames:3
BSS outputBSS 选帧
BSS: skip frame过BSS 算法 skip的张数
allocate memory分配内存
collected request(0/4)MFNR 收到帧的张数
doMsBlending多帧融合
callback request依次 callback 每一帧
// 水印相机
04-10 16:41:04.080150  1422  8639 I CameraService: CameraService::connect call (PID 8414 "com.tencent.zebra", camera ID 0) and Camera API version 1
// capture req#:92  capture intent: 2  第 92 帧 请求拍照
04-10 16:41:09.544396  1478  9201 D mtkcam_hal_android.device: [capture intent: 2] +  ULog#158932
04-10 16:41:09.544453  1478  9201 D mtkcam_hal_android.device: [ASettingRuleHelper::updateLogicalSetting] capture intent: 2
04-10 16:41:09.544487  1478  9201 D mtkcam_hal_android.device: [capture intent: 2] -  ULog#158933
04-10 16:41:09.545722  1478  9201 I mtkcam-FeatureSettingPolicy: [collectCaptureInfo] (0xb400007a86f4af30) capture req#:92
04-10 16:41:09.548862  1478  9201 D MFNRPlugin: (9201)[negotiate] Collected Selection:(0/0), ISP mode: 0, sensorId:0, Req(92)

//  origin_iso:838 但前预览iso
//  mfll_iso_th:100 多帧 iso 决策 ,
//  enableMfb:1 开启 mfll 
//  frameCapture:4 多帧拍照张数4张
04-10 16:41:09.549907  1478  9201 I MfllCore/Strategy: {Mfll}[queryStrategy] iso:838, origin_iso:838, mfll_iso_th:100, downscale(enabled:0, ratio:0, 16/16), finalCfg(enableMfb:1, frameCapture:4), postrefine(nr:1, mfb:1), aevc(ae:0, lcso:0)
04-10 16:41:09.550055  1478  9201 D MFNRCapability_Basic: (9201)[updateSelection] Mfll apply = 1, frames = 4
04-10 16:41:09.550410  1478  9201 D MFNRPlugin: (9201)[negotiate] Collected Selection:(1/0), ISP mode: 0, sensorId:0, Req(92)
04-10 16:41:09.550512  1478  9201 D MFNRCapability_Basic: (9201)[updateSelection] Mfll apply = 1, frames = 4
04-10 16:41:09.550784  1478  9201 D MFNRPlugin: (9201)[negotiate] Collected Selection:(2/0), ISP mode: 0, sensorId:0, Req(92)
04-10 16:41:09.550857  1478  9201 D MFNRCapability_Basic: (9201)[updateSelection] Mfll apply = 1, frames = 4
04-10 16:41:09.551145  1478  9201 D MFNRPlugin: (9201)[negotiate] Collected Selection:(3/0), ISP mode: 0, sensorId:0, Req(92)
04-10 16:41:09.551218  1478  9201 D MFNRCapability_Basic: (9201)[updateSelection] Mfll apply = 1, frames = 4

// evaluateCaptureSetting 拍照决策 mainFrame:1   subFrames:3
//BSS output  BSS 选帧
04-10 16:41:09.552314  1478  9201 D mtkcam-FeatureSettingPolicy: [evaluateCaptureSetting] capture request frames count(mainFrame:1, preCollectFrames:0, subFrames:3)
04-10 16:41:09.555439  1478  9201 D mtkcam-CaptureInFlightRequest: [insertRequest] insert capture RequestNo 92, size #:1
04-10 16:41:09.777355  1478  9373 D BssCore : (9373)[postPrepareRequests] MTK_FEATURE_BSS_PROCESS = 0, BSS output(enable bss:1) - order(0)
04-10 16:41:09.777365  1478  9373 D BssCore : (9373)[postPrepareRequests] MTK_FEATURE_BSS_PROCESS = 0, BSS output(enable bss:1) - order(3)
04-10 16:41:09.777373  1478  9373 D BssCore : (9373)[postPrepareRequests] MTK_FEATURE_BSS_PROCESS = 0, BSS output(enable bss:1) - order(1)
04-10 16:41:09.777379  1478  9373 D BssCore : (9373)[postPrepareRequests] MTK_FEATURE_BSS_PROCESS = 0, BSS output(enable bss:1) - order(2)

// BSS: skip frame  过BSS 算法 skip的张数
04-10 16:41:09.778173  1478  9373 I MtkCam/CapturePipe/RootNode: [reorder]BSS: skip frame count: 0, golden:0

// allocate memory 分配内存
04-10 16:41:09.820663  1478  9505 D MfllCore: {Mfll}[operator()] future allocate memory +

// collected request(0/4) MFNR 收到帧的张数
04-10 16:41:09.821332  1478  9379 D MFNRPlugin: (9379)[process] collected request(0/4)
04-10 16:41:09.821347  1478  9508 D MfllCore: {Mfll}[operator()] times to blend(3), MEMC instanceNum(1), threadsNum(1)
04-10 16:41:09.821375  1478  9508 D MfllCore: {Mfll}[operator()] funcProcessMemc(0) +
04-10 16:41:09.841445  1478  9379 D MFNRPlugin: (9379)[process] collected request(1/4)
04-10 16:41:09.847348  1478  9505 D MfllCore: {Mfll}[operator()] future allocate memory -
04-10 16:41:09.863183  1478  9379 D MFNRPlugin: (9379)[process] collected request(2/4)
04-10 16:41:09.886023  1478  9379 D MFNRPlugin: (9379)[process] collected request(3/4)

// memc 过完
04-10 16:41:09.913152  1478  9508 D MfllCore: {Mfll}[operator()] funcProcessMemc(0) -
04-10 16:41:09.913241  1478  9508 D MfllCore: {Mfll}[operator()] funcProcessMemc(1) +
04-10 16:41:09.920605  1478  9508 D MfllCore: {Mfll}[operator()] funcProcessMemc(1) -
04-10 16:41:09.920615  1478  9508 D MfllCore: {Mfll}[operator()] funcProcessMemc(2) +
04-10 16:41:09.927396  1478  9508 D MfllCore: {Mfll}[operator()] funcProcessMemc(2) -

//doMsBlending 多帧融合
04-10 16:41:09.950564  1478  9510 D MfllCore: {Mfll}[doMsBlending] blending (0) ok
04-10 16:41:09.950575  1478  9510 D MfllCore: {Mfll}[doMsBlending] re-use input base buffer for 2nd blend
04-10 16:41:09.975629  1478  9510 D MfllCore: {Mfll}[doMsBlending] blending (1) ok
04-10 16:41:10.008877  1478  9510 D MfllCore: {Mfll}[doMsBlending] use working buffer as output
04-10 16:41:10.053627  1478  9510 D MfllCore: {Mfll}[doMsBlending] blending (2) ok
04-10 17:19:21.915968 13594 15334 D MfllCore: {Mfll}[doMsBlending] blending (4) ok

// callback request 依次 callback 每一帧
04-10 16:41:10.053840  1478  9379 D MFNRPlugin: (9379)[process] callback request(0/4) 0xb4000079471651a8
04-10 16:41:10.054679  1478  9379 D MFNRPlugin: (9379)[process] callback request(1/4) 0xb4000079471651a8
04-10 16:41:10.055064  1478  9379 D MFNRPlugin: (9379)[process] callback request(2/4) 0xb4000079471651a8
04-10 16:41:10.055407  1478  9379 D MFNRPlugin: (9379)[process] callback request(3/4) 0xb4000079471651a8

五 参考文献

MTK文档

参考文献:

【腾讯文档】Camera学习知识库
https://docs.qq.com/doc/DSWZ6dUlNemtUWndv

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

以下是一个示例的C++接口代码,用于适配Android 13展锐平台的morpho_mfnr算法: ```cpp // morpho_mfnr_interface.h #ifndef MORPHO_MFNR_INTERFACE_H #define MORPHO_MFNR_INTERFACE_H #include <cstdint> // 定义接口函数 extern "C" { // 初始化函数 bool initialize(); // 释放资源函数 void release(); // 执行MFNR算法函数 void processMFNR(const uint8_t* inputImage, int width, int height, uint8_t* outputImage); } #endif // MORPHO_MFNR_INTERFACE_H ``` ```cpp // morpho_mfnr_interface.cpp #include "morpho_mfnr_interface.h" // 初始化函数实现 bool initialize() { // 在此处进行初始化操作,如加载模型等 // 返回初始化结果 return true; } // 释放资源函数实现 void release() { // 在此处释放资源,如释放内存等 } // 执行MFNR算法函数实现 void processMFNR(const uint8_t* inputImage, int width, int height, uint8_t* outputImage) { // 在此处执行morpho_mfnr算法,将结果存储在outputImage中 // 输入图像为inputImage,宽度为width,高度为height } ``` 上述代码中,`morpho_mfnr_interface.h`是接口文件,定义了接口函数的声明。`morpho_mfnr_interface.cpp`是接口函数的实现文件。在实现文件中,你可以根据展锐平台和morpho_mfnr算法的具体要求,实现初始化、资源释放和MFNR算法的函数。其中,`initialize`函数用于初始化环境,`release`函数用于释放资源,`processMFNR`函数用于执行MFNR算法。 请注意,上述代码只是一个示例,具体的实现需要根据展锐平台和morpho_mfnr算法的要求进行适配和实现。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青春~飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值