ISP 开发参考(6~end)
IMP
IMP是指影响图像效果的模块,对应API接口必须在调用ss_mpi_isp_init接口之后才能调用。
Sharpen
功能描述
Sharpen模块用于增强图像的清晰度,包括调节图像边缘的锐化属性和增强图像的细节和纹理的清晰度,同时还能分别控制图像的带方向的边缘和无方向的细节纹理的锐化强度。此外,还能控制锐化后图像的overshoot(白边白点)和undershoot(黑边黑点),以及抑制噪声的增强。
API参考
- ss_mpi_isp_set_sharpen_attr:设置图像锐化属性。
- ss_mpi_isp_get_sharpen_attr:获取图像锐化属性。
ss_mpi_isp_set_sharpen_attr
【描述】
设定图像锐化属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
ss_mpi_isp_get_sharpen_attr
【描述】
获取图像锐化属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
数据类型
- OT_ISP_SHARPEN_LUMA_NUM:亮度锐化权重区间数。
- OT_ISP_SHARPEN_GAIN_NUM:细节锐化权重区间数。
- OT_ISP_SHARPEN_MOT_NUM:运动区域锐化区间数。
- OT_ISP_SHARPEN_RLYWGT_NUM:边缘锐化权重区间数。
- OT_ISP_SHARPEN_STDGAIN_NUM:边缘检测分数增益区间数。
- ot_isp_sharpen_manual_shoot_threshold_attr:定义亮区和暗区的shoot阈值抑制手动属性。
- ot_isp_sharpen_manual_edge_rly_attr:定义边缘锐化手动属性。
- ot_isp_sharpen_manual_gain_by_mot_attr:定义运动区域锐化增益手动属性。
- ot_isp_sharpen_manual_attr:定义ISP Sharpen手动属性。
- ot_isp_sharpen_auto_shoot_threshold_attr:定义亮区和暗区的shoot阈值抑制自动属性。
- ot_isp_sharpen_auto_edge_rly_attr:定义边缘锐化自动属性。
- ot_isp_sharpen_auto_gain_by_mot_attr:定义运动区域锐化增益自动属性。
- ot_isp_sharpen_auto_attr:定义ISP Sharpen自动属性。
- ot_isp_sharpen_detail_map:是否显示图像细节灰度图。
- ot_isp_sharpen_attr:定义ISP Sharpen属性。
OT_ISP_SHARPEN_LUMA_NUM
【说明】
亮度锐化权重区间数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_SHARPEN_GAIN_NUM
【说明】
细节锐化权重区间数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_SHARPEN_MOT_NUM
【说明】
运动区域锐化区间数。
【定义】
【注意事项】
Hi3519DV500不支持。
【相关数据类型及接口】
OT_ISP_SHARPEN_RLYWGT_NUM
【说明】
边缘锐化权重区间数。
【定义】
【注意事项】
Hi3519DV500不支持。
【相关数据类型及接口】
OT_ISP_SHARPEN_STDGAIN_NUM
【说明】
边缘检测分数增益区间数。
【定义】
【注意事项】
Hi3519DV500不支持。
【相关数据类型及接口】
ot_isp_sharpen_manual_shoot_threshold_attr
【说明】
定义亮区和暗区的shoot阈值抑制手动属性。
【定义】
typedef struct {
td_u16 shoot_inner_threshold;
td_u16 shoot_outer_threshold;
td_u16 shoot_protect_threshold;
} ot_isp_sharpen_manual_shoot_threshold_attr;
【成员】
【注意事项】
Hi3519DV500不支持。
ot_isp_sharpen_manual_edge_rly_attr
【说明】
定义边缘锐化手动属性。
【定义】
typedef struct {
td_u16 edge_rly_fine_threshold;
td_u16 edge_rly_coarse_threshold;
td_u8 edge_overshoot;
td_u8 edge_undershoot;
td_u8 edge_gain_by_rly[OT_ISP_SHARPEN_RLYWGT_NUM];
td_u8 edge_rly_by_mot[OT_ISP_SHARPEN_STDGAIN_NUM];
td_u8 edge_rly_by_luma[OT_ISP_SHARPEN_STDGAIN_NUM];
} ot_isp_sharpen_manual_edge_rly_attr;
【成员】
【注意事项】
Hi3519DV500不支持。
ot_isp_sharpen_manual_gain_by_mot_attr
【说明】
定义运动区域锐化增益手动属性。
【定义】
typedef struct {
td_u8 mf_gain_by_mot[OT_ISP_SHARPEN_MOT_NUM];
td_u8 hf_gain_by_mot[OT_ISP_SHARPEN_MOT_NUM];
td_u8 lmf_gain_by_mot[OT_ISP_SHARPEN_MOT_NUM];
} ot_isp_sharpen_manual_gain_by_mot_attr;
【成员】
运动区域中低频锐化增益。将运动指数分成16个等级,每个等级对应一个中低频锐化增益,该值越大相应等级的运动区域细节越平滑。 |
【注意事项】
Hi3519DV500不支持。
ot_isp_sharpen_manual_attr
【说明】
定义ISP Sharpen手动属性。
【定义】
typedef struct {
td_u8 luma_wgt[OT_ISP_SHARPEN_LUMA_NUM];
td_u16 texture_strength[OT_ISP_SHARPEN_GAIN_NUM];
td_u16 edge_strength[OT_ISP_SHARPEN_GAIN_NUM];
td_u16 texture_freq;
td_u16 edge_freq;
td_u8 over_shoot;
td_u8 under_shoot;
td_u16 motion_texture_strength[OT_ISP_SHARPEN_GAIN_NUM];
td_u16 motion_edge_strength[OT_ISP_SHARPEN_GAIN_NUM];
td_u16 motion_texture_freq;
td_u16 motion_edge_freq;
td_u8 motion_over_shoot;
td_u8 motion_under_shoot;
td_u8 shoot_sup_strength;
td_u8 shoot_sup_adj;
td_u8 detail_ctrl;
td_u8 detail_ctrl_threshold;
td_u8 edge_filt_strength;
td_u8 edge_filt_max_cap;
td_u8 r_gain;
td_u8 g_gain;
td_u8 b_gain;
td_u8 skin_gain;
td_u16 max_sharp_gain;
ot_isp_sharpen_manual_shoot_threshold_attr shoot_threshold_attr;
ot_isp_sharpen_manual_edge_rly_attr edge_rly_attr;
ot_isp_sharpen_manual_gain_by_mot_attr gain_by_mot_attr;
} ot_isp_sharpen_manual_attr;
【成员】
亮度锐化权重。该参数是一个32的数组,将0-255的亮度平均分为32段亮度区间,每一段亮度区间对应一个亮度权重。该值越大,对应的亮度区间的锐化越强;反之,越弱。 比如0-7的亮度区间的权重是luma_wgt[0],8-15的亮度区间的权重是luma_wgt[1],依次类推。如图1所示。 |
|
|
该值越大,无方向的细节纹理的清晰度越高。该参数是一个OT_ISP_SHARPEN_GAIN_NUM=32的数组,是一个32段的连续的强度曲线,如图2所示。 |
|
|
该值越大,带方向的边缘的锐度越高。该参数是一个OT_ISP_SHARPEN_GAIN_NUM=32的数组,是一个32段的连续的强度曲线,如图3所示。 |
|
|
该值越大,细节纹理的增强就越偏向于高频增强,细节纹理就越细碎。反之,该值越小,细节纹理就越粗越平滑。texture_freq对应于强度参数texture_strength。texture_freq值过大,会导致图像的细节纹理过于细碎而不自然,甚至感觉模糊。 |
|
|
该值越大,边缘的增强就越偏向于高频增强,图像的边缘就越细越窄。反之,该值越小,边缘就越粗越平滑。edge_freq对应于强度参数edge_strength。edge_freq值过大,会导致图像的边缘过细而出现虚边现象。 |
|
|
该值越大,运动区域无方向的细节纹理的清晰度越高。该参数是一个OT_ISP_SHARPEN_GAIN_NUM=32的数组,是一个32段的连续的强度曲线,如图2所示。 |
|
|
该值越大,运动区域带方向的边缘的锐度越高。该参数是一个OT_ISP_SHARPEN_GAIN_NUM=32的数组,是一个32段的连续的强度曲线,如图3所示。 |
|
|
该值越大,运动区域细节纹理的增强就越偏向于高频增强,细节纹理就越细碎。反之,该值越小,细节纹理就越粗越平滑。texture_freq对应于强度参数texture_strength。texture_freq值过大,会导致图像运动区域的细节纹理过于细碎而不自然,甚至感觉模糊。 |
|
|
该值越大,运动区域边缘的增强就越偏向于高频增强,图像的边缘就越细越窄。反之,该值越小,边缘就越粗越平滑。edge_freq对应于强度参数edge_strength。edge_freq值过大,会导致图像的边缘过细而出现虚边现象。 |
|
运动区域图像的overshoot(锐化后的白边白点)的强度。 |
|
运动区域图像的undershoot(锐化后的黑边黑点)的强度。 |
|
图像overshoot和undershoot的抑制强度。用于在保证清晰度不明显下降的前提下,抑制锐化后的overshoot和undershoot的宽度和幅度。 该值越大,锐化后的图像的overshoot和undershoot的宽度越窄、强度越小。该值变大,理论上不会影响图像的清晰度,只是黑白边变窄以后,会减弱人眼的锐度感受。该参数需要和shoot_sup_adj配合使用。 |
|
图像overshoot和undershoot的抑制区域划分。该参数配合shoot_sup_strength使用,用于调节shoot_sup_strength作用的区域范围。 该值越小,则越多的纹理区域的shoot会被shoot_sup_strength抑制;该值越大,则只有很强的边缘的shoot会被shoot_sup_strength抑制,纹理区域的shoot不会被抑制。 |
|
用于控制图像的细节纹理区的shoot强度。shoot越大,细节纹理区的清晰度越高。取值范围:[0, 255], 该值等于128是,则图像的细节纹理区域的shoot强度分别等于over_shoot和under_shoot。该值大于128,则图像的细节纹理的shoot强度大于over_shoot和under_shoot。该值小于128,则图像的细节纹理的shoot强度小于over_shoot和under_shoot。 |
|
图像的细节纹理区和边缘的区分阈值。该值配合detail_ctrl使用,用于区分纹理区和边缘。小于该阈值的区域为纹理区,该纹理区域的shoot会被detail_ctrl单独控制,而大于该阈值的边缘区域的shoot依然等于over_shoot和under_shoot。 |
|
|
该值越大,判断为边缘的区域越多、边缘越宽,edge_strength起作用的区域越多,而且,该值越大,沿着边缘方向的平滑滤波强度也越大,边缘就越平滑。 |
|
边缘滤波的最大强度调试参数:该值越大,边缘滤波的最大强度也最大,edge_filt_strength的可调试范围也越大;一般建议该值大小控制30以内。 |
|
深红色区域的锐化增益。该值越大,则深红色区域的锐化强度越大。
|
|
深蓝色区域的锐化增益。该值越大,则深蓝色区域的锐化强度越大。
|
|
图像锐化的最大增益值。该值越大,图像的锐化幅度越大,反之值越小,锐化幅度越小。适当的调小该参数,可以减少图像的过锐化,从而减少图像锐化后的黑白点。 |
|
图 1 Sharpen的像素亮度luma和锐化强度luma_wgt的关系曲线

图 2 texture_strength[OT_ISP_SHARPEN_GAIN_NUM]强度曲线示意图

强度曲线的横坐标var是从图像中提取的方差统计特征,将横坐标var均分为32段,用于区分出图像的Flat Area(平坦区域)、Weak Texture(弱纹理)、Texture(纹理)和Strong Texture(强纹理)。纵坐标就是强度参数texture_strength的值,用户可以通过设置该曲线上的32个强度值来为平坦区域、弱纹理区域、纹理区域和强纹理区域设置不同的锐化强度。这4个区域并没有明显的区分界限,都是连续过渡,用户可以根据实际效果来调整纵坐标强度,为不同的区域设置不同的强度。
图 3 edge_strength[OT_ISP_SHARPEN_GAIN_NUM]强度曲线示意图

强度曲线的横坐标var是从图像中提取的方差统计值,将横坐标var均分为32段,用于区分出图像的Flat Area(平坦区域)、Weak Edge(弱边缘)、Edge(边缘)和Strong Edge(强边缘)。纵坐标就是强度参数edge_strength的值,用户可以通过设置该曲线上的32个强度值来为平坦区域、弱边缘、边缘和强边缘设置不同的锐化强度。这4个区域并没有明显的区分界限,都是连续过渡,用户可以根据实际效果来调整纵坐标强度,为不同的区域设置不同的强度。
ot_isp_sharpen_auto_shoot_threshold_attr
【说明】
定义亮区和暗区的shoot阈值抑制自动属性。
【定义】
typedef struct {
td_u16 shoot_inner_threshold[OT_ISP_AUTO_ISO_NUM];
td_u16 shoot_outer_threshold[OT_ISP_AUTO_ISO_NUM];
td_u16 shoot_protect_threshold[OT_ISP_AUTO_ISO_NUM];
} ot_isp_sharpen_auto_shoot_threshold_attr;
【成员】
【注意事项】
Hi3519DV500不支持。
ot_isp_sharpen_auto_edge_rly_attr
【说明】
定义边缘锐化自动属性。
【定义】
typedef struct {
td_u16 edge_rly_fine_threshold[OT_ISP_AUTO_ISO_NUM];
td_u16 edge_rly_coarse_threshold[OT_ISP_AUTO_ISO_NUM];
td_u8 edge_overshoot[OT_ISP_AUTO_ISO_NUM];
td_u8 edge_undershoot[OT_ISP_AUTO_ISO_NUM];
td_u8 edge_gain_by_rly[OT_ISP_SHARPEN_RLYWGT_NUM][OT_ISP_AUTO_ISO_NUM];
td_u8 edge_rly_by_mot[OT_ISP_SHARPEN_STDGAIN_NUM][OT_ISP_AUTO_ISO_NUM];
td_u8 edge_rly_by_luma[OT_ISP_SHARPEN_STDGAIN_NUM][OT_ISP_AUTO_ISO_NUM];
} ot_isp_sharpen_auto_edge_rly_attr;
【成员】
【注意事项】
Hi3519DV500不支持。
ot_isp_sharpen_auto_gain_by_mot_attr
【说明】
定义运动区域锐化增益自动属性。
【定义】
typedef struct {
td_u8 mf_gain_by_mot[OT_ISP_SHARPEN_MOT_NUM][OT_ISP_AUTO_ISO_NUM];
td_u8 hf_gain_by_mot[OT_ISP_SHARPEN_MOT_NUM][OT_ISP_AUTO_ISO_NUM];
td_u8 lmf_gain_by_mot[OT_ISP_SHARPEN_MOT_NUM][OT_ISP_AUTO_ISO_NUM];
} ot_isp_sharpen_auto_gain_by_mot_attr;
【成员】
运动区域中低频锐化增益。将运动指数分成16个等级,每个等级对应一个中低频锐化增益,该值越大相应等级的运动区域细节越平滑。 |
【注意事项】
Hi3519DV500不支持。
ot_isp_sharpen_auto_attr
【说明】
定义ISP Sharpen自动属性。
【定义】
typedef struct {
td_u8 luma_wgt[OT_ISP_SHARPEN_LUMA_NUM][OT_ISP_AUTO_ISO_NUM];
td_u16 texture_strength[OT_ISP_SHARPEN_GAIN_NUM][OT_ISP_AUTO_ISO_NUM];
td_u16 edge_strength[OT_ISP_SHARPEN_GAIN_NUM][OT_ISP_AUTO_ISO_NUM];
td_u16 texture_freq[OT_ISP_AUTO_ISO_NUM];
td_u16 edge_freq[OT_ISP_AUTO_ISO_NUM];
td_u8 over_shoot[OT_ISP_AUTO_ISO_NUM];
td_u8 under_shoot[OT_ISP_AUTO_ISO_NUM];
td_u16 motion_texture_strength[OT_ISP_SHARPEN_GAIN_NUM][OT_ISP_AUTO_ISO_NUM];
td_u16 motion_edge_strength[OT_ISP_SHARPEN_GAIN_NUM][OT_ISP_AUTO_ISO_NUM];
td_u16 motion_texture_freq[OT_ISP_AUTO_ISO_NUM];
td_u16 motion_edge_freq[OT_ISP_AUTO_ISO_NUM];
td_u8 motion_over_shoot[OT_ISP_AUTO_ISO_NUM];
td_u8 motion_under_shoot[OT_ISP_AUTO_ISO_NUM];
td_u8 shoot_sup_strength[OT_ISP_AUTO_ISO_NUM];
td_u8 shoot_sup_adj[OT_ISP_AUTO_ISO_NUM];
td_u8 detail_ctrl[OT_ISP_AUTO_ISO_NUM];
td_u8 detail_ctrl_threshold[OT_ISP_AUTO_ISO_NUM];
td_u8 edge_filt_strength[OT_ISP_AUTO_ISO_NUM];
td_u8 edge_filt_max_cap[OT_ISP_AUTO_ISO_NUM];
td_u8 r_gain[OT_ISP_AUTO_ISO_NUM];
td_u8 g_gain[OT_ISP_AUTO_ISO_NUM];
td_u8 b_gain[OT_ISP_AUTO_ISO_NUM];
td_u8 skin_gain[OT_ISP_AUTO_ISO_NUM];
td_u16 max_sharp_gain[OT_ISP_AUTO_ISO_NUM];
ot_isp_sharpen_auto_shoot_threshold_attr shoot_threshold_attr;
ot_isp_sharpen_auto_edge_rly_attr edge_rly_attr;
ot_isp_sharpen_auto_gain_by_mot_attr gain_by_mot_attr;
} ot_isp_sharpen_auto_attr;
【成员】
亮度锐化权重。该参数是一个32的数组,将0-255的亮度平均分为32段亮度区间,每一段亮度区间对应一个亮度权重。该值越大,对应的亮度区间的锐化越强;反之,越弱。 比如0-7的亮度区间的权重是luma_wgt[0],8-15的亮度区间的权重是luma_wgt[1],依次类推。如图1所示。 |
|
|
该值越大,无方向的细节纹理的清晰度越高。该参数是一个OT_ISP_SHARPEN_GAIN_NUM=32的数组,是一个32段的连续的强度曲线,如图2所示。 |
|
|
该值越大,带方向的边缘的锐度越高。该参数是一个OT_ISP_SHARPEN_GAIN_NUM=32的数组,是一个32段的连续的强度曲线,如图3所示。 |
|
|
该值越大,细节纹理的增强就越偏向于高频增强,细节纹理就越细碎。反之,该值越小,细节纹理就越粗越平滑。texture_freq对应于强度参数texture_strength。texture_freq值过大,会导致图像的细节纹理过于细碎而不自然,甚至感觉模糊。 |
|
|
该值越大,边缘的增强就越偏向于高频增强,图像的边缘就越细越窄。反之,该值越小,边缘就越粗越平滑。edge_freq对应于强度参数edge_strength。edge_freq值过大,会导致图像的边缘过细而出现虚边现象。 |
|
|
该值越大,运动区域无方向的细节纹理的清晰度越高。该参数是一个OT_ISP_SHARPEN_GAIN_NUM=32的数组,是一个32段的连续的强度曲线,如图2所示。 |
|
|
该值越大,运动区域带方向的边缘的锐度越高。该参数是一个OT_ISP_SHARPEN_GAIN_NUM=32的数组,是一个32段的连续的强度曲线,如图3所示。 |
|
|
该值越大,运动区域细节纹理的增强就越偏向于高频增强,细节纹理就越细碎。反之,该值越小,细节纹理就越粗越平滑。texture_freq对应于强度参数texture_strength。texture_freq值过大,会导致图像运动区域的细节纹理过于细碎而不自然,甚至感觉模糊。 |
|
|
该值越大,运动区域边缘的增强就越偏向于高频增强,图像的边缘就越细越窄。反之,该值越小,边缘就越粗越平滑。edge_freq对应于强度参数edge_strength。edge_freq值过大,会导致图像的边缘过细而出现虚边现象。 |
|
运动区域图像的overshoot(锐化后的白边白点)的强度。 |
|
运动区域图像的undershoot(锐化后的黑边黑点)的强度。 |
|
图像overshoot和undershoot的抑制强度。用于在保证清晰度不明显下降的前提下,抑制锐化后的overshoot和undershoot的宽度和幅度。 该值越大,锐化后的图像的overshoot和undershoot的宽度越窄、强度越小。该值变大,理论上不会影响图像的清晰度,只是黑白边变窄以后,会减弱人眼的锐度感受。该参数需要和shoot_sup_adj配合使用。 |
|
图像overshoot和undershoot的抑制区域划分。该参数配合shoot_sup_strength使用,用于调节shoot_sup_strength作用的区域范围。 该值越小,则越多的纹理区域的shoot会被shoot_sup_strength抑制;该值越大,则只有很强的边缘的shoot会被shoot_sup_strength抑制,纹理区域的shoot不会被抑制。 |
|
用于控制图像的细节纹理区的shoot强度。shoot越大,细节纹理区的清晰度越高。取值范围:[0, 255], 该值等于128是,则图像的细节纹理区域的shoot强度分别等于over_shoot和under_shoot。该值大于128,则图像的细节纹理的shoot强度大于over_shoot和under_shoot。该值小于128,则图像的细节纹理的shoot强度小于over_shoot和under_shoot。 |
|
图像的细节纹理区和边缘的区分阈值。该值配合detail_ctrl使用,用于区分纹理区和边缘。小于该阈值的区域为纹理区,该纹理区域的shoot会被detail_ctrl单独控制,而大于该阈值的边缘区域的shoot依然等于over_shoot和under_shoot。 |
|
|
该值越大,判断为边缘的区域越多、边缘越宽,edge_strength起作用的区域越多,而且,该值越大,沿着边缘方向的平滑滤波强度也越大,边缘就越平滑。 |
|
边缘滤波的最大强度调试参数:该值越大,边缘滤波的最大强度也最大,edge_filt_strength的可调试范围也越大;一般建议该值大小控制30以内。 |
|
深红色区域的锐化增益。该值越大,则深红色区域的锐化强度越大。
|
|
深蓝色区域的锐化增益。该值越大,则深蓝色区域的锐化强度越大。
|
|
图像锐化的最大增益值。该值越大,图像的锐化幅度越大,反之值越小,锐化幅度越小。适当的调小该参数,可以减少图像的过锐化,从而减少图像锐化后的黑白点。 |
|
【注意事项】
Auto档参数分别对应sensor在16种不同增益(Again*Dgain* ISPDgain(times))情况下的设置值,成员参数的含义与Manual档cmos成员参数一致。16种增益为:1、2、4、8、16、32、64、128、256、512、1024、2048、4096、8192、16384、32768。
ot_isp_sharpen_detail_map
【说明】
是否显示图像细节灰度图。
【定义】
typedef enum {
OT_ISP_SHARPEN_NORMAL = 0,
OT_ISP_SHARPEN_OFF,
OT_ISP_SHARPEN_DIFF_NORM,
OT_ISP_SHARPEN_DIFF,
OT_ISP_SHARPEN_TOTAL,
OT_ISP_SHARPEN_TEXTURE,
OT_ISP_SHARPEN_EDGE,
OT_ISP_SHARPEN_TOTAL_FREQ,
OT_ISP_SHARPEN_TEXTURE_FREQ,
OT_ISP_SHARPEN_EDGE_FREQ,
OT_ISP_SHARPEN_BUTT
} ot_isp_sharpen_detail_map;
【成员】
【注意事项】
- 该参数仅在设置为OT_ISP_SHARPEN_NORMAL时显示正常图像,在其余参数设置下为Debug模式,只显示Y分量。
- Hi3516CV610不支持Debug模式。
【相关数据类型及接口】
ot_isp_sharpen_attr
【说明】
定义ISP Sharpen属性。
【定义】
typedef struct {
td_bool enable;
td_bool motion_en;
td_u8 motion_threshold0;
td_u8 motion_threshold1;
td_u16 motion_gain0;
td_u16 motion_gain1;
td_u8 skin_umin;
td_u8 skin_vmin;
td_u8 skin_umax;
td_u8 skin_vmax;
ot_op_mode op_type;
ot_isp_sharpen_detail_map detail_map;
ot_isp_sharpen_manual_attr manual_attr;
ot_isp_sharpen_auto_attr auto_attr;
} ot_isp_sharpen_attr;
【成员】
【注意事项】
Sharpen功能分为自动和手动:
- enable为1,op_type为OT_OP_MODE_AUTO,使用自动Sharpen功能。此时sharpen的强度值与系统增益的关系请参见成员变量。
- enable设置为1,op_type设置为OT_OP_MODE_MANUAL使用手动Sharpen功能。
- 运动区域判定采用BNR运动检测模块上一帧结果,因此只有当BNR运动检测使能时,此功能方可生效;生效时存在一帧图像延迟,因此建议运动区域与静止区域参数不要差异太大,否则容易出现运动与静止区域图像分层。
- 运动区域判定采用BNR运动检测结果,由于噪声影响,部分静止区域可能也会判定为运动,部分平坦运动区域可能判定为静止,因此运动参数可能会影响静止区域,静止参数可能会影响运动区域。
【相关数据类型及接口】
无
Gamma
功能描述
Gamma模块对图像进行亮度空间非线性转换以适配输出设备。Gamma模块校正R、G、B时调用同一组Gamma表,Gamma表各节点之间的间距相同,节点之间的图像像素值使用线性插值生成。
API参考
- ss_mpi_isp_set_gamma_attr:设置Gamma属性。
- ss_mpi_isp_get_gamma_attr:获取Gamma属性。
ss_mpi_isp_set_gamma_attr
【描述】
设置Gamma属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
头文件:ot_common_isp.h、ss_mpi_isp.h
库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
ss_mpi_isp_get_gamma_attr
【描述】
获取Gamma属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
头文件:ot_common_isp.h、ss_mpi_isp.h
库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
数据类型
- OT_ISP_GAMMA_NODE_NUM:Gamma表的分段节点数。
- ot_isp_gamma_attr:定义ISP Gamma校正属性。
- ot_isp_gamma_curve_type:定义ISP Gamma传输曲线类型。
OT_ISP_GAMMA_NODE_NUM
【说明】
Gamma表的分段节点数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
ot_isp_gamma_attr
【说明】
定义ISP Gamma校正属性。
【定义】
typedef struct
{
td_bool enable;
td_u16 table[OT_ISP_GAMMA_NODE_NUM];
ot_isp_gamma_curve_type curve_type;
} ot_isp_gamma_attr;
【成员】
table[OT_ISP_GAMMA_NODE_NUM] |
|
【注意事项】
- Gamma校正R、G、B调用同一组Gamma Table。
- curve_type选择为OT_ISP_GAMMA_CURVE_DEFAULT、OT_ISP_GAMMA_CURVE_SRGB、OT_ISP_GAMMA_CURVE_HDR等三种模式时,系统会自动配置预设的曲线,此时通过工具拖拉曲线均不生效。只有选择OT_ISP_GAMMA_CURVE_USER_DEFINE时,才能通过工具进行曲线修改。
- Hi3519DV500芯片不支持OT_ISP_GAMMA_CURVE_HDR模式。
- 使用任意类型的预设曲线后,可以切换成OT_ISP_GAMMA_CURVE_USER_DEFINE并以预设曲线为基础进行Gamma调试。
【相关数据类型及接口】
无。
ot_isp_gamma_curve_type
【说明】
定义Gamma曲线类型。
【定义】
typedef enum {
OT_ISP_GAMMA_CURVE_DEFAULT = 0x0,
OT_ISP_GAMMA_CURVE_SRGB,
OT_ISP_GAMMA_CURVE_HDR,
OT_ISP_GAMMA_CURVE_USER_DEFINE,
OT_ISP_GAMMA_CURVE_BUTT
} ot_isp_gamma_curve_type;
【成员】
【注意事项】
用户自定义Gamma曲线时,可以通过PQ Tools工具生成,必须确保Gamma曲线符合规范。WDR模式与线性模式可以分别定义一组Gamma曲线。
【相关数据类型及接口】
无。
DRC
功能描述
DRC算法用于对WDR合成后的数据进行动态范围压缩(Dynamic Range Compression)。图像一般需要在显示设备上显示,CRT显示器的动态范围一般只有<50dB,而WDR合成后的数据的动态范围可以达到120dB,如果直接在CRT显示器上显示,就会由于动态范围不匹配的问题,造成丢失亮度较高或者较低处的细节。
DRC算法的目的就是要使真实场景的观察者和显示设备的观察者都能获得相同的视觉感受。DRC算法将高动态范围的图像压缩到显示器的动态范围,同时尽可能的保留原图像的细节和对比度。

API参考
- ss_mpi_isp_set_drc_attr:设置动态范围压缩参数。
- ss_mpi_isp_get_drc_attr:获取动态范围压缩参数。
ss_mpi_isp_set_drc_attr
【描述】
设置动态范围压缩参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
ss_mpi_isp_get_drc_attr
【描述】
获取动态范围压缩参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
数据类型
- OT_ISP_DRC_CC_NODE_NUM:定义ISP DRC Color Correction LUT节点个数。
- OT_ISP_DRC_TM_NODE_NUM:定义ISP DRC Tone Mapping LUT节点个数。
- OT_ISP_DRC_LMIX_NODE_NUM:定义ISP DRC Local Mixing LUT节点个数。
- OT_ISP_DRC_BCNR_NODE_NUM:DRC BCNR Detail Restore LUT节点个数。
- ot_isp_drc_manual_attr:定义ISP DRC手动属性。
- ot_isp_drc_auto_attr:定义ISP DRC自动属性。
- ot_isp_drc_auto_curve_attr:定义ISP DRC Auto Curve属性。
- ot_isp_drc_asymmetry_curve_attr:定义ISP DRC Asymmetry Curve属性。
- ot_isp_drc_curve_select:定义ISP DRC Tone Mapping曲线类型。
- ot_isp_drc_attr:定义ISP DRC属性。
OT_ISP_DRC_CC_NODE_NUM
【说明】
DRC Color Correction (颜色校正) LUT节点个数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_DRC_TM_NODE_NUM
【说明】
DRC Tone Mapping LUT节点个数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_DRC_LMIX_NODE_NUM
【说明】
DRC Local Mixing(细节增强)LUT节点个数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_DRC_BCNR_NODE_NUM
【说明】
DRC BCNR Detail Restore(细节恢复)LUT节点个数。
【定义】
【注意事项】
Hi3519DV500不支持。
【相关数据类型及接口】
ot_isp_drc_manual_attr
【说明】
定义ISP DRC手动属性。
【定义】
【成员】
【注意事项】
在线性和WDR模式下均可以达到最大值。
【相关数据类型及接口】
ot_isp_drc_auto_attr
【说明】
定义ISP DRC自动属性。
【定义】
【成员】
【注意事项】
- 实际生效强度为:算法AUTO模式计算出的强度 * strength / 512。
- 注意strength_max必须大于等于strength_min,否则两个参数均不生效。
- 线性和WDR自动模式下DRC强度的建议取值范围不同,strength_max/strength_min的建议取值范围也不同:
- 线性自动模式下,strength_max和strength_min的建议取值范围为[0x0, 0x200],其中strength_max默认值为0x200,strength_min默认值为0x0;
- 在WDR自动模式下,strength_max和strength_min的建议取值范围为[0x200, 0x3FF],其中strength_max默认值为0x3FF,strength_min默认值为0x200。
【相关数据类型及接口】
ot_isp_drc_auto_curve_attr
【说明】
定义ISP DRC Auto Curve属性。
【定义】
【成员】
用于控制Auto Curve的刷新频率,值越大,对场景或曝光变化越不敏感,刷新频率越低。取值范围:[0x0, 0xF]。 |
【注意事项】
Hi3519DV500不支持。
【相关数据类型及接口】
ot_isp_drc_asymmetry_curve_attr
【说明】
定义ISP DRC Asymmetry Curve属性。
【定义】
typedef struct {
td_u8 asymmetry;
td_u8 second_pole;
td_u8 stretch;
td_u8 compress;
} ot_isp_drc_asymmetry_curve_attr;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_drc_curve_select
【说明】
定义ISP DRC Tone Mapping曲线类型。
【定义】
typedef enum {
OT_ISP_DRC_CURVE_ASYMMETRY = 0x0,
OT_ISP_DRC_CURVE_USER,
OT_ISP_DRC_CURVE_AUTO,
OT_ISP_DRC_CURVE_BUTT
} ot_isp_drc_curve_select;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_drc_bcnr_attr
【说明】
定义ISP DRC BCNR属性。
【定义】
typedef struct {
td_bool enable;
td_u8 detail_restore_lut[OT_ISP_DRC_BCNR_NODE_NUM];
td_u8 strength;
} ot_isp_drc_bcnr_attr;
【成员】
detail_restore_lut[OT_ISP_DRC_BCNR_NODE_NUM] |
|
【注意事项】
Hi3519DV500不支持。
【相关数据类型及接口】
ot_isp_drc_mixing_bright_param
【说明】
定义ISP DRC正向细节增强参数。
【定义】
typedef struct {
td_u8 max;
td_u8 min;
td_u8 threshold;
td_s8 slope;
} ot_isp_drc_mixing_bright_param;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_drc_mixing_dark_param
【说明】
定义ISP DRC负向细节增强参数。
【定义】
typedef struct {
td_u8 max;
td_u8 min;
td_u8 threshold;
td_s8 slope;
} ot_isp_drc_mixing_dark_param;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_drc_attr
【说明】
定义ISP DRC属性。
【定义】
typedef struct {
td_bool enable;
ot_isp_drc_curve_select curve_select;
td_u8 purple_reduction_strength;
td_u8 bright_gain_limit;
td_u8 bright_gain_limit_step;
td_u8 dark_gain_limit_luma;
td_u8 dark_gain_limit_chroma;
td_u8 contrast_ctrl;
td_u8 rim_reduction_strength;
td_u8 rim_reduction_threshold;
td_u16 color_correction_lut[OT_ISP_DRC_CC_NODE_NUM];
td_u16 tone_mapping_value[OT_ISP_DRC_TM_NODE_NUM];
td_u8 spatial_filter_coef;
td_u8 range_filter_coef;
td_u8 detail_adjust_coef;
union {
ot_isp_drc_mixing_bright_param local_mixing_bright_param;
td_u8 local_mixing_bright[OT_ISP_DRC_LMIX_NODE_NUM];
};
union {
ot_isp_drc_mixing_dark_param local_mixing_dark_param;
td_u8 local_mixing_dark[OT_ISP_DRC_LMIX_NODE_NUM];
};
td_u8 high_saturation_color_ctrl;
td_u8 global_color_ctrl;
td_bool shoot_reduction_en;
ot_op_mode op_type;
ot_isp_drc_manual_attr manual_attr;
ot_isp_drc_auto_attr auto_attr;
ot_isp_drc_asymmetry_curve_attr asymmetry_curve;
ot_isp_drc_auto_curve_attr auto_curve;
ot_isp_drc_bcnr_attr bcnr_attr;
} ot_isp_drc_attr;
【成员】
color_correction_lut[OT_ISP_DRC_CC_NODE_NUM] |
|
tone_mapping_value[OT_ISP_DRC_TM_NODE_NUM] |
|
Filter空域滤波系数。值越大,运动halo越不明显,细节越少,值越小,细节表现越好,运动halo越明显。取值范围:[0x0, 0x5] |
|
Filter值域滤波系数。值越大,halo越明显;值越小,halo表现越好,但是在强边缘处可能会出现描边现象。取值范围:[0x0, 0xA] |
|
local_mixing_bright[OT_ISP_DRC_LMIX_NODE_NUM] |
|
local_mixing_dark[OT_ISP_DRC_LMIX_NODE_NUM] |
|
高饱和区域颜色控制;主要用于改善DRC提亮后颜色鲜艳区域(尤其是红蓝色区域)由于过曝而出现的颜色变淡的问题,副作用是部分场景可能加重紫边。取值范围:[0x0, 0xF] |
|
DRC Asymmetry Curve属性,仅在curve_select=OT_ISP_DRC_CURVE_ASYMMETRY时生效。 |
|
DRC Auto Curve属性,仅在curve_select=OT_ISP_DRC_CURVE_AUTO时生效。仅Hi3516CV610支持。 |
|
【注意事项】
-
DRC功能分为自动和手动, DRC实际生效强度在自动模式下会根据场景自适应,而在手动模式下完全由用户配置:
- op_type为OT_OP_MODE_AUTO,使用自动DRC功能;
- op_type设置为OT_OP_MODE_MANUAL使用手动DRC功能。
-
参数asymmetry,second_pole, stretch和compress对Asymmetry Curve形状的影响趋势请参考《ISP 图像调优指南》DRC相关章节。
- 建议color_correction_lut的值不要调试过小,因为降低饱和度的同时会带来高频细节的损失,用户可以配合CA模块来调试整体饱和度。
- dark_gain_limit_luma和dark_gain_limit_chroma两个接口的实际效果不完全平滑,即参数在两个相邻值之间切换时,效果可能存在跳变。
- shoot_reductione_en使能时,可能导致夜间场景的灯光轮廓清晰程度下降,同时会导致purple_reduction_strength对应的去紫边功能的效果显著减弱。
-
auto_curve功能在对AE统计信息的位置和模式有如下要求;如不满足,该功能不生效且会有"Invalid AE Stat Config ..."的报错打印:
- AE统计信息在pipeline中的位置必须为:ISP_AE_AFTER_DG或者ISP_AE_AFTER_AWB
- AE统计信息中直方图和均值对应的开方模式,即hist_mode和aver_mode,均必须配置为:ISP_AE_NORMAL
-
bcnr_attr在以下情况不生效:
- WDR模式
- 线性在线模式下图像宽度大于3200。
-
DRC Strength=0和不使能DRC的图像效果可能存在差异,这是由于Strength仅控制DRC对画面整体亮度的改变程度,DRC部分子模块不受其影响。如果要让DRC使能时效果和不使能一致,除配置Strength=0外,还需做如下配置:
- 配置bcnr_attr.enable=0,关闭BCNR;
- 配置color_correction_lut所有值为1024,关闭颜色校正;
- 配置dark_gain_limit_chroma=0,关闭暗区颜色增益抑制;
- 配置bright_gain_limit=0, bright_gain_limit_step=15,关闭高亮抑制;
- 配置global_color_ctrl=0, 关闭全局颜色控制。
【相关数据类型及接口】
无。
Mesh Shading
功能描述
LSC模块主要用来处理由于镜头光学折射不均匀导致的镜头周围出现阴影的情况。目前流行的处理方式有Radial(同轴圆)方式以及Mesh(网格)方式。
- 在Hi3519DV500芯片中 Mesh Shading算法使用Mesh(网格)方式对画面进行标定/矫正,算法会将整个Bayer域画面分割成32x32个子区域,这32x32个区域大小大致相等。
- 在Hi3516CV610芯片中,算法会将整个Bayer域画面分割成32x18个子区域,这32x18个区域大小大致相等。
在数据处理过程中,算法将分别对RAW域中的每个通道进行处理。
API参考
- ss_mpi_isp_set_mesh_shading_attr:设定Mesh Shading算法参数。
- ss_mpi_isp_get_mesh_shading_attr:获取Mesh Shading算法参数。
- ss_mpi_isp_set_mesh_shading_gain_lut_attr:设定Mesh Shading增益表属性。
- ss_mpi_isp_get_mesh_shading_gain_lut_attr:获取Mesh Shading增益表属性。
ss_mpi_isp_set_mesh_shading_attr
【描述】
设置Mesh Shading算法参数。
【语法】
td_s32 ss_mpi_isp_set_mesh_shading_attr(ot_vi_pipe vi_pipe, const ot_isp_shading_attr *shading_attr);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a, libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
ss_mpi_isp_get_mesh_shading_attr
ss_mpi_isp_get_mesh_shading_attr
【描述】
获取Mesh Shading算法参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a, libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
ss_mpi_isp_set_mesh_shading_attr
ss_mpi_isp_set_mesh_shading_gain_lut_attr
【描述】
设定Mesh Shading增益表属性。
【语法】
td_s32 ss_mpi_isp_set_mesh_shading_gain_lut_attr(ot_vi_pipe vi_pipe, const ot_isp_shading_lut_attr *shading_lut_attr);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
ss_mpi_isp_get_mesh_shading_gain_lut_attr
ss_mpi_isp_get_mesh_shading_gain_lut_attr
【描述】
获取Mesh Shading增益表属性。
【语法】
td_s32 ss_mpi_isp_get_mesh_shading_gain_lut_attr(ot_vi_pipe vi_pipe, ot_isp_shading_lut_attr *shading_lut_attr);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
ss_mpi_isp_set_mesh_shading_gain_lut_attr
数据类型
- OT_ISP_MLSC_X_HALF_GRID_NUM:x方向上mesh分块数量的一半。
- OT_ISP_MLSC_Y_HALF_GRID_NUM:y方向上mesh分块数量的一半。
- OT_ISP_MLSC_GAIN_LUT_NUM:定义Mesh Shading Lut表的长度。
- ot_isp_shading_attr:定义Mesh Shading算法参数。
- ot_isp_shading_gain_lut:定义Mesh Shading增益表的参数。
- ot_isp_shading_lut_attr:定义Mesh Shading增益表属性。
OT_ISP_MLSC_X_HALF_GRID_NUM
【说明】
x方向上mesh分块数量的一半。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_MLSC_Y_HALF_GRID_NUM
【说明】
y方向上mesh分块数量的一半。
【定义】
【注意事项】
无
【相关数据类型及接口】
OT_ISP_MLSC_GAIN_LUT_NUM
【说明】
定义Mesh Shading Lut表的长度。
【定义】
【注意事项】
无。
【相关数据类型及接口】
ot_isp_shading_attr
【说明】
定义Mesh Shading算法参数。
【定义】
【成员】
纠正Mesh Shading标定后的全局强度。当镜头shading很严重的时候,画面四个角补偿的增益很大,容易导致噪声很大,而且画面有格子现象。此时调整mesh_strength小于一倍强度,可以减少Mesh Shading的补偿值,从而减小四个角的补偿增益,达到优化噪声和画面格子的效果。 |
|
【注意事项】
无
【相关数据类型及接口】
ot_isp_shading_gain_lut
【说明】
定义Mesh Shading增益表参数。
【定义】
typedef struct {
td_u16 r_gain[OT_ISP_LSC_GRID_POINTS];
td_u16 gr_gain[OT_ISP_LSC_GRID_POINTS];
td_u16 gb_gain[OT_ISP_LSC_GRID_POINTS];
td_u16 b_gain[OT_ISP_LSC_GRID_POINTS];
} ot_isp_shading_gain_lut;
【成员】
r_gain[OT_ISP_LSC_GRID_POINTS] |
用来储存Mesh Shading所用R通道标定数据。该数组表示画面从左至右、从上至下的网格交点处的R分量阴影矫正增益数据值。 |
gr_gain[OT_ISP_LSC_GRID_POINTS] |
用来储存Mesh Shading所用Gr通道标定数据。该数组表示画面从左至右、从上至下的网格交点处的Gr分量阴影矫正增益数据值。 |
gb_gain[OT_ISP_LSC_GRID_POINTS] |
用来储存Mesh Shading所用Gb通道标定数据。该数组表示画面从左至右、从上至下的网格交点处的Gb分量阴影矫正增益数据值。 |
b_gain[OT_ISP_LSC_GRID_POINTS] |
用来储存Mesh Shading所用B通道标定数据。该数组表示画面从左至右、从上至下的网格交点处的B分量阴影矫正增益数据值。 |
【注意事项】
- 增益表的默认配置与ot_isp_cmos_alg_key中的bit1(Lsc 标志位)有关,如果bit1(Lsc=1),则采用cmos_ex.h中的配置值作为默认值;否则默认配置为1倍增益。
- 增益表的精度与mesh_scale的值有关系,详参表1。在mesh_scale配置为默认值4的情况下,增益表配置为0值表示增益为1倍。
【相关数据类型及接口】
ot_isp_shading_lut_attr
【说明】
定义Mesh Shading增益表属性。
【定义】
typedef struct {
td_u8 mesh_scale;
td_u16 x_grid_width[OT_ISP_MLSC_X_HALF_GRID_NUM];
td_u16 y_grid_width[OT_ISP_MLSC_Y_HALF_GRID_NUM];
ot_isp_shading_gain_lut lsc_gain_lut[OT_ISP_MLSC_GAIN_LUT_NUM];
} ot_isp_shading_lut_attr;
【成员】
增益表精度控制参数。当选择的精度较低时(比如mesh_scale为3),画面衰减幅度大,可能会出现格子现象,可以提高精度(比如2或7)重新标定。 |
|
x_grid_width [OT_ISP_MLSC_X_HALF_GRID_NUM] |
用来储存各GRID分区宽度大小信息。该接口各分量最小值为4,总和应为原画面宽度的四分之一。(例如原画面大小为1080p,则该接口各参数总和应为480) |
y_grid_width[OT_ISP_MLSC_Y_HALF_GRID_NUM] |
用来储存各GRID分区高度大小信息。该接口各分量最小值为4,总和应为原画面高度的四分之一。(例如原画面大小为1080p,则该接口各参数总和应为270) |
lsc_gain_lut[OT_ISP_MLSC_GAIN_LUT_NUM] |
【注意事项】
- 调整x_grid_width或y_grid_width里的值即调整分区宽度或者高度。注意由于整体画面为上下、左右对称,因此每当设置一个分区的宽度或者高度时,其对称分区的宽度或高度也会相应发生变化。改变后的分区宽度与高度请满足总和为原画面大小宽度或高度的四分之一。由于调节比较复杂并容易造成Color Shading现象,一般不建议手动调节。分辨率切换的时候,当ot_isp_cmos_alg_key接口中bit1_lsc使能,用户需在sensor初始化文件中配置变分辨率后的x_grid_width与y_grid_width,否则可能出现图像异常;当bit1_lsc不使能,x_grid_width与y_grid_width自动重新配置。
- 建议分辨率切换完成后再开启lsc使能,否则应及时配置变分辨率后的lsc_gain_lut。
- 由于x_grid_width或y_grid_width的最小值为4,Hi3519DV500的Mesh Shading所支持的最小分辨率为256x256,Hi3516CV610的Mesh Shading所支持的最小分辨率为256x144。
- 硬件基于配置的两组色温下的增益表以及blend_ratio进行插值得到当前色温下的校正增益表的计算,从而校正整幅图像的shading现象,其中blend_ratio为lsc_gain_lut[0]对应的权重。
- 在单光源模式下,lsc_gain_lut结构体需要配置成一致,此时需要配置成标定的第一个光源。
-
增益位宽为10bit,即最大值为1023。
- 当mesh_scale为0至3时,增益的表示与其他算法一致,增益精度从高到低,取值范围从小变大,1倍增益不为0;
- 当mesh_scale为4至7时,精度从高到低,取值范围从小变大,增益的表示方式略有差异,实际的增益计算方式为通用增益减去对应精度的1倍增益,比如mesh_scale为5时,按照增益精度为1.9,若通用增益为886,1倍对应增益512,那么实际的增益为886-512=374,这种表示方式下,最小的增益为1倍,但是表示的范围比上一种要大。
-
在能够完全校正的情况下,增益精度mesh_scale应该尽量选择精度高的档位,提高校正的准确度,例如当mesh_scale为0或4时都能校正,应当选择4。对于某些镜头阴影特别严重的极端情况下,存在无法完全校正的可能,当选择较大增益倍数(如mesh_scale为3)校正时,可能会在边缘处出现暗条纹,此时需要降低增益倍数来提高精度(设mesh_scale为 2或7),重新标定,直到暗条纹消失为止。
表 1 mesh_scale与增益精度对应关系
【相关数据类型及接口】
Defect Pixel
功能描述
DPC算法通过在5x5的窗口中通过某些坏点检测算法找到该窗口中明显异于临近像素的坏点。该模块主要包含以下两种模式:
-
静态坏点标定/校正有两种流程:亮点和暗点流程
- 在亮点流程中,光圈处于关闭状态,启动坏点标定程序,得到坏点坐标信息。坏点个数的总数由坏点校正模块的memory决定的。得到的坏点通过临近像素的中值滤波进行校正。
-
在暗点流程中,光圈处于正常打开状态,要求平坦背景,最好使用灰度箱固定光源,图像整体平均亮度大约为最大亮度50%,或Bayer格式中B通道亮度为最大亮度20%左右,启动坏点检测程序,得到坏点坐标。坏点个数的总数是由坏点校正模块的memory决定的。得到的坏点通过临近像素的中值滤波进行校正。
注意:Hi3519DV500 DPC所能支持的最大静态坏点数为6144。
-
动态坏点检测/校正
在这种模式中,校正模块使用动态检测方法的进行坏点检测,能够校正的坏点个数是没有限制的。这种模式总体上相对于静态模式更不可靠,但是在低照度情况下强烈推荐使用动态坏点校正功能,可以校正更多的坏点以及明显改善图像偏色的问题。
API参考
- ss_mpi_isp_set_dp_calibrate:设置静态坏点标定参数。
- ss_mpi_isp_get_dp_calibrate:获取静态坏点标定结果。
- ss_mpi_isp_set_dp_static_attr:设置静态坏点校正属性。
- ss_mpi_isp_get_dp_static_attr:获取静态坏点校正属性。
- ss_mpi_isp_set_dp_dynamic_attr:设置动态坏点校正属性。
- ss_mpi_isp_get_dp_dynamic_attr:获取动态坏点校正属性。
ss_mpi_isp_set_dp_calibrate
【描述】
设置静态坏点标定参数。
【语法】
td_s32 ss_mpi_isp_set_dp_calibrate(ot_vi_pipe vi_pipe, const ot_isp_dp_static_calibrate *dp_calibrate);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
- 该接口为静态坏点标定接口,坏点标定只需启动一次,标定完成之后自动关闭标定使能,恢复为正常的坏点校正模式。亮坏点检测的环境为:使用最小的模拟增益和数字增益,降帧率到5~6fps,使曝光时间为200ms(系统自动完成),遮黑镜头或关闭光圈(需手动操作);暗坏点检测的环境为:光圈处于正常打开状态,要求平坦背景,最好使用辉度箱固定光源,图像整体平均亮度大约为最大亮度50%,或Bayer格式中B通道亮度为最大亮度20%左右。
- 支持WDR模式下静态坏点标定。WDR模式下默认选择短帧进行静态坏点标定,推荐在标定前,通过ss_mpi_isp_set_module_ctrl接口的bit2_chn_select变量选择长帧,再启动静态坏点标定。一般情况下,长帧的标定即可满足需求。若特殊情况下,长帧标定后仍然有坏点残留,可通过bit2_chn_select变量选择中/短帧再次进行标定,并将多个坏点表合并成一个表。
- WDR模式下启动静态坏点标定时,ISP会自动关闭BNR, DRC模块,以避免最大性能场景DPC标定异常。标定完成后,ISP恢复BNR, DRC模块默认配置。ISP关闭BNR, DRC模块会影响标定过程中输出图像的亮度和噪声,不影响标定结果。
- 拼接模式不支持静态坏点标定。
- Hi3516CV610不支持。
【举例】
以标定亮点为例:
ot_isp_dp_static_calibrate dpc_calib;
dpc_calib.enable_detect = 1; /* 使能静态坏点标定 */
dpc_calib.static_dp_type = 0;
dpc_calib.count_max = 1024;
dpc_calib.count_min = 1;
dpc_calib.start_thresh = 1;
dpc_calib.time_limit = 0x640;
ss_mpi_isp_set_dp_calibrate(vi_pipe, &dpc_calib);
【相关主题】
ss_mpi_isp_get_dp_calibrate
【描述】
获取静态坏点标定结果。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
Hi3516CV610不支持。
【举例】
以获取亮点标定结果为例:
td_u16 i;
td_u16 bright_bp_num = 0;
td_u32 bright_table[SS_MPI_STATIC_DP_COUNT_MAX];
ss_mpi_isp_get_dp_calibrate(vi_pipe, &dpc_calib);
while(dpc_calib.status == OT_ISP_STATE_INIT) {
sleep(1);
ss_mpi_isp_get_dp_calibrate(vi_pipe, &dpc_calib);
}
bright_bp_num = dpc_calib.count;
for (i = 0; i < bright_bp_num; i++) {
bright_table[i] = dpc_calib.table[i];
}
【相关主题】
ss_mpi_isp_set_dp_static_attr
【描述】
设置静态坏点属性,合并坏点表,将坏点坐标信息与坏点数目写入系统内存。
【语法】
td_s32 ss_mpi_isp_set_dp_static_attr(ot_vi_pipe vi_pipe, const ot_isp_dp_static_attr *dp_static_attr);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
- 每一路ISP BE所能支持的最大静态坏点个数为OT_ISP_STATIC_DP_COUNT_NORMAL(在Hi3519DV500中,OT_ISP_STATIC_DP_COUNT_NORMAL = 2048),因此DPC模块所能支持的最大静态坏点个数为count = OT_ISP_STATIC_DP_COUNT_NORMAL * (当前业务场景下ISP BE的分块数目)。则亮点数目bright_count <= count且dark_count <= count,若亮点表和暗点表中有same个重复的坏点,则bright_count + dark_count – same < =count。ISP BE的分块数目参考Proc 调试信息说明中的” block_num”。
- Hi3516CV610不支持。
【举例】
ot_isp_dp_static_attr dpc_static_attr;
dpc_static_attr.bright_count = bright_bp_number;
dpc_static_attr.dark_count = dark_bp_number;
for (i = 0; i < bright_bp_number; i++) {
dpc_static_attr.bright_table[i] = bright_table [i];
}
for (i = 0; i < dark_bp_number; i++) {
dpc_static_attr.dark_table[i] = dark_table [i];
}
ss_mpi_isp_set_dp_static_attr (vi_pipe,& dpc_static_attr);
【相关主题】
ss_mpi_isp_get_dp_static_attr
【描述】
获取静态坏点属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
- 在设置静态坏点属性中,亮点坏点表中表示亮坏点坐标信息,暗坏点表中则保存的是暗坏点坐标信息;而获取静态坏点属性时,亮点坏点表中保存的是所有坏点的坐标信息。
- Hi3516CV610不支持。
【举例】
td_u16 bp_number = 0;
td_u32 bp_table[OT_ISP_STATIC_DP_COUNT_MAX];
ss_mpi_isp_get_dp_static_attr (vi_pipe, dp_static_attr);
bp_number = dp_static_attr.bright_count;
for (i = 0; i < bp_number; i++) {
bp_table[i] = dp_static_attr.bright_table[i];
}
【相关主题】
ss_mpi_isp_set_dp_dynamic_attr
【描述】
设置动态坏点调试属性。
【语法】
td_s32 ss_mpi_isp_set_dp_dynamic_attr (ot_vi_pipe vi_pipe, const ot_isp_dp_dynamic_attr *dp_dynamic_attr);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
ss_mpi_isp_get_dp_dynamic_attr
ss_mpi_isp_get_dp_dynamic_attr
【描述】
获取动态坏点调试属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
ss_mpi_isp_set_dp_dynamic_attr
数据类型
- OT_ISP_STATIC_DP_COUNT_MAX:DPC支持的最大静态坏点个数
- ot_isp_static_dp_type:静态坏点标定类型。
- ot_isp_status:ISP校正(检测)状态。
- ot_isp_dp_static_calibrate:静态坏点标定属性。
- ot_isp_dp_static_attr:静态坏点校正属性。
- ot_isp_dp_dynamic_manual_attr:定义动态坏点校正的手动属性。
- ot_isp_dp_dynamic_auto_attr:定义动态坏点校正的自动属性。
- ot_isp_dp_frame_dynamic_attr:定义动态坏点校正属性。
- ot_isp_dp_dynamic_attr:定义动态坏点校正属性。
OT_ISP_STATIC_DP_COUNT_MAX
【说明】
DPC支持的最大静态坏点个数。
【定义】
#define OT_ISP_STATIC_DP_COUNT_NORMAL 2048
#define OT_ISP_STATIC_DP_COUNT_MAX (OT_ISP_STATIC_DP_COUNT_NORMAL * OT_ISP_STRIPING_MAX_NUM)
【注意事项】
Hi3516CV610不支持。
【相关数据类型及接口】
ot_isp_static_dp_type
【说明】
定义静态坏点标定类型。
【定义】
typedef enum {
OT_ISP_STATIC_DP_BRIGHT = 0x0,
OT_ISP_STATIC_DP_DARK,
OT_ISP_STATIC_DP_BUTT
} ot_isp_static_dp_type;
【成员】
【注意事项】
Hi3516CV610不支持。
【相关数据类型及接口】
ot_isp_status
【说明】
定义ISP校正(检测)状态。
【定义】
typedef enum {
OT_ISP_STATE_INIT = 0,
OT_ISP_STATE_SUCCESS = 1,
OT_ISP_STATE_TIMEOUT = 2,
OT_ISP_STATE_BUTT
} ot_isp_status;
【成员】
【注意事项】
- 只读。
- Hi3516CV610不支持。
【相关数据类型及接口】
ot_isp_dp_static_calibrate
【说明】
定义静态坏点标定的属性。
【定义】
typedef struct {
td_bool enable_detect;
ot_isp_static_dp_type static_dp_type;
td_u8 start_thresh;
td_u16 count_max;
td_u16 count_min;
td_u16 time_limit;
td_u32 table[OT_ISP_STATIC_DP_COUNT_MAX];
td_u8 finish_thresh;
td_u16 count;
ot_isp_status status;
} ot_isp_dp_static_calibrate;
【成员】
|
取值范围:(0, OT_ISP_STATIC_DP_COUNT_MAX],默认值0x400。 |
|
只读,亮暗坏点坐标值查找表,低29bit有效,bit[12:0]为坏点的水平坐标,bit[28:16]为坏点的垂直坐标。 |
|
|
取值范围:[0, OT_ISP_STATIC_DP_COUNT_MAX],默认值0。 |
|
【注意事项】
- count_max的配置值与当前的业务场景有关系。每一路ISP BE所能支持的静态坏点个数为OT_ISP_STATIC_DP_COUNT_NORMAL,则count_max的最大值为OT_ISP_STATIC_DP_COUNT_NORMAL * (当前业务场景下ISP BE的分块数目),ISP BE的分块数目参考Proc 调试信息说明中的 "block_num”。
- 坏点检测算法检测成功的标准:检测出的坏点数量是否在[count_min, count_max)。所以不同类型的sensor在做坏点检测时需微调这两个值。
- 系统支持的坏点个数上限是OT_ISP_STATIC_DP_COUNT_MAX。当sensor坏点个数大于OT_ISP_STATIC_DP_COUNT_MAX, 系统反馈坏点个数等于OT_ISP_STATIC_DP_COUNT_MAX。因此,坏点个数等于OT_ISP_STATIC_DP_COUNT_MAX不能反映当前实际坏点检况。
- finish_thresh只作为输出。针对同类型的sensor,参考finish_thresh值,设置合理的start_thresh,能加快静态坏点校正过程。
- 每次调用标定接口ss_mpi_isp_set_dp_calibrate时,算法内部会自动将status恢复为OT_ISP_STATE_INIT状态。
- 标定亮坏点时,推荐降帧,亮坏点超时时间近似等于time_limit/8秒。标定暗坏点时,不做降帧动作,暗坏点超时时间近似等于time_limit/48秒。
- Hi3516CV610不支持。
【相关数据类型及接口】
ot_isp_dp_static_attr
【说明】
定义静态坏点校正属性。
【定义】
typedef struct {
td_bool enable;
td_u16 bright_count;
td_u16 dark_count;
td_u32 bright_table[OT_ISP_STATIC_DP_COUNT_MAX];
td_u32 dark_table[OT_ISP_STATIC_DP_COUNT_MAX];
td_bool show;
} ot_isp_dp_static_attr;
【成员】
|
注意:当该变量作为输入时,表示亮坏点的个数;作为输出时,表示总的坏点个数。 取值范围:[0, OT_ISP_STATIC_DP_COUNT_MAX],默认值0。 |
|
|
注意:当该变量作为输入时,表示暗坏点的个数;作为输出时,无效值0。 取值范围:[0, OT_ISP_STATIC_DP_COUNT_MAX],默认值0。 |
|
亮坏点坐标信息,低29bit有效,bit[12:0]为坏点水平坐标,bit[28:16]为坏点垂直坐标。 |
|
暗的坏点坐标值,低29bit有效,bit[12:0]为坏点水平坐标,bit[28:16]为坏点垂直坐标。 |
|
【注意事项】
- enable_detect、show与enable是3个互斥的设置,并且对应的优先级是逐次降低的。
- Hi3516CV610不支持。
【相关数据类型及接口】
无。
ot_isp_dp_dynamic_manual_attr
【说明】
定义动态坏点校正的手动属性。
【定义】
【成员】
【注意事项】
- strength的选择与ISO值有很大的关系,ISO越高,对应的strength应该越大,在图像中坏点校正较好时,图像中偏红严重,此时可以再调节blend_ratio 改善图像质量。
- blend_ratio 值越大,图像越模糊。
【相关数据类型及接口】
ot_isp_dp_dynamic_auto_attr
【说明】
定义动态坏点校正的自动属性。
【定义】
typedef struct {
td_u8 strength[OT_ISP_AUTO_ISO_NUM];
td_u8 blend_ratio[OT_ISP_AUTO_ISO_NUM];
} ot_isp_dp_dynamic_auto_attr;
【成员】
strength [OT_ISP_AUTO_ISO_NUM] |
自动模式下的DPC的处理强度,该数组与iso联动。,一般情况下,iso越大,配置的DPC处理强度越大,对应关系如表1所示。 |
blend_ratio [OT_ISP_AUTO_ISO_NUM] |
表 1 strength[16]在不同增益情况下对应的设置值
【注意事项】
- 该结构体中的默认值均在sensor_cmos.c中,如果用户需要修改默认值,请修改相应参数。如果用户需要对接新的sensor,请参考已经提供的其它sensor的默认值。
- 在WDR模式与线性模式之下,Again*Dgain*ISPDgain没有差异。
【相关数据类型及接口】
ot_isp_dp_frame_dynamic_attr
【说明】
定义动态坏点校正属性。
【定义】
typedef struct {
td_bool sup_twinkle_en;
td_s8 soft_thr;
td_u8 soft_slope;
ot_op_mode op_type;
ot_isp_dp_dynamic_manual_attr manual_attr;
ot_isp_dp_dynamic_auto_attr auto_attr;
td_u8 bright_strength;
td_u8 dark_strength;
} ot_isp_dp_frame_dynamic_attr;
【成员】
【注意事项】
- 闪烁抑制功能与strength存在联动关系,soft_thr和soft_slope取值不合理时,调节strength,有可能在strength的某些档位之间存在校正效果的突变,因此建议在保证soft_thr和soft_slope的配置值不明显影响图像的清晰度的前提下,调节strength,看坏点的校正以及闪烁抑制的效果。
- soft_slope参数设置过大,图像会模糊,同时可能会出现伪彩等副作用,因此soft_slope应设置为不明显影响图像清晰度的参数。
- strength和blend_ratio参数设置过大,图像会模糊,同时可能出现伪彩等副作用。
- bright_strength主要影响亮区效果,对暗区有轻微影响。dark_strength主要影响暗区效果,对亮区有轻微影响。
- WDR模式下建议调整bright_strength和dark_strength参数以优化图像效果。
- bright_strength,dark_strength 大于64时,去坏点能力增强,小于64时,去坏点能力减弱;
- 建议bright_strength参数调小,改善亮区细节;
- 建议dark_strength参数调大,改善暗区坏点残留情况。
【相关数据类型及接口】
ot_isp_dp_dynamic_attr
【说明】
定义长短帧动态坏点校正属性。
【定义】
typedef struct {
td_bool enable;
ot_isp_dp_frame_dynamic_attr frame_dynamic[OT_ISP_WDR_MAX_FRAME_NUM];
} ot_isp_dp_dynamic_attr;
【成员】
【注意事项】
- 线性模式下,仅frame_dynamic[0] 有效;WDR模式下,frame_dynamic[0]对应短帧,frame_dynamic[1]对应长帧
- Hi3516CV610中frame_dynamic数组仅首元素有效。
【相关数据类型及接口】
Crosstalk Removal
概述
Crosstalk Removal模块的主要功能是为了平衡raw数据上临近像素Gr和Gb之间的差异,能够有效防止demosaic插值算法产生的方格或其他类似pattern。由于sensor可能会因为特殊角度的光线入射而产生Crosstalk,形成一些pattern,根本原因就是因为临近像素值之间Gr和Gb值域不一致。
功能描述
如Bild 1所示,横坐标表示Gr与Gb之间的差值,即|Gr-Gb|,纵坐标表示处理的强度值。图中的Threshold,slope与参数中的threshold,slope不完全对应,只是算法的大致示意。
- 当Gr与Gb之间的差值小于Threshold值时,都按照最大的强度值0.5进行处理,Threshold值越大,图像整体被处理的强度越大;
- 当Gr与Gb之间的差值大于Threshold值时,由slope控制处理的强度,当slope值越大,整体处理强度衰减得越慢,也就是处理的强度越大。

API参考
- ss_mpi_isp_set_crosstalk_attr:设定Crosstalk 属性。
- ss_mpi_isp_get_crosstalk_attr:获取Crosstalk 属性。
ss_mpi_isp_set_crosstalk_attr
【描述】
设定Crosstalk 属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a, libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
ss_mpi_isp_get_crosstalk_attr
【描述】
获取Crosstalk 属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a, libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
数据类型
ot_isp_cr_attr
【说明】
定义ISP Crosstalk 属性。
【定义】
typedef struct {
td_bool enable;
td_u8 slope;
td_u8 sensi_slope;
td_u16 sensi_threshold;
td_u16 strength[OT_ISP_AUTO_ISO_NUM];
td_u16 threshold[OT_ISP_AUTO_ISO_NUM];
td_u8 filter_mode[OT_ISP_AUTO_ISO_NUM];
td_u16 np_offset[OT_ISP_AUTO_ISO_NUM];
} ot_isp_cr_attr;
【成员】
strength[OT_ISP_AUTO_ISO_NUM] |
|
threshold[OT_ISP_AUTO_ISO_NUM] |
|
filter_mode[OT_ISP_AUTO_ISO_NUM] |
Crosstalk处理中的滤波模式,值越大,滤波效果越强,清晰度略微降低。取值范围:[0,31],默认值0。 Hi3516CV610不支持。 |
np_offset[OT_ISP_AUTO_ISO_NUM] |
表 1 strength [OT_ISP_AUTO_ISO_NUM]在不同的增益情况下的设置值
【注意事项】
- sensi_threshold参数变化会影响threshold参数的表现,建议先调节sensi_threshold使之固定,再调节threshold。
- 各参数请在默认值附近微调,调试不当可能会在边缘或细节处出现伪彩,或使其变模糊。
- 不支持RGBIR Pattern的Crosstalk功能。使能RGBIR,Crosstalk功能会自动关闭,相关参数调节无效。
【相关数据类型及接口】
无。
去噪算法
功能描述
图像去噪是数字图像处理中的重要环节和步骤,去噪效果将对后续图像处理产生影响。该去噪模块基于噪声标定结果,建立更符合噪声特性的去噪模型,且可根据不同sensor做标定模型定制化。NR在Bayer域进行空域去噪处理和时域去噪处理。利用动静检测机制,对图像分前景和背景分别处理,来抑制噪声,提高整体图像信噪比。
说明:
Hi3516CV610除原有的ISP_MD_MODE模式外,现新增ISP_PURE_TNR_MODE、ISP_3DNR_MODE两种模式,纯静止场景下推荐PURE_TNR_MODE,load_ref_en实现快速收敛;带运动场景下推荐3DNR_MODE。其对内存要求如下:
- 首次运行ISP_PURE_TNR_MODE且load_ref_en = Enable
- 当再次运行MD模式时,多占用1帧大小的MMZ;
- 当再次运行3DNR模式时,多占用2帧大小的MMZ;
- 当再次运行PURE_TNR模式时,多占用1帧大小的MMZ。
- 首次运行ISP_PURE_TNR_MODE且load_ref_en = Disable
- 当再次运行3DNR模式时,多占用1帧大小的MMZ;
- 当再次运行PURE_TNR模式时,多占用1帧大小的MMZ。 Hi3516CV610 ISP_MD_MODE 模式不支持时域去噪。 注意:PURE_TNR/3DNR_MODE下,当前仅支持非分块模式,另外,若MMZ不足,可能导致切换失败,效果异常。
API参考
- ss_mpi_isp_set_nr_attr:设置NR参数。
- ss_mpi_isp_get_nr_attr:获取NR参数。
ss_mpi_isp_set_nr_attr
【描述】
设置NR参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
ss_mpi_isp_get_nr_attr
【描述】
获取NR参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
数据类型
- OT_ISP_BAYERNR_LUT_LENGTH:定义nr亮度回叠表长度。
- ot_isp_nr_snr_attr_v0:定义ISP NR空域V0属性。
- ot_isp_nr_snr_attr:定义ISP NR空域属性。
- ot_isp_nr_tnr_attr:定义ISP NR时域属性。
- ot_isp_nr_snr_manual_attr:定义ISP NR空域手动属性。
- ot_isp_nr_snr_auto_attr:定义ISP NR空域自动属性。
- ot_isp_nr_tnr_manual_attr:定义ISP NR时域手动属性。
- ot_isp_nr_tnr_auto_attr:定义ISP NR时域自动属性。
- ot_isp_nr_wdr_attr:定义ISP NR在WDR模式下属性。
- ot_isp_nr_attr:定义ISP NR属性。
- ot_isp_nr_dering_attr:定义ISP NR在DERING模式下属性。
- ot_isp_nr_dering_auto_attr: 定义ISP NR在DERING模式下自动属性。
- ot_isp_nr_dering_manual_attr:定义ISP NR在DERING模式下手动属性。
- OT_ISP_BAYERNR_DENOISE_Y_LUT_NUM:定义ynet模块表长。
- OT_ISP_BAYERNR_LUT_LENGTH1:定义NR亮度融合表长度。
- ot_nr_snr_mode:定义ISP NR空域模式。
- ot_isp_nr_md_attr:定义ISP NR运动检测属性。
- ot_isp_nr_md_manual_attr:定义ISP NR运动检测手动属性。
- ot_isp_nr_md_auto_attr:定义ISP NR运动检测自动属性。
- ot_isp_bnr_ref_mode:定义ISP NR三种模式。
OT_ISP_BAYERNR_LUT_LENGTH
【说明】
定义nr亮度回叠表长度。
【定义】
【注意事项】
Hi3516CV610不支持。
【相关数据类型及接口】
OT_ISP_BAYERNR_DENOISE_Y_LUT_NUM
ot_isp_nr_snr_attr_v0
【说明】
定义ISP NR空域V0属性。
【定义】
typedef struct {
ot_isp_nr_snr_auto_attr snr_auto;
ot_isp_nr_snr_manual_attr snr_manual;
} ot_isp_nr_snr_attr_v0;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_nr_snr_attr
【说明】
定义ISP NR空域属性。
【定义】
typedef struct {
ot_nr_snr_mode snr_version;
union {
ot_isp_nr_snr_attr_v0 snr_attr;
};
} ot_isp_nr_snr_attr;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_nr_tnr_attr
【说明】
定义ISP NR时域属性。
【定义】
typedef struct {
ot_isp_nr_tnr_auto_attr tnr_auto;
ot_isp_nr_tnr_manual_attr tnr_manual;
} ot_isp_nr_tnr_attr;
【成员】
【注意事项】
Hi3516CV610不支持。
【相关数据类型及接口】
ot_isp_nr_snr_manual_attr
【说明】
定义ISP NR空域手动属性。
【定义】
typedef struct {
td_u16 sfm0_coarse_strength[OT_ISP_BAYER_CHN_NUM];
td_u8 sfm0_detail_prot;
td_u16 sfm1_strength;
td_u8 sfm1_adp_strength;
td_u8 sfm6_strength;
td_u8 sfm7_strength;
td_u8 sth;
td_u8 tss;
td_u8 fine_strength;
td_u16 coring_wgt;
td_u8 coring_mot_ratio;
td_u8 noisesd_lut[OT_ISP_BAYERNR_LUT_LENGTH1];
} ot_isp_nr_snr_manual_attr;
【成员】
sfm0_coarse_strength[OT_ISP_BAYER_CHN_NUM] |
|
sfm1 滤波强度自适应调节,主要用于去除冲击噪声。取值为16时,滤波强度由算法内部自适应生成;,取值为0时,由sfm1_strength参数控制,值越小,sfm1_strength的强度比例越高。取值范围:[0, 16] |
|
线性模式下,sfm6混合滤波结果。取值0为sfm1滤波结果,平坦区去噪能力较弱,同时边缘保边能力弱;取值64为sfm0滤波结果,平坦区去噪能力较强,同时边缘保边能力强,其它值为两者融合。取值范围:[0, 64] |
|
线性模式下,sfm7混合滤波结果。取值0为sfm1滤波结果,平坦区去噪能力较弱,同时边缘保边能力弱;取值64为sfm0滤波结果,平坦区去噪能力较强,同时边缘保边能力强,其它值为两者融合。取值范围:[0, 64] |
|
混合滤波器阈值。取值0倾向于sfm6混合滤波器结果,取值255倾向于sfm7混合滤波器结果,其它值为两者滤波结果融合。取值范围:[0, 255] |
|
noisesd_lut[OT_ISP_BAYERNR_LUT_LENGTH1] |
【注意事项】
- 注意各参数的取值范围。
- 低照度下,参数sfm0_coarse_strength 与 fine_strength 同时调到最大值时,容易出现由于去噪强度过大导致的边缘虚化,建议根据效果调到合适取值。
- noisesd_lut当前版本暂不支持wdr模式,且线性模式下仅在user_define_md = 2生效。
【相关数据类型及接口】
ot_isp_nr_snr_auto_attr
【说明】
定义ISP NR空域自动属性。
【定义】
typedef struct {
td_u16 sfm0_coarse_strength[OT_ISP_BAYER_CHN_NUM][OT_ISP_AUTO_ISO_NUM];
td_u8 sfm0_detail_prot[OT_ISP_AUTO_ISO_NUM];
td_u16 sfm1_strength[OT_ISP_AUTO_ISO_NUM];
td_u8 sfm1_adp_strength[OT_ISP_AUTO_ISO_NUM];
td_u8 sfm6_strength[OT_ISP_AUTO_ISO_NUM];
td_u8 sfm7_strength[OT_ISP_AUTO_ISO_NUM];
td_u8 sth[OT_ISP_AUTO_ISO_NUM];
td_u8 tss[OT_ISP_AUTO_ISO_NUM];
td_u8 fine_strength[OT_ISP_AUTO_ISO_NUM];
td_u16 coring_wgt[OT_ISP_AUTO_ISO_NUM];
td_u8 coring_mot_ratio[OT_ISP_AUTO_ISO_NUM];
td_u8 noisesd_lut[OT_ISP_BAYERNR_LUT_LENGTH1][OT_ISP_AUTO_ISO_NUM];
} ot_isp_nr_snr_auto_attr;
【成员】
sfm0_coarse_strength[OT_ISP_BAYER_CHN_NUM[OT_ISP_AUTO_ISO_NUM] |
|
sfm0_detail_prot[OT_ISP_AUTO_ISO_NUM] |
|
sfm1_strength[OT_ISP_AUTO_ISO_NUM] |
|
sfm1_adp_strength[OT_ISP_AUTO_ISO_NUM] |
sfm1 滤波强度自适应调节,主要用于去除冲击噪声。取值为16时,滤波强度由算法内部自适应生成;,取值为0时,由sfm1_strength参数控制,值越小,sfm1_strength的强度比例越高。取值范围:[0, 16] |
sfm6_strength[OT_ISP_AUTO_ISO_NUM] |
线性模式下,sfm6混合滤波结果。取值0为sfm1滤波结果,平坦区去噪能力较弱,同时边缘保边能力弱;取值64为sfm0滤波结果,平坦区去噪能力较强,同时边缘保边能力强,其它值为两者融合。取值范围:[0, 64] |
sfm7_strength[OT_ISP_AUTO_ISO_NUM] |
线性模式下,sfm7混合滤波结果。取值0为sfm1滤波结果,平坦区去噪能力较弱,同时边缘保边能力弱;取值64为sfm0滤波结果,平坦区去噪能力较强,同时边缘保边能力强,其它值为两者融合。取值范围:[0, 64] |
sth[OT_ISP_AUTO_ISO_NUM] |
混合滤波器阈值。取值0倾向于sfm6混合滤波器结果,取值255倾向于sfm7混合滤波器结果,其它值为两者滤波结果融合。取值范围:[0, 255] |
tss[OT_ISP_AUTO_ISO_NUM] |
|
fine_strength[OT_ISP_AUTO_ISO_NUM] |
|
coring_wgt[OT_ISP_AUTO_ISO_NUM] |
|
coring_mot_ratio[OT_ISP_AUTO_ISO_NUM] |
|
noisesd_lut[OT_ISP_BAYERNR_LUT_LENGTH1][OT_ISP_AUTO_ISO_NUM] |
【注意事项】
- 注意各参数的取值范围。
- 低照度下,参数sfm0_coarse_strength 与 fine_strength 同时调到最大值时,容易出现由于去噪强度过大导致的边缘虚化,建议根据效果调到合适取值。
- noisesd_lut当前版本暂不支持wdr模式,且线性模式下仅在user_define_md = 2生效。
【相关数据类型及接口】
ot_isp_nr_tnr_manual_attr
【说明】
定义ISP NR时域手动属性。
【定义】
typedef struct {
td_u8 md_mode;
td_u8 md_size_ratio;
td_u8 md_anti_flicker_strength;
td_u8 md_static_ratio;
td_u8 md_motion_ratio;
td_u8 md_static_fine_strength;
td_u8 tfs;
td_bool user_define_md;
td_s16 user_define_slope;
td_u16 user_define_dark_thresh;
td_u8 user_define_color_thresh;
td_u8 sfr_r;
td_u8 sfr_g;
td_u8 sfr_b;
} ot_isp_nr_tnr_manual_attr;
【成员】
【注意事项】
- 注意各参数的取值范围。
- Hi3516CV610不支持。
【相关数据类型及接口】
ot_isp_nr_tnr_auto_attr
【说明】
定义ISP NR时域自动属性。
【定义】
typedef struct {
td_u8 md_mode [OT_ISP_AUTO_ISO_NUM];
td_u8 md_size_ratio [OT_ISP_AUTO_ISO_NUM];
td_u8 md_anti_flicker_strength [OT_ISP_AUTO_ISO_NUM];
td_u8 md_static_ratio [OT_ISP_AUTO_ISO_NUM];
td_u8 md_motion_ratio [OT_ISP_AUTO_ISO_NUM];
td_u8 md_static_fine_strength [OT_ISP_AUTO_ISO_NUM];
td_u8 tfs [OT_ISP_AUTO_ISO_NUM];
td_bool user_define_md [OT_ISP_AUTO_ISO_NUM];
td_s16 user_define_slope [OT_ISP_AUTO_ISO_NUM];
td_u16 user_define_dark_thresh [OT_ISP_AUTO_ISO_NUM];
td_u8 user_define_color_thresh [OT_ISP_AUTO_ISO_NUM];
td_u8 sfr_r [OT_ISP_AUTO_ISO_NUM];
td_u8 sfr_g [OT_ISP_AUTO_ISO_NUM];
td_u8 sfr_b [OT_ISP_AUTO_ISO_NUM];
} ot_isp_nr_tnr_auto_attr;
【成员】
md_mode[OT_ISP_AUTO_ISO_NUM] |
|
md_size_ratio[OT_ISP_AUTO_ISO_NUM] |
|
md_anti_flicker_strength[OT_ISP_AUTO_ISO_NUM] |
|
md_static_ratio[OT_ISP_AUTO_ISO_NUM] |
|
md_motion_ratio[OT_ISP_AUTO_ISO_NUM] |
|
md_static_fine_strength[OT_ISP_AUTO_ISO_NUM] |
|
tfs[OT_ISP_AUTO_ISO_NUM] |
|
sfr_r[OT_ISP_AUTO_ISO_NUM] |
|
sfr_g[OT_ISP_AUTO_ISO_NUM] |
|
sfr_b[OT_ISP_AUTO_ISO_NUM] |
|
user_define_md[OT_ISP_AUTO_ISO_NUM] |
|
user_define_slope[OT_ISP_AUTO_ISO_NUM] |
|
user_define_dark_thresh[OT_ISP_AUTO_ISO_NUM] |
|
user_define_color_thresh[OT_ISP_AUTO_ISO_NUM] |
【注意事项】
- 注意各参数的取值范围。
- Hi3516CV610不支持。
【相关数据类型及接口】
ot_isp_nr_wdr_attr
【说明】
定义ISP NR在WDR模式下属性,与自动/手动模式并行。
【定义】
typedef struct {
td_u8 snr_sfm0_wdr_strength[OT_ISP_WDR_MAX_FRAME_NUM];
td_u8 snr_sfm0_fusion_strength[OT_ISP_WDR_MAX_FRAME_NUM];
td_u8 snr_wdr_sfm6_strength[OT_ISP_WDR_MAX_FRAME_NUM];
td_u8 snr_wdr_sfm7_strength[OT_ISP_WDR_MAX_FRAME_NUM];
td_u8 snr_fusion_sfm6_strength[OT_ISP_WDR_MAX_FRAME_NUM];
td_u8 snr_fusion_sfm7_strength[OT_ISP_WDR_MAX_FRAME_NUM];
td_u8 md_wdr_strength[OT_ISP_WDR_MAX_FRAME_NUM];
td_u8 md_fusion_strength[OT_ISP_WDR_MAX_FRAME_NUM];
} ot_isp_nr_wdr_attr;
【成员】
snr_sfm0_wdr_strength[OT_ISP_WDR_MAX_FRAME_NUM] |
|
snr_sfm0_fusion_strength[OT_ISP_WDR_MAX_FRAME_NUM] |
|
snr_wdr_sfm6_strength[OT_ISP_WDR_MAX_FRAME_NUM] |
wdr模式下各区域的sfm6混合滤波结果,取值范围:[0, 64] 0:短帧的sfm6混合滤波器结果,取值0为sfm1滤波结果,平坦区去噪能力较弱,同时边缘保边能力弱;取值64为sfm0滤波结果,平坦区去噪能力较强,同时边缘保边能力强,其它值为两者融合。 1:长帧的sfm6混合滤波器结果,取值0为sfm1滤波结果,平坦区去噪能力较弱,同时边缘保边能力弱;取值64为sfm0滤波结果,平坦区去噪能力较强,同时边缘保边能力强,其它值为两者融合。 |
snr_wdr_sfm7_strength[OT_ISP_WDR_MAX_FRAME_NUM] |
wdr模式下各区域的sfm7混合滤波结果,取值范围:[0,64] 0:短帧的sfm7混合滤波器结果,取值0为sfm1滤波结果,平坦区去噪能力较弱,同时边缘保边能力弱;取值64为sfm0滤波结果,平坦区去噪能力较强,同时边缘保边能力强,其它值为两者融合。 1:长帧的sfm7混合滤波器结果,取值0为sfm1滤波结果,平坦区去噪能力较弱,同时边缘保边能力弱;取值64为sfm0滤波结果,平坦区去噪能力较强,同时边缘保边能力强,其它值为两者融合。 |
snr_fusion_sfm6_strength[OT_ISP_WDR_MAX_FRAME_NUM] |
fusion模式下各区域的sfm6混合滤波结果,取值范围:[0, 64] 0:短帧的sfm6混合滤波器结果,取值0为sfm1滤波结果,平坦区去噪能力较弱,同时边缘保边能力弱;取值64为sfm0滤波结果,平坦区去噪能力较强,同时边缘保边能力强,其它值为两者融合。 1:长帧的sfm6混合滤波器结果,取值0为sfm1滤波结果,平坦区去噪能力较弱,同时边缘保边能力弱;取值64为sfm0滤波结果,平坦区去噪能力较强,同时边缘保边能力强,其它值为两者融合。 |
snr_fusion_sfm7_strength[OT_ISP_WDR_MAX_FRAME_NUM] |
fusion模式下各区域的sfm7混合滤波结果,取值范围:[0, 64] 0:短帧的sfm7混合滤波器结果,取值0为sfm1滤波结果,平坦区去噪能力较弱,同时边缘保边能力弱;取值64为sfm0滤波结果,平坦区去噪能力较强,同时边缘保边能力强,其它值为两者融合。 1:长帧的sfm7混合滤波器结果,取值0为sfm1滤波结果,平坦区去噪能力较弱,同时边缘保边能力弱;取值64为sfm0滤波结果,平坦区去噪能力较强,同时边缘保边能力强,其它值为两者融合。 |
md_wdr_strength[OT_ISP_WDR_MAX_FRAME_NUM] |
|
md_fusion_strength[OT_ISP_WDR_MAX_FRAME_NUM] |
【注意事项】
- ISP NR的WDR相关功能不支持在OT_VI_VIDEO_MODE_ADVANCED模式下使用。
- 注意各参数的取值范围。
【相关数据类型及接口】
ot_isp_nr_attr
【说明】
定义ISP NR属性。
【定义】
typedef struct {
td_bool enable;
ot_op_mode op_type;
union{
td_bool tnr_en;
td_bool md_en;
};
td_bool lsc_nr_en;
td_u8 lsc_ratio1;
td_u16 coring_ratio[OT_ISP_BAYERNR_LUT_LENGTH];
td_u16 mix_gain[OT_ISP_BAYERNR_LUT_LENGTH1];
ot_isp_bnr_ref_mode ref_mode;
td_bool load_ref_en;
ot_isp_nr_snr_attr snr_cfg;
union{
ot_isp_nr_tnr_attr tnr_cfg;
ot_isp_nr_md_attr md_cfg;
};
ot_isp_nr_wdr_attr wdr_cfg;
ot_isp_nr_dering_attr dering_cfg;
} ot_isp_nr_attr;
【成员】
|
|
coring_ratio[OT_ISP_BAYERNR_LUT_LENGTH] |
|
mix_gain[OT_ISP_BAYERNR_LUT_LENGTH1] |
时空域滤波结果融合权重控制表。通过调节各个亮度区间的值控制时空域融合比例,值越小,混入空域滤波结果越多;值越大,混入时域滤波结果越多。取值范围:[0, 128] |
【注意事项】
NR功能分为自动和手动参数:
- enable为TD_TRUE,op_type为OT_OP_MODE_AUTO,使用自动NR功能。
- enable设置为TD_TRUE,op_type设置为OT_OP_MODE_MANUAL使用手动NR功能。
- 当工作在WDR模式下,NR整体去噪强度参数wdr_cfg生效。
- BNR参考LSC去噪功能需要在LSC模块打开下调试,当LSC模块本身关闭时,BNR参考LSC不生效。
- BNR时域打开时,在一些通路模式切换的场景,比如帧率切换,可能会出现时域重新收敛导致的噪声闪烁的现象。
- 固定场景下,load_ref_en可实现再次切回PURE_TNR_MODE模式时的快速收敛,若场景发生较大变化,load_ref_en置0可能导致图像异常。
【相关数据类型及接口】
无。
ot_isp_nr_dering_attr
【说明】
定义ISP dering属性。
【定义】
typedef struct {
ot_isp_nr_dering_auto_attr dering_auto;
ot_isp_nr_dering_manual_attr dering_manual;
} ot_isp_nr_dering_attr;
【成员】
【注意事项】
Hi3516CV610不支持。
【相关数据类型及接口】
ot_isp_nr_dering_auto_attr
【说明】
定义ISP dering自动属性。
【定义】
typedef struct {
td_u16 dering_strength[OT_ISP_AUTO_ISO_NUM];
td_u8 dering_thresh[OT_ISP_AUTO_ISO_NUM];
td_u8 dering_static_strength[OT_ISP_AUTO_ISO_NUM];
td_u8 dering_motion_strength[OT_ISP_AUTO_ISO_NUM];
} ot_isp_nr_dering_auto_attr;
【成员】
dering_strength[OT_ISP_AUTO_ISO_NUM] |
|
dering_thresh[OT_ISP_AUTO_ISO_NUM] |
|
dering_static_strength[OT_ISP_AUTO_ISO_NUM] |
|
dering_motion_strength[OT_ISP_AUTO_ISO_NUM] |
【注意事项】
- tnr_en为TD_FALSE时,不再区分运动静止。
- Hi3516CV610不支持。
【相关数据类型及接口】
ot_isp_nr_dering_manual_attr
【说明】
定义ISP dering手动属性。
【定义】
typedef struct {
td_u16 dering_strength;
td_u8 dering_thresh;
td_u8 dering_static_strength;
td_u8 dering_motion_strength;
} ot_isp_nr_dering_manual_attr;
【成员】
【注意事项】
- tnr_en为TD_FALSE时,不再区分运动静止。
- Hi3516CV610不支持。
【相关数据类型及接口】
OT_ISP_BAYERNR_DENOISE_Y_LUT_NUM
【说明】
定义ynet模块表长。
【定义】
【注意事项】
Hi3516CV610不支持。
【相关数据类型及接口】
OT_ISP_BAYERNR_LUT_LENGTH1
【说明】
定义NR亮度融合表长度。
【定义】
【注意事项】
Hi3516CV610不支持。
【相关数据类型及接口】
ot_nr_snr_mode
【说明】
定义ISP NR空域模式。
【定义】
【注意事项】
Hi3516CV610不支持。
【相关数据类型及接口】
ot_isp_nr_md_attr
【说明】
定义ISP NR运动检测属性。
【定义】
typedef struct {
ot_isp_nr_md_auto_attr md_auto;
ot_isp_nr_md_manual_attr md_manual;
} ot_isp_nr_md_attr;
【成员】
【注意事项】
Hi3519DV500不支持。
【相关数据类型及接口】
ot_isp_nr_md_manual_attr
【说明】
定义ISP NR运动检测手动属性。
【定义】
typedef struct {
td_u8 md_mode;
td_u8 md_size_ratio;
td_u8 md_anti_flicker_strength;
td_u8 md_static_ratio;
td_u8 md_motion_ratio;
td_u8 md_static_fine_strength;
td_u8 tfs;
td_u8 user_define_md;
td_s16 user_define_slope;
td_u16 user_define_dark_thresh;
td_u8 user_define_color_thresh;
td_u8 sfr_r;
td_u8 sfr_g;
td_u8 sfr_b;
} ot_isp_nr_md_manual_attr;
【成员】
【注意事项】
- 注意各参数的取值范围。
- Hi3519DV500不支持。
【相关数据类型及接口】
ot_isp_nr_md_auto_attr
【说明】
定义ISP NR运动检测自动属性。
typedef struct {
td_u8 md_mode [OT_ISP_AUTO_ISO_NUM];
td_u8 md_size_ratio [OT_ISP_AUTO_ISO_NUM];
td_u8 md_anti_flicker_strength [OT_ISP_AUTO_ISO_NUM];
td_u8 md_static_ratio [OT_ISP_AUTO_ISO_NUM];
td_u8 md_motion_ratio [OT_ISP_AUTO_ISO_NUM];
td_u8 md_static_fine_strength [OT_ISP_AUTO_ISO_NUM];
td_u8 tfs [OT_ISP_AUTO_ISO_NUM];
td_u8 user_define_md [OT_ISP_AUTO_ISO_NUM];
td_s16 user_define_slope [OT_ISP_AUTO_ISO_NUM];
td_u16 user_define_dark_thresh [OT_ISP_AUTO_ISO_NUM];
td_u8 user_define_color_thresh [OT_ISP_AUTO_ISO_NUM];
td_u8 sfr_r [OT_ISP_AUTO_ISO_NUM];
td_u8 sfr_g [OT_ISP_AUTO_ISO_NUM];
td_u8 sfr_b [OT_ISP_AUTO_ISO_NUM];
} ot_isp_nr_md_auto_attr;
【成员】
md_mode[OT_ISP_AUTO_ISO_NUM] |
|
md_size_ratio[OT_ISP_AUTO_ISO_NUM] |
|
md_anti_flicker_strength[OT_ISP_AUTO_ISO_NUM] |
|
md_static_ratio[OT_ISP_AUTO_ISO_NUM] |
|
md_motion_ratio[OT_ISP_AUTO_ISO_NUM] |
|
md_static_fine_strength[OT_ISP_AUTO_ISO_NUM] |
|
tfs[OT_ISP_AUTO_ISO_NUM] |
Hi3516CV610 MD_MODE\PURE_TNR_MODE不支持。 |
sfr_r[OT_ISP_AUTO_ISO_NUM] |
R分量的去噪风格倾向,值越大,越倾向于空域效果,值越小,越倾向于原始像素效果。 Hi3516CV610 PURE_TNR_MODE\3DNR_MODE不支持。 分量的去噪风格倾向,值越大,越倾向于空域效果,值越小,越倾向于时域滤波效果。 |
sfr_g[OT_ISP_AUTO_ISO_NUM] |
G分量的去噪风格倾向,值越大,越倾向于空域效果,值越小,越倾向于原始像素效果。 Hi3516CV610 PURE_TNR_MODE\3DNR_MODE不支持。 G分量的去噪风格倾向,值越大,越倾向于空域效果,值越小,越倾向于时域滤波效果。 |
sfr_b[OT_ISP_AUTO_ISO_NUM] |
B分量的去噪风格倾向,值越大,越倾向于空域效果,值越小,越倾向于原始像素效果。 Hi3516CV610 PURE_TNR_MODE\3DNR_MODE不支持。 B分量的去噪风格倾向,值越大,越倾向于空域效果,值越小,越倾向于时域滤波效果。 |
user_define_md[OT_ISP_AUTO_ISO_NUM] |
|
user_define_slope[OT_ISP_AUTO_ISO_NUM] |
|
user_define_dark_thresh[OT_ISP_AUTO_ISO_NUM] |
|
user_define_color_thresh[OT_ISP_AUTO_ISO_NUM] |
【注意事项】
- 注意各参数的取值范围。
- Hi3519DV500不支持。
【相关数据类型及接口】
ot_isp_bnr_ref_mode
【说明】
定义ISP BNR三种模式。
【定义】
typedef enum {
OT_ISP_MD_MODE;
OT_ISP_PURE_TNR_MODE;
OT_ISP_3DNR_MODE;
OT_ISP_BNR_BUTT;
} ot_isp_bnr_ref_mode;
【成员】
【注意事项】
Hi3519DV500不支持。
【相关数据类型及接口】
Dehaze
功能描述
Dehaze是通过动态的改变图象的对比度和亮度来实现的,将图像分块,统计每块内的像素值,估算出雾的浓度,根据局部自适应曲线调整去雾强度。Dehaze分为手动和自动模式,两种模式下均可调节去雾强度。
API参考
- ss_mpi_isp_set_dehaze_attr:设置去雾属性。
- ss_mpi_isp_get_dehaze_attr:获取去雾属性。
ss_mpi_isp_set_dehaze_attr
【描述】
设置Dehaze属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
ss_mpi_isp_get_dehaze_attr
【描述】
获取Dehaze属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
数据类型
- OT_ISP_DEHAZE_LUT_SIZE:定义去雾LUT的大小。
- ot_isp_dehaze_manual_attr:定义去雾手动模式属性。
- ot_isp_dehaze_auto_attr:定义去雾自动模式属性。
- ot_isp_dehaze_attr:定义ISP去雾属性。
OT_ISP_DEHAZE_LUT_SIZE
【说明】
定义去雾LUT的大小。
【定义】
【注意事项】
无。
【相关数据类型及接口】
ot_isp_dehaze_manual_attr
【说明】
定义去雾手动模式属性。
【定义】
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_dehaze_auto_attr
【说明】
定义去雾自动模式属性。
【定义】
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_dehaze_attr
【说明】
定义ISP去雾属性。
【定义】
typedef struct {
td_bool enable;
td_bool user_lut_en;
td_u8 dehaze_lut[OT_ISP_DEHAZE_LUT_SIZE];
ot_op_mode op_type;
ot_isp_dehaze_manual_attr manual_attr;
ot_isp_dehaze_auto_attr auto_attr;
td_u16 tmprflt_incr_coef;
td_u16 tmprflt_decr_coef;
} ot_isp_dehaze_attr;
【成员】
dehaze_lut [OT_ISP_DEHAZE_LUT_SIZE] |
|
【注意事项】
去雾使能后,为了避免画面异常,延迟三帧,图像第四帧生效。
【相关数据类型及接口】
无
去伪彩
功能描述
高频分量在图像插值时易引起高频混叠。用镜头对准一个分辨率测试卡,当sensor表面没有OLPF时,在分辨率的高频部分容易出现伪彩。
去除伪彩主要是指去除高频部分因插值错误所导致的伪彩现象。增大去伪彩强度值会减弱伪彩现象,但可能导致正常的颜色灰度化。
该模块原理是计算出伪彩出现区域及范围,通过可配去伪彩强度寄存器值调整去伪彩强度值,将RGB三个通道值灰度化,从而达到减弱伪彩现象的目的。
API参考
- ss_mpi_isp_set_anti_false_color_attr:设置AntiFalseColor参数。
- ss_mpi_isp_get_anti_false_color_attr:获取AntiFalseColor参数。
ss_mpi_isp_set_anti_false_color_attr
【描述】
设置AntiFalseColor参数。
【语法】
td_s32 ss_mpi_isp_set_anti_false_color_attr(ot_vi_pipe vi_pipe, const ot_isp_anti_false_color_attr *anti_false_color);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
ss_mpi_isp_get_anti_false_color_attr
ss_mpi_isp_get_anti_false_color_attr
【描述】
获取AntiFalseColor参数。
【语法】
td_s32 ss_mpi_isp_get_anti_false_color_attr(ot_vi_pipe vi_pipe, ot_isp_anti_false_color_attr *anti_false_color);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无。
【举例】
无
【相关主题】
ss_mpi_isp_set_anti_false_color_attr
数据类型
- ot_isp_anti_false_color_manual_attr:定义ISP ANTIFALSECOLOR手动属性。
- ot_isp_anti_false_color_auto_attr:定义ISP ANTIFALSECOLOR自动属性。
- ot_isp_anti_false_color_attr:定义ISP ANTIFALSECOLOR属性。
ot_isp_anti_false_color_manual_attr
【说明】
定义ISP ANTIFALSECOLOR手动属性。
【定义】
【成员】
【注意事项】
注意各参数的取值范围。
【相关数据类型及接口】
ot_isp_anti_false_color_auto_attr
【说明】
定义ISP ANTIFALSECOLOR自动属性。
【定义】
typedef struct {
td_u8 threshold[OT_ISP_AUTO_ISO_NUM];
td_u8 strength[OT_ISP_AUTO_ISO_NUM];
} ot_isp_anti_false_color_auto_attr;
【成员】
【注意事项】
注意各参数的取值范围。
【相关数据类型及接口】
ot_isp_anti_false_color_attr
【说明】
定义ISP ANTIFALSECOLOR属性。
【定义】
typedef struct {
td_bool enable;
ot_op_mode op_type;
ot_isp_anti_false_color_manual_attr manual_attr;
ot_isp_anti_false_color_auto_attr auto_attr;
} ot_isp_anti_false_color_attr;
【成员】
【注意事项】
ANTIFALSECOLOR功能分为自动和手动参数:
- enable为TD_TRUE,op_type为OT_OP_MODE_AUTO,使用自动ANTIFALSECOLOR功能。
- enable设置为TD_TRUE,op_type设置为OT_OP_MODE_MANUAL使用手动ANTIFALSECOLOR功能。
【相关数据类型及接口】
无。
去马赛克
功能描述
Demosaic模块实现的功能是:将输入的Bayer数据转化成RGB数据。CFA(Color Filter Array,彩色滤波阵列)得到的Bayer数据,每一像素点只能获得R、G、B三基色中的一种彩色分量值。为获得彩色图像,需要利用当前像素及周围像素的色彩分量值,估计出当前点缺失的其他两个分量值(如图1所示)。
该模块能输出较高的图像分辨率,对弱细节及清晰度有较大提升。

须知:
在处理高频黑白图像时,由于去马赛克模块对输入Bayer CFA数据进行了插值,因此在高频区域容易发生混叠,导致出现打开去马赛克模块高频区域清晰度反而下降的情况,此为正常现象。
API参考
- ss_mpi_isp_set_demosaic_attr:设置Demosaic参数。
- ss_mpi_isp_get_demosaic_attr:获取Demosaic参数。
ss_mpi_isp_set_demosaic_attr
【描述】
设置Demosaic参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
ss_mpi_isp_get_demosaic_attr
【描述】
获取Demosaic参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
数据类型
- ot_isp_demosaic_manual_attr:定义ISP DEMOSAIC手动属性。
- ot_isp_demosaic_auto_attr:定义ISP DEMOSAIC自动属性。
- ot_isp_demosaic_attr:定义ISP DEMOSAIC属性。
ot_isp_demosaic_manual_attr
【说明】
定义ISP DEMOSAIC手动属性。
【定义】
typedef struct {
td_u8 nddm_strength;
td_u8 nddm_mf_detail_strength;
union {
td_u8 nddm_hf_detail_strength;
td_u8 hf_detail_strength;
};
td_u8 detail_smooth_range;
td_u8 color_noise_f_threshold;
td_u8 color_noise_f_strength;
td_u8 color_noise_y_threshold;
td_u8 color_noise_y_strength;
} ot_isp_demosaic_manual_attr;
【成员】
|
|
【注意事项】
- 在红外模式下,或者在CCM饱和度设定成0,输出灰度图的情况下,需要将color_noise_y_threshold 和color_noise_y_strength参数都设定成0,关闭降低颜色噪声的功能。
- 在WDR模式下,相对线性模式,同样的color_noise_y_threshold 和color_noise_y_strength参数,降饱和度程度会减弱。建议在WDR模式下,不使用color_noise_y_threshold 和color_noise_y_strength降低色噪。
- color_noise_f_threshold由于算法采取的是硬钳位方法进行判断是否需要降低饱和度,因此如果这个参数设置的过大,在有一定亮噪的情况下,会出现颜色过渡异常的情况。
【相关数据类型及接口】
ot_isp_demosaic_auto_attr
【说明】
定义ISP DEMOSAIC自动属性。
【定义】
typedef struct {
td_u8 nddm_strength[OT_ISP_AUTO_ISO_NUM];
td_u8 nddm_mf_detail_strength[OT_ISP_AUTO_ISO_NUM];
union {
td_u8 nddm_hf_detail_strength[OT_ISP_AUTO_ISO_NUM];
td_u8 hf_detail_strength[OT_ISP_AUTO_ISO_NUM];
};
td_u8 detail_smooth_range[OT_ISP_AUTO_ISO_NUM];
td_u8 color_noise_f_threshold[OT_ISP_AUTO_ISO_NUM];
td_u8 color_noise_f_strength[OT_ISP_AUTO_ISO_NUM];
td_u8 color_noise_y_threshold[OT_ISP_AUTO_ISO_NUM];
td_u8 color_noise_y_strength[OT_ISP_AUTO_ISO_NUM];
} ot_isp_demosaic_auto_attr;
【成员】
|
|
【注意事项】
注意各参数的取值范围。
【相关数据类型及接口】
ot_isp_demosaic_attr
【说明】
定义ISP DEMOSAIC属性。
【定义】
typedef struct {
td_bool enable;
ot_op_mode op_type;
td_u16 ai_detail_strength;
ot_isp_demosaic_manual_attr manual_attr;
ot_isp_demosaic_auto_attr auto_attr;
} ot_isp_demosaic_attr;
【成员】
|
|
【注意事项】
DEMOSAIC功能分为自动和手动参数:
- enable为TD_TRUE,op_type为OT_OP_MODE_AUTO,使用自动DEMOSAIC功能。
- enable设置为TD_TRUE,op_type设置为OT_OP_MODE_MANUAL使用手动DEMOSAIC功能。
【相关数据类型及接口】
无。
BayerSharpen
功能描述
BayerSharpen模块用于增强图像的弱纹理清晰度,同时还能控制锐化后的图像的overshoot和undershoot,以及抑制噪声的增强。
说明:
Hi3516CV610不支持此模块。
API参考
- ss_mpi_isp_set_bayershp_attr:设置图像锐化属性。
- ss_mpi_isp_get_bayershp_attr:获取图像锐化属性。
ss_mpi_isp_set_bayershp_attr
【描述】
设定图像锐化属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
Hi3516CV610不支持
【举例】
无
【相关主题】
ss_mpi_isp_get_bayershp_attr
【描述】
获取图像锐化属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
Hi3516CV610不支持
【举例】
无
【相关主题】
数据类型
- OT_ISP_BSHP_THD_NUM:定义Bayer Sharpen亮度阈值、纹理阈值区间数。
- OT_ISP_BSHP_CURVE_NUM:定义Bayer Sharpen细节锐化区间数。
- ot_isp_bayershp_manual_attr:定义Bayer Sharpen手动属性。
- ot_isp_bayershp_auto_attr:定义Bayer Sharpen自动属性。
- ot_isp_bayershp_attr:定义Bayer Sharpen属性。
OT_ISP_BSHP_THD_NUM
【说明】
定义Bayer Sharpen亮度阈值、纹理阈值区间数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_BSHP_CURVE_NUM
【说明】
定义Bayer Sharpen细节锐化区间数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
ot_isp_bayershp_manual_attr
【说明】
定义Bayer Sharpen手动属性。
【定义】
typedef struct {
td_u8 mf_strength[OT_ISP_BSHP_CURVE_NUM];
td_u8 hf_strength[OT_ISP_BSHP_CURVE_NUM];
td_u8 dark_strength[[OT_ISP_BSHP_CURVE_NUM];
td_u8 mf_gain;
td_u8 hf_gain;
td_u8 dark_gain;
td_u16 overshoot;
td_u16 undershoot;
} ot_isp_bayershp_manual_attr;
【成员】
mf_strength[OT_ISP_BSHP_CURVE_NUM] |
|
hf_strength[OT_ISP_BSHP_CURVE_NUM] |
|
dark_strength[OT_ISP_BSHP_CURVE_NUM] |
|
【注意事项】
无。
【相关数据类型及接口】
ot_isp_bayershp_auto_attr
【说明】
定义Bayer Sharpen自动属性。
【定义】
typedef struct {
td_u8 mf_strength[OT_ISP_BSHP_CURVE_NUM][OT_ISP_AUTO_ISO_NUM];
td_u8 hf_strength[OT_ISP_BSHP_CURVE_NUM][OT_ISP_AUTO_ISO_NUM];
td_u8 dark_strength[OT_ISP_BSHP_CURVE_NUM][OT_ISP_AUTO_ISO_NUM];
td_u8 mf_gain[OT_ISP_AUTO_ISO_NUM];
td_u8 hf_gain[OT_ISP_AUTO_ISO_NUM];
td_u8 dark_gain[OT_ISP_AUTO_ISO_NUM];
td_u16 overshoot[OT_ISP_AUTO_ISO_NUM];
td_u16 undershoot[OT_ISP_AUTO_ISO_NUM];
} ot_isp_bayershp_auto_attr;
【成员】
mf_strength[OT_ISP_BSHP_CURVE_NUM][OT_ISP_AUTO_ISO_NUM] |
|
hf_strength[OT_ISP_BSHP_CURVE_NUM][OT_ISP_AUTO_ISO_NUM] |
|
dark_strength[OT_ISP_BSHP_CURVE_NUM][OT_ISP_AUTO_ISO_NUM] |
|
mf_gain[OT_ISP_AUTO_ISO_NUM] |
|
hf_gain[OT_ISP_AUTO_ISO_NUM] |
|
dark_gain[OT_ISP_AUTO_ISO_NUM] |
|
overshoot[OT_ISP_AUTO_ISO_NUM] |
|
undershoot[OT_ISP_AUTO_ISO_NUM] |
【注意事项】
无。
【相关数据类型及接口】
ot_isp_bayershp_attr
【说明】
定义Bayer Sharpen属性。
【定义】
typedef struct {
td_bool enable;
td_u16 dark_threshold[OT_ISP_BSHP_THD_NUM];
td_u16 texture_threshold[OT_ISP_BSHP_THD_NUM];
ot_op_mode op_type;
ot_isp_bayershp_manual_attr manual_attr;
ot_isp_bayershp_auto_attr auto_attr;
} ot_isp_bayershp_attr;
【成员】
dark_threshold[OT_ISP_BSHP_THD_NUM] |
暗区识别阈值,识别为暗区的最小阈值和最大阈值,小于最小阈值的区域被识别为暗区,其中dark_threshold[1]必须大于dark_threshold[0]。取值范围:[0, 4095]。 |
texture_threshold[OT_ISP_BSHP_THD_NUM] |
纹理识别阈值,识别为纹理的最小阈值和最大阈值,小于最小阈值的区域被识别为纹理,其中texture_threshold[1]必须大于texture_threshold[0]。取值范围:[0, 4095]。 |
【注意事项】
Bayer Sharpen功能分为自动和手动:
- enable为TD_TRUE,op_type为OT_OP_MODE_AUTO,使用自动Bayer Sharpen功能。此时bayer sharpen的强度值与系统增益的关系请参见成员变量。
- enable设置为TD_TRUE,op_type设置为OT_OP_MODE_MANUAL使用手动Bayer Sharpen功能。
【相关数据类型及接口】
无
黑电平
功能描述
黑电平通常指没有外界光线输入时,sensor仍会输出的亮度值。ISP需要减去这个亮度值,以进行颜色的处理。
API参考
- ss_mpi_isp_set_black_level_attr:设置黑电平属性。
- ss_mpi_isp_get_black_level_attr:获取黑电平属性。
ss_mpi_isp_set_black_level_attr
【描述】
设置黑电平属性。
【语法】
td_s32 ss_mpi_isp_set_black_level_attr(ot_vi_pipe vi_pipe, const ot_isp_black_level_attr *black_level);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
- 如果接口配置为OT_ISP_BLACK_LEVEL_MODE_AUTO模式:若cmos.c里面的ot_isp_black_level_auto_attr结构体成员update设置为TD_TRUE,则表示始终使用cmos.c内联动的黑电平配置,而update设置为TD_FALSE,则表示使用cmos.c非联动的黑电平配置;如果接口配置为OT_ISP_BLACK_LEVEL_MODE_MANUAL模式:此时接口配置的手动黑电平配置会生效,ISP内部采用接口配置值;如果接口配置为OT_ISP_BLACK_LEVEL_MODE_DYNAMIC,则采用dynamic blc算法统计OB区得到的黑电平配置值。Dynamic blc算法可以实时统计OB区的黑电平,在OB区黑电平与可见光黑电平差值确定的情况下可以防止黑电平飘移。Dynamic blc模式调节iso时,拉满again后不能调节dgain,只能调节ispdgain。
- 线性模式下,black level模块集成在isp dgain 模块中,所以bypass isp dgain会同时关闭isp dgain模块中的black level功能。对图像质量影响较大。
- WDR模式下,black level模块集成在WDR模块中。WDR模式的通路配置与线性通路配置类似。要注意对于同一款sensor而言,线性模式和WDR模式的ob区datatype和sensor驱动配置可能是不一样的,要和sensor厂家的fae对清楚。
- vi_pipe>=OT_ISP_MAX_FE_PIPE_NUM时,不支持将black_level_mode配置为OT_ISP_BLACK_LEVEL_MODE_DYNAMIC。sensor built-in模式下,同样不支持将black_level_mode配置为OT_ISP_BLACK_LEVEL_MODE_DYNAMIC。(数据类型请具体请参考OT_ISP_MAX_PIPE_NUM)
- Manual、auto、dynamic blc模式中的黑电平值均指代sensor的黑电平值,若sensor黑电平随sensor gain/温度漂移较严重,而同时希望ISP的算法看到一组稳定的黑电平值,此时可以使能user_black_level_en,在FE的BLC模块中减去sensor黑电平与自定义黑电平之间的差异,这样ISP的所有模块所使用的黑电平均为user_black_level。
- 如果在使能user_black_level_en的情况下采集 raw数据,所采集raw数据的黑电平为user_black_level。此时如果需要灌所采集的raw进行调试,需要disable user_black_level_en,black_level_mode配置为OT_ISP_BLACK_LEVEL_MODE_MANUAL,manual_attr.black_level的值配置为user_black_level。
- 在线模式动态黑电平当帧生效且不支持配置offset,离线模式动态黑电平下一帧生效。
- Hi3516CV610不支持dynamic blc。
【举例】
无
【相关主题】
无
ss_mpi_isp_get_black_level_attr
【描述】
获取黑电平属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
无
数据类型
- ot_isp_black_level_mode:定义黑电平工作类型。
- ot_isp_black_level_manual_attr:定义手动黑电平属性。
- ot_isp_black_level_dynamic_pattern:定义dynamic BLC统计数据的Bayer格式属性。
- ot_isp_black_level_dynamic_attr:定义dynamic BLC属性。
- ot_isp_black_level_attr:定义黑电平属性。
ot_isp_black_level_mode
【说明】
定义黑电平工作类型。
【定义】
typedef enum {
OT_ISP_BLACK_LEVEL_MODE_AUTO = 0,
OT_ISP_BLACK_LEVEL_MODE_MANUAL = 1,
OT_ISP_BLACK_LEVEL_MODE_DYNAMIC = 2,
OT_ISP_BLACK_LEVEL_MODE_BUTT
} ot_isp_black_level_mode;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_black_level_manual_attr
【说明】
定义手动黑电平属性。
【定义】
typedef struct {
td_u16 black_level[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_BAYER_CHN_NUM];
} ot_isp_black_level_manual_attr;
【成员】
black_level[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_BAYER_CHN_NUM] |
|
【注意事项】
无
【相关数据类型及接口】
ot_isp_black_level_dynamic_pattern
【说明】
定义dynamic BLC统计数据的Bayer格式属性。
【定义】
typedef enum {
OT_ISP_DYNAMIC_PATTERN_RGB = 0,
OT_ISP_DYNAMIC_PATTERN_RGBIR,
OT_ISP_DYNAMIC_PATTERN_BUTT
} ot_isp_black_level_dynamic_pattern;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_black_level_dynamic_attr
【说明】
定义dynamic BLC属性。
【定义】
typedef struct {
ot_isp_black_level_dynamic_pattern pattern;
ot_rect ob_area;
td_u16 low_threshold;
td_u16 high_threshold;
td_s16 offset[OT_ISP_AUTO_ISO_NUM];
td_u16 tolerance;
td_u8 filter_strength;
td_bool separate_en;
td_u16 calibration_black_level[OT_ISP_AUTO_ISO_NUM];
td_u16 filter_thr;
} ot_isp_black_level_dynamic_attr;
【成员】
OB区的起始点坐标以及宽高。起始点坐标和宽高都必须是2的整数倍。 ob_area.x和ob_area.y表示OB区的起始坐标点。ob_area.width和ob_area.height表示OB区的宽高。该参数为ob区的统计范围,设置时应参考实际ob区大小,设置过小或超出图像实际ob区范围都可能导致图像异常。 |
|
OB区统计时不统计低于该值的像素点。该值用于限制统计像素的最小值。按照14bit的raw数据进行配置。建议设置为小于等于10的值,该值设置过大可能会导致图像异常。 |
|
OB区统计时不统计高于该值的像素点。 该值用于限制统计像素的最大值。按照14bit的raw数据进行配置。建议设置为大于4900的值,该值过小可能会导致图像异常。 |
|
offset[OT_ISP_AUTO_ISO_NUM] |
OB区黑电平与可见光区黑电平的差值。该值用于补偿OB区黑电平,使其与可见光区黑电平保持一致。按照14bit的raw数据进行配置。最大支持ISO到64倍。 |
OB区黑电平波动的范围。OB区的黑电平会受到噪声干扰波动,该值用于限制这种波动。当上一帧减去当前帧黑电平的绝对值小于tolerance时,当前帧黑电平延用上一帧黑电平。按照14bit的raw数据进行配置。 |
|
OB区黑电平读取方式。该值为0x1表示从寄存器中分别读取rggb四通道的黑电平。该值为0x0表示从寄存器中分别读取rggb四通道的黑电平后做平均处理。 |
|
calibration_black_level[OT_ISP_AUTO_ISO_NUM] |
不同again对应的黑电平的值。当环境光发生变化时,AE在第N帧重新计算出曝光信息。在N+1帧将第N帧的曝光信息配置给sensor。第N帧的曝光信息会在第N+3帧的RAW中生效。由于BLC会受到iso的影响所以第N+3帧的BLC发生了变化,但第N+3帧减的还是第N+2帧的黑电平,所以图像会偏色。该值用于计算补偿第N+3帧的黑电平,使其与可见光区黑电平保持一致,解决图像的偏色问题。按照14bit的raw数据进行配置。OT_ISP_AUTO_ISO_NUM的范围为0~15,对应的iso档位为100*(2^OT_ISP_AUTO_ISO_NUM)。 |
用于调整时域滤波器更新状态。应对时域滤波器开启时iso突变图像颜色异常的情况。 直接配置filter_thr。当iso变化时,IIR滤波器会根据filter_thr的值更新上一帧黑电平的值。如果|last_frame_blc - cur_frame_blc| > filt_thr 那么blc = last_frame_blc*wtg1 + cur_frame_blc*wtg2。改为blc = cur_frame_blc*wtg1 + cur_frame_blc*wtg2。其中的wtg1和wtg2表示滤波强度。 |
表 1 offset在不同的增益情况下的设置值
【注意事项】
- 使用user_black_level时要确保sensor黑电平小于user_black_level。
-
使用dynamic_blc时,当iso快速变化,时域滤波器需要更换上一帧blc参数,否则会导致黑电平无法快速收敛到实际值,从而导致图像偏色。filter_thr为调整时域滤波器参数的阈值。当上一帧黑电平与当前帧的黑电平差值大于设定的filter_thr时,将上一帧黑电平的值改为当前帧黑电平再进行时域滤波。若差值小于filter_thr,则不改变上一帧黑电平的值,直接进行时域滤波。
滤波公式:当前帧黑电平 = 上一帧黑电平 * 滤波强度 + 当前帧黑电平 * (1 – 滤波强度)
有阈值判断的滤波过程:

没有阈值判断的滤波过程:

-
offset和calibration_black_level可以用在线标定工具dynamic_blc_online_cali标定得到。dynamic_blc_online_cali有写好的sample。
要先确保mipi数据中包含OB区,才能打开Dynamic BLC模式对OB区进行统计。数据处理流程如图1所示。
-
BLC模式不支持动态切换,一开始要用Dynamic BLC模式且在乎前几帧效果,要在sensor序列里关闭clamp。clamp是开关sensor内部黑电平校正的参数。
-
Sensor驱动里一定要配置clamp信息,clamp信息可以在isp的proc打印信息里查询。如果没有配置clamp信息,proc信息里会显示none。
低照下动态黑电平会剧烈震荡,因此要打开时域滤波,否则画面会不停的闪烁。
-
使用dynamic blc需要关闭sensor内部黑电平校正,关闭sensor内部黑电平校正后,若OB区的黑电平和可见光区的黑电平差别较大或者sensor黑电平过大影响user_black_level使用需要关闭sensor_dgain。

因此若要使用Dynamic BLC模块基于OB区统计得到合理的黑电平值,整个数据处理通路的配置说明如下:
- sensor驱动配置:在驱动中添加可以读出ob区的sensor序列。若启动Dynamic BLC模块一定要关闭sensor中的BLC校正功能。
- mipi配置:确保mipi的裁剪区域包含OB区。若OB区的datatype与可见光区域图像的datatype不一样,则需要修改mipi的datatype配置,可通过调用OT_MIPI_SET_EXT_DATA_TYPE接口实现,接口的具体信息请参见《MIPI 使用指南》。若Dynamic BLC模块异常要检查mipi检测到的分辨率是否为包含OB区的分辨率。
- VI dev配置:宽高与mipi输出宽高保持一致。
- pub attr配置:配置wnd_rect中的起始坐标和宽高信息,使用ISP裁剪功能裁剪掉OB区,保证ISP FE和BE处理的数据为不带OB区的raw数据。
- VI pipe attr和chn info中的宽高配置为ISP裁剪后的宽高。
- 由于sensor gain值较大时,动态黑电平会严重飘移,所以calibration_black_level的标定值不够准确,从而导致等曝光量切换时会有颜色闪烁。但是不会影响开关灯这种极限场景的图像效果。
- Hi3516CV610不支持。
【相关数据类型及接口】
ot_isp_black_level_attr
【说明】
定义ISP黑电平属性。
【定义】
typedef struct {
td_bool user_black_level_en;
td_u16 user_black_level[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_BAYER_CHN_NUM];
ot_isp_black_level_mode black_level_mode;
ot_isp_black_level_manual_attr manual_attr;
ot_isp_black_level_dynamic_attr dynamic_attr;
} ot_isp_black_level_attr;
【成员】
|
使能user_black_level_en,ISP的所有模块看到的黑电平值为自定义的黑电平值,而非sensor的黑电平值。 |
|
user_black_level[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_BAYER_CHN_NUM] |
|
【注意事项】
- Sensor built-in模式下不支持使能user_black_level_en。
- vi_pipe>=OT_ISP_MAX_FE_PIPE_NUM时,不支持使能user_black_level_en。(数据类型请具体请参考OT_ISP_MAX_PIPE_NUM)
- Hi3516CV610不支持 dynamic_blc。
【相关数据类型及接口】
无
黑电平标定工具
功能描述
黑电平标定工具用于标定offset和calibration_black_level。在高iso条件下,可见光区的黑电平均值和OB区的黑电平均值会有差异。offset用于补偿OB区黑电平,使其与可见光区黑电平保持一致。按照14bit的raw数据进行配置。当环境光发生变化时,AE在第N帧重新计算出曝光信息。在N+1帧将第N帧的曝光信息配置给sensor。第N帧的曝光信息会在第N+3帧的RAW中生效。由于BLC会受到iso的影响所以第N+3帧的BLC发生了变化,但第N+3帧减的还是第N+2帧的黑电平,所以图像会偏色。calibration_black_level用于计算补偿第N+3帧的黑电平,使其与可见光区黑电平保持一致,解决图像的偏色问题。按照14bit的raw数据进行配置。
CAUTION:
黑电平标定结果通过修正实际统计黑电平实现个体差异校正。因此,用户通过MPI接口修改标定结果,会导致标定失效。 Hi3516CV610不支持此工具。
黑电平标定工具实现在量产过程中,针对不同机器的差异进行对黑电平补偿参数标定的功能。用户可以使用在线标定工具dynamic_blc_online_cali标定得到offset和calibration_black_level。再调用ss_mpi_isp_set_black_level_attr接口配置offset和calibration_black_level。同时生成带有offset和calibration_black_level标定结果的TXT文件。
注意事项:
- 标定sample工具介绍详见:readme.txt
- 标定sample工具可手动裁剪标定区域。所裁剪的画面越大,耗时越长。选定的iso档位越多,耗时越长。
- 标定完成后sample会自动将标定数据导入,无需手动导入。
- 当前标定工具只适配了hy_s0603。若要标定其他sensor需要在set_gain_acor_sensor函数中添加gain值配置。
黑电平补偿参数的校正过程:
- 修改sensor驱动(hy_s0603_cmos_ex.h)。将OT_ISP_BLACK_LEVEL_MODE_DYNAMIC改为动态BLC。
- 将设备的光圈完全关闭,或者使用镜头盖将镜头输入遮挡,确保无光线进入;
- 运行标定工具dynamic_blc_online_cali( ./ dynamic_blc_online_cali 0 30 8 100 100 100 100 )。
去FPN
功能描述
Sensor将光信号转换成电信号,再通过数百万个ADC器件后输出图像。每个像素结构中的光电二极管的尺寸、掺杂浓度、生产过程中的沾污以及MOS场效应管的参数的偏差等都会造成像素输出信号的变化,由于这些偏差造成的噪声对于给定的单个像素它是固定的,这种噪声就是固定模式噪声FPN(Fixed Pattern Noise)。
去FPN模块就是要把这些固定模式噪声消除。
FPN的标定过程:
- 首先确定FPN在哪个ISO下最为严重,在此ISO下固定增益,关闭镜头的光圈,让sensor采集黑帧。
- 启动标定,当第一帧过来时,把满足标定条件的RAW数据写到内存 ,当第二帧过来时,通过读出端口把内存中的黑帧读出来与第二帧进行累加后再通过写出端口再写回内存,后面的帧也是这样,但是最后一帧写出时会对累加的黑帧平均后再写回内存。
- 当求平均写出后,标定结束。此时,内存中就把低照度下的固定模式噪声存储下来了,然后,把该黑帧存储到外存上即可。

FPN的校正过程:
- 把标定好的黑帧从外存载入到内存中。
- 当从sensor采集的带FPN的正常图像过来后,用每帧都减去在内存中的黑帧,从而就得到了消除FPN后的校正帧。

API参考
- ss_mpi_isp_fpn_calibrate:设置去FPN标定属性。
- ss_mpi_isp_set_fpn_attr:设置去FPN属性。
- ss_mpi_isp_get_fpn_attr:获取去FPN属性。
ss_mpi_isp_fpn_calibrate
【描述】
设置去FPN标定属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
- 标定时用的内存注意要按16bit进行分配,标定完成之后要把黑帧/行,ISO,黑帧的长度、OFFSET、是否压缩标志等保存到外部存储介质,在校正的时候要用到这些信息。
- Hi3516CV610在VI离线VPSS在线模式下不支持FPN标定。
- Hi3519DV500在图像宽度大于4096时只支持OT_PIXEL_FORMAT_RGB_BAYER_16BPP格式的黑帧校正;Hi3516CV610在图像宽度大于3200时只支持OT_PIXEL_FORMAT_RGB_BAYER_16BPP格式的黑帧校正。
- Hi3519DV500/Hi3516CV610 FPN标定不支持压缩,只能是非压缩模式。
- Hi3519DV500/Hi3516CV610 FPN标定不支持行模式,只能是帧模式。
- HI3519DV500 FPN标定不支持在拼接sync模式下开启。
- FPN标定不支持在虚拟pipe下开启,不支持YUV通路。
- FPN在标定时当前pipe不能做校正,其他pipe不能做标定或者校正。
- 在WDR模式下,FPN不支持标定。
- VI物理通道使能时,不支持开启FPN标定。
- 当VI模块的PIPE有销毁操作时(例如:分辨率切换、WDR模式切换等情况),FPN功能需要在VI模块的PIPE销毁前关闭,并在VI模块的PIPE创建后重新配置才能恢复。
- FPN校正接口具有一定的延时,如关闭FPN校正后需要再次进行FPN标定,则需要等待几帧时间再调用FPN标定接口。
- 该标定接口为阻塞接口,等待标定完成后返回,超时时间为20000ms,16帧标定时标定帧率最小为1@fps。
【举例】
标定过程请参考sample vio代码。
【相关主题】
ss_mpi_isp_set_fpn_attr
【描述】
设置去FPN属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
- Hi3519DV500/Hi3516CV610 FPN校正不支持压缩,只能是非压缩模式。
- Hi3519DV500/Hi3516CV610 FPN校正不支持行模式,只能是帧模式。
- HI3519DV500 FPN校正不支持在拼接sync模式下开启。
- Hi3519DV500在图像宽度大于4096时只支持OT_PIXEL_FORMAT_RGB_BAYER_16BPP格式的黑帧校正;Hi3516CV610在图像宽度大于3200时只支持OT_PIXEL_FORMAT_RGB_BAYER_16BPP格式的黑帧校正。
- WDR模式下不支持FPN校正。
- FPN校正不支持在虚拟pipe下开启,不支持YUV通路。
- FPN校正最大支持14bit通路。
- 根据标定时候保存的黑帧信息,读出OFFSET、ISO等信息,同时要把黑帧读入内存,这些是在校正时要输入信息。如果用户选择为自动模式时,会根据校正时的ISO来自动调节校正的强度;而手动模式会根据用户输入的校正强度进行校正。
【举例】
校正过程请参考sample vio代码。
【相关主题】
ss_mpi_isp_get_fpn_attr
【描述】
获取BE去FPN属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
数据类型
- ot_isp_fpn_frame_info:定义去FPN的标定黑帧信息。
- ot_isp_fpn_calibrate_attr:定义去FPN的标定属性。
- ot_isp_fpn_attr:定义去FPN的校正属性。
- ot_isp_fpn_manual_attr:定义去FPN在手动模式的校正属性。
- ot_isp_fpn_auto_attr:定义去FPN在自动模式的校正属性。
- ot_isp_fpn_type:定义去FPN类型。
- ot_isp_fpn_out_mode:定义去FPN标定输出的模式。
ot_isp_fpn_frame_info
【说明】
定义去FPN的标定黑帧信息。
【定义】
typedef struct {
td_u32 iso;
td_u32 offset[[OT_ISP_STRIPING_MAX_NUM](#ZH-CN_TOPIC_0000001338436902)];
td_u32 frm_size;
ot_video_frame_info fpn_frame;
} ot_isp_fpn_frame_info;
【成员】
【注意事项】
- 使用FPN时,图像宽度要求为16的整数倍,否则标定的黑帧或校正后的图像会有异常。
- offset可以在/proc/umap/isp中查询得到。当图像不分块时,offset[0]表示整个黑帧计算出来的offset;当图像分块时,offset[i]则表示黑帧第i个分块计算出来的offset,其中i=0、1、2,Hi3519DV500支持的最大分块数为3,Hi3516CV610支持的最大分块数为2。
- 当标定时选择的黑帧pixel_format是OT_PIXEL_FORMAT_RGB_BAYER_16BPP时,黑帧是非紧凑型的raw;当pixel_format是其他时,黑帧是紧凑型的raw,像素位宽和选择的位宽一致。
【相关数据类型及接口】
ot_isp_fpn_calibrate_attr
【说明】
定义去FPN的标定属性。
【定义】
typedef struct {
td_u32 threshold;
td_u32 frame_num;
ot_isp_fpn_type fpn_type;
ot_isp_fpn_frame_info fpn_cali_frame;
ot_isp_fpn_out_mode fpn_mode;
} ot_isp_fpn_calibrate_attr;
【成员】
标定的类型,有二种:帧模式与行模式,帧模式校正效果要优于行模式,而行模式要比帧模式省内存。Hi3519DV500/Hi3516CV610只支持帧模式。 |
|
【注意事项】
阈值与标定时保存黑帧的比特数相关,假设标定时保存的比特数是N,当N=16时阈值一般取4095,当N<16时阈值一般取(2^N)>>2-1。
【相关数据类型及接口】
ot_isp_fpn_attr
【说明】
定义去FPN的校正属性。
【定义】
typedef struct {
td_bool enable;
td_bool aibnr_mode;
ot_op_mode op_type;
ot_isp_fpn_type fpn_type;
ot_isp_fpn_frame_info fpn_frm_info;
ot_isp_fpn_manual_attr manual_attr;
ot_isp_fpn_auto_attr auto_attr;
} ot_isp_fpn_attr;
【成员】
【注意事项】
- 校正模式分为手动与自动模式,手动模式需要用户设置校正强度,而自动模式不需要设置校正强度,系统会根据当前图像的ISO计算出校正强度,进行动态校正。
- aibnr_mode不支持在fpn校正已经开了的时候进行动态修改,在配置fpn校正接口开时需要设置好aibnr_mode的配置,推荐在AIBNR开启时使能,其他情况下不使能。
- aibnr_mode使能仅在pipe0生效。
【相关数据类型及接口】
ot_isp_fpn_manual_attr
【说明】
定义去FPN在手动模式的校正属性。
【定义】
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_fpn_auto_attr
【说明】
定义去FPN在自动模式的校正属性。
【定义】
【成员】
【注意事项】
自动模式下,strength根据标定时的ISO与当前ISO动态调整。
- 当前ISO大于标定时的ISO,strength大于256;
- 当前ISO小于标定时的ISO,strength小于256。
【相关数据类型及接口】
无
ot_isp_fpn_type
【说明】
定义去FPN类型。
【定义】
typedef enum {
OT_ISP_FPN_TYPE_FRAME = 0,
OT_ISP_FPN_TYPE_LINE = 1,
OT_ISP_FPN_TYPE_BUTT
} ot_isp_fpn_type;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_fpn_out_mode
【说明】
定义FPN标定帧输出的模式。
【定义】
typedef enum {
OT_ISP_FPN_OUT_MODE_NORM = 0,
OT_ISP_FPN_OUT_MODE_HIGH,
OT_ISP_FPN_OUT_MODE_BUTT
} ot_isp_fpn_out_mode;
【成员】
【注意事项】
- 普通FPN标定,请选择OT_ISP_FPN_OUT_MODE_NORM模式。
- 对于标定16帧以上的场景,需要使用OT_ISP_FPN_OUT_MODE_HIGH模式,具体用法参考fpn标定的sample(该sample默认为vi离线模式下,调用标定接口8次,用送帧实现128帧标定,不适用于在线模式)。
【相关数据类型及接口】
CA
功能描述
颜色调整模块支持在YUV空间进行色域调整的操作,这个模块下有两个模式,一个是CA模式,另外一个是CP模式(热成像上色),工作的时候,两者只能二选一。
在CA模式下,通过下面的公式可以将一个像素点(Y,U,V)映射到另一个像素点(Y’,U’,V’)。
Y’=Y;
U’=aU;
V’=aV;
其中a是转换系数,采用这组公式可以在一定程度上保持亮度和色调的恒定,对像素点的饱和度做一个调整。转换系数a和像素点亮度Y联系,就可以根据亮度的变化来调整饱和度,达到局部调整饱和度的目的,亮处的颜色更鲜艳,暗处的色噪不明显。同时,转换系数a和ISP的ISO值联系,达到降低低照度下的暗处色噪的目的。
在CP模式下,热成像的图像只有亮度信息,该模式下通过亮度信息Y查找上色的色板,查找对应的YUV的值作为输出的值。其中,色板是通过YUV格式存储的。
API参考
- ss_mpi_isp_set_ca_attr:设置CA属性。
- ss_mpi_isp_get_ca_attr:获取CA属性。
ss_mpi_isp_set_ca_attr
【描述】
设置CA属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
ss_mpi_isp_get_ca_attr
【描述】
获取CA属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
- HDR模式,默认关闭CA,客户可以自行设置打开。
- Hi3519DV500/Hi3516CV610 不涉及HDR模式。
【举例】
无。
【相关主题】
数据类型
- OT_ISP_CA_YRATIO_LUT_LENGTH:CA的数据分格。
- ot_isp_ca_type:色彩调整模块的工作模式,0为CA模式,1为CP模式。
- ot_isp_ca_lut:CA模式的属性。
- ot_isp_cp_lut:CP模式的属性。
- ot_isp_ca_attr:定义颜色调整模块的属性,包含了CA模式属性和CP模式属性。
OT_ISP_CA_YRATIO_LUT_LENGTH
【说明】
CA的数据分格,CA模式下为亮度等分,CP模式下为YUV数据等分。
【定义】
【注意事项】
无。
【相关数据类型及接口】
ot_isp_ca_type
【说明】
定义颜色调整模块的工作模式。0为CA模式,1为CP模式。
【定义】
typedef enum {
OT_ISP_CA_ENABLE = 0x0,
OT_ISP_CP_ENABLE, /* Not supported for Hi3516CV610 */
OT_ISP_CA_BUTT
} ot_isp_ca_type;
【成员】
【注意事项】
Hi3516CV610 不支持CP模式。
【相关数据类型及接口】
无
ot_isp_ca_lut
【说明】
定义CA模式的属性。
【定义】
typedef struct {
td_u32 y_ratio_lut[OT_ISP_CA_YRATIO_LUT_LENGTH]; /* RW;Range:[0,2047];Format:1.10 */
td_s32 iso_ratio[OT_ISP_AUTO_ISO_NUM]; /* RW;Range:[0,2047];Format:1.10 */
td_u32 y_sat_lut[OT_ISP_CA_YRATIO_LUT_LENGTH]; /* RW;Range:[0,2047];Format:1.10 */
} ot_isp_ca_lut;
【成员】
【注意事项】
无。
【相关数据类型及接口】
无
ot_isp_cp_lut
【说明】
定义CP模式的属性,也就是色板的YUV值。
【定义】
typedef struct {
td_u8 cp_lut_y[OT_ISP_CA_YRATIO_LUT_LENGTH]; /* RW;Range:[0,255];Format:8.0; */
td_u8 cp_lut_u[OT_ISP_CA_YRATIO_LUT_LENGTH]; /* RW;Range:[0,255];Format:8.0; */
td_u8 cp_lut_v[OT_ISP_CA_YRATIO_LUT_LENGTH]; /* RW;Range:[0,255];Format:8.0; */
} ot_isp_cp_lut;
【成员】
【注意事项】
Hi3516CV610 不支持。
【相关数据类型及接口】
无。
ot_isp_ca_attr
【说明】
定义颜色调整模块的属性,包含了CA模式属性和CP模式属性。
【定义】
typedef struct {
td_bool enable; /* RW;Range:[0x0,0x1];Format:1.0 */
ot_isp_ca_type ca_cp_en;
ot_isp_ca_lut ca;
ot_isp_cp_lut cp;/* Not supported for Hi3516CV610 */
} ot_isp_ca_attr;
【成员】
【注意事项】
Hi3516CV610 不支持CP模式的属性。
【相关数据类型及接口】
无
CAC
功能描述
色差(Chromatic Aberration)是指光学上透镜无法将各种波长的光聚焦在同一点上的现象,是一种与镜头有关的缺陷,它产生的主要原因是不同波长的光具有不同的折射率(色散现象)。色差可以分为如下的两类:
-
轴向色差(Axial Chromatic Aberration)
- 透镜对于不同的光会有不同的折射率,因此不同颜色的光会聚焦在不同的焦平面上,大口径镜头容易产生这种色差,缩小光圈可以减弱轴向色差。
- 人眼对于G通道更敏感,一般G通道可以正确对焦,从而引起R、B的模糊,造成高光区与低光区交界处出现明显的紫边表现。
-
横向色差(Lateral Chromatic Aberration)
- 透镜的放大倍数也与折射率有关,它使得不同波长光线的像高不同,即不同波长的光会聚焦在焦平面上不同的位置,会造成R、G、B 3通道具有不同的影像高度,在影像上产生色的错位。
- 越偏离图像中心,横向色差越明显,一般横向色差表现为物体相对的两侧边缘出现不同的颜色,但具体表现为什么颜色与镜头组密切相关,不同的镜头组会表现出不同种类的颜色边缘。
CAC模块的作用是对图像中的色差进行自动检测与校正,包含ACAC和LCAC两种色差校正算法,ACAC作为主要校正算法,不仅可以校正纵向色差,还可以校正横向色差;LCAC作为辅助校正算法,当色差严重时ACAC无法完全校正,可再结合作用于局部色差的LCAC进行校正。

API参考
- ss_mpi_isp_set_cac_attr:设置紫边检测校正参数。
- ss_mpi_isp_get_cac_attr:获取紫边检测校正参数。
ss_mpi_isp_set_cac_attr
【描述】
设置紫边检测校正参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
ss_mpi_isp_get_cac_attr
【描述】
获取紫边检测校正参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
数据类型
- OT_ISP_CAC_EXP_RATIO_NUM:定义CAC与曝光比联动时曝光比档位数。
- OT_ISP_CAC_CURVE_NUM:定义CAC高亮检测模块检测阈值的个数。
- OT_ISP_CAC_THR_NUM:定义CAC边缘检测阈值的个数。
- ot_isp_cac_lcac_manual_attr:定义LCAC手动属性。
- ot_isp_cac_lcac_auto_attr:定义LCAC自动属性。
- ot_isp_cac_lcac_attr:LCAC校正属性。
- ot_isp_cac_acac_attr:定义ACAC校正属性。
- ot_isp_cac_acac_manual_attr:定义ACAC手动属性。
- ot_isp_cac_acac_auto_attr:定义色差校正自动属性。
- ot_isp_cac_attr:定义紫边检测校正属性。
OT_ISP_CAC_EXP_RATIO_NUM
【说明】
定义CAC与曝光比联动时曝光比档位数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_CAC_CURVE_NUM
【说明】
定义CAC高亮检测模块检测阈值的个数
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_CAC_THR_NUM
【说明】
定义CAC边缘检测阈值的个数
【定义】
【注意事项】
无。
【相关数据类型及接口】
ot_isp_cac_lcac_manual_attr
【说明】
定义LCAC手动属性。
【定义】
typedef struct {
td_u8 de_purple_cr_strength;
td_u8 de_purple_cb_strength;
} ot_isp_cac_lcac_manual_attr;
【成员】
【注意事项】
de_purple_cb_strength和de_purple_cr_strength矫正强度过大,可能出现边界不连续现象或闪烁现象。
【相关数据类型及接口】
ot_isp_cac_lcac_auto_attr
【说明】
定义LCAC自动属性。
【定义】
typedef struct {
td_u8 de_purple_cr_strength[OT_ISP_CAC_EXP_RATIO_NUM];
td_u8 de_purple_cb_strength[OT_ISP_CAC_EXP_RATIO_NUM];
} ot_isp_cac_lcac_auto_attr;
【成员】
de_purple_cr_strength[OT_ISP_CAC_EXP_RATIO_NUM] |
一般情况下,曝光比越大,配置的去紫边的强度值越大,对应关系如表1所示。若连续两档的处理强度不相等,则通过线性插值的方法确定两档中间某个曝光比值对应的处理强度。 |
de_purple_cb_strength[OT_ISP_CAC_EXP_RATIO_NUM] |
表 1 de_purple_cr_strength[16]在不同曝光比情况下对应的设置值
【注意事项】
- 曝光比是WDR模式下才有的概念,线性模式下获取的曝光比值总为1,因此在线性模式下虽然有联动,生效的总是第一组配置值。
- 在built-in WDR模式下,本参数并不和曝光比联动,为与线性模式区分,生效的总是最后一组曝光比的配置值,即Hi3519DV500对应曝光比为16384的配置值,Hi3516CV610对应曝光比为2048的配置值。
- 在WDR长帧模式下,曝光比生效的总是第一组配置,不会发生变化。在WDR自动长帧模式下,曝光比生效的情况跟实际生效的模式相同。
【相关数据类型及接口】
ot_isp_cac_lcac_attr
【说明】
LCAC校正属性。
【定义】
typedef struct {
td_u16 purple_detect_range;
td_u16 var_threshold;
td_u16 r_detect_threshold[OT_ISP_CAC_CURVE_NUM];
td_u16 g_detect_threshold[OT_ISP_CAC_CURVE_NUM];
td_u16 b_detect_threshold[OT_ISP_CAC_CURVE_NUM];
ot_isp_cac_lcac_manual_attr lcac_manual;
ot_isp_cac_lcac_auto_attr lcac_auto;
} ot_isp_cac_lcac_attr;
【成员】
紫色检测的范围,该值控制的是r_detect_threshold,g_detect_threshold,b_detect_threshold这几个参数的生效情况。 值越大,越多非高亮区域的紫色被界定为紫边区域。purple_detect_range可能会引入紫边去除不平滑的问题,可以检查r_detect_threshold,g_detect_threshold,b_detect_threshold这几个参数的配置。 |
|
r_detect_threshold[OT_ISP_CAC_CURVE_NUM] |
它分了3段,每一段的值表示高亮检测模块里面R分量阈值。实际中生效的值取决于purple_detect_range这个参数的大小。purple_detect_range越小,越倾向于r_detect_threshold第一段的值,purple_detect_range越大,越倾向于r_detect_threshold第3段的值。 |
g_detect_threshold[OT_ISP_CAC_CURVE_NUM] |
它分了3段,每一段的值表示高亮检测模块里面G分量阈值。实际中生效的值取决于purple_detect_range这个参数的大小。purple_detect_range越小,越倾向于g_detect_threshold第一段的值,purple_detect_range越大,越倾向于g_detect_threshold第3段的值。 |
b_detect_threshold[OT_ISP_CAC_CURVE_NUM] |
它分了3段,每一段的值表示高亮检测模块里面B分量阈值。实际中生效的值取决于purple_detect_range这个参数的大小。purple_detect_range越小,越倾向于b_detect_threshold第一段的值,purple_detect_range越大,越倾向于b_detect_threshold第3段的值。 |
【注意事项】
- 由于算法设计,LocalCAC矫正强度会受到Demosaic结果影响。因此将LocalCAC强度设为最小时依然会保留一定去紫边能力,对高光处紫边表现有一定影响。如果想完全关闭LocalCAC效果需直接将enable置为FALSE。
- 有一些紫边比较严重的场景,R或者B容易出现饱和的情况,这时,b_detect_threshold或者r_detect_threshold在最大值附近有去除紫边不平滑的现象。需要跟de_purple_cr_strength和de_purple_cb_strength联合调整。
【相关数据类型及接口】
ot_isp_cac_acac_attr
【说明】
定义ACAC校正属性。
【定义】
typedef struct {
ot_isp_cac_acac_auto_attr acac_auto;
ot_isp_cac_acac_manual_attr acac_manual;
} ot_isp_cac_acac_attr;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_cac_acac_manual_attr
【说明】
定义ACAC手动属性。
【定义】
typedef struct {
td_u16 edge_threshold[OT_ISP_CAC_THR_NUM];
td_u16 edge_gain;
td_u16 cac_rb_strength;
td_u16 purple_alpha;
td_u16 edge_alpha;
td_u16 satu_low_threshold;
td_u16 satu_high_threshold;
} ot_isp_cac_acac_manual_attr;
【成员】
【注意事项】
edge_threshold调小,容易出现边缘信息过多,导致带颜色的边缘出现颜色腐蚀而丢失,不建议这个参数调试太小。
【相关数据类型及接口】
无。
ot_isp_cac_acac_auto_attr
【说明】
定义色差校正自动属性。
【定义】
typedef struct {
td_u16 edge_threshold[OT_ISP_CAC_THR_NUM][OT_ISP_AUTO_ISO_NUM];
td_u16 edge_gain[OT_ISP_AUTO_ISO_NUM];
td_u16 cac_rb_strength[OT_ISP_AUTO_ISO_NUM];
td_u16 purple_alpha[OT_ISP_AUTO_ISO_NUM];
td_u16 edge_alpha[OT_ISP_AUTO_ISO_NUM];
td_u16 satu_low_threshold[OT_ISP_AUTO_ISO_NUM];
td_u16 satu_high_threshold[OT_ISP_AUTO_ISO_NUM];
} ot_isp_cac_acac_auto_attr;
【成员】
edge_threshold[OT_ISP_CAC_THR_NUM][OT_ISP_AUTO_ISO_NUM] |
ACAC的边缘检测阈值,两个阈值分别代表高低阈值,小于edge_thd[0]的为平坦区域,大于edge_thd[1]的是强边缘。 |
edge_gain[OT_ISP_AUTO_ISO_NUM] |
|
cac_rb_strength[OT_ISP_AUTO_ISO_NUM] |
|
purple_alpha[OT_ISP_AUTO_ISO_NUM] |
|
edge_alpha[OT_ISP_AUTO_ISO_NUM] |
|
satu_low_threshold[OT_ISP_AUTO_ISO_NUM] |
|
satu_high_threshold[OT_ISP_AUTO_ISO_NUM] |
【注意事项】
无
【相关数据类型及接口】
无。
ot_isp_cac_attr
【说明】
定义紫边检测校正属性。
【定义】
typedef struct {
td_bool enable;
ot_op_mode op_type;
td_u8 detect_mode;
td_s16 purple_upper_limit;
td_s16 purple_lower_limit;
ot_isp_cac_acac_attr acac_cfg;
ot_isp_cac_lcac_attr lcac_cfg;
} ot_isp_cac_attr;
【成员】
紫色检测范围上限,取值范围:[-2048, 2047],其中purple_upper_limit必须大于purple_lower_limit。
|
|
|
|
【注意事项】
detect_mode建议调试为0模式,1模式下指针对紫边做了扩充,黄边,绿边等颜色边可能变差。
【相关数据类型及接口】
无。
WDR
功能描述
由于传统的图像传感器的动态范围比较低,因此,如果用传统的图像传感器拍摄高动态范围的场景,就会要么亮处过曝,丢失很多细节;要么暗处曝光不足,细节难以分辨。为了记录高动态范围场景的每一个细节,可以采用多次曝光图像合成的方法。
WDR算法的目的就是将从sensor输出的长短帧数据合成为一帧20bit的数据。如图1所示,长短帧数据是先缓存在DDR中,然后同时给WDR模块进行合成。合成的原则是择优选取,即对于比较亮的区域,采用短帧数据,而对于比较暗的区域,采用长帧数据。

- 本模块可以通过ot_isp_wdr_merge_mode来决定合成的方式。若该值为0,则用传统的WDR功能合成;若该值为1,则打开Fusion功能,即用来改善Flicker现象;其中ot_isp_wdr_combine_attr结构体用来控制传统的WDR功能,而ot_isp_fusion_attr结构体用来控制Fusion功能。
-
传统的WDR,包括以下功能:
- 可以去除鬼影。通过ot_isp_wdr_combine_attr 来选择融合区域是采用短帧还是长帧;
- 可以通过short_threshold 和 long_threshold 来控制选择长短帧的范围。即对于大于short_threshold的像素选择短帧,小于long_threshold 的像素选择长帧,而对于在两者之间的像素采用长短帧融合的方式;
- 可以通过force_long_low_threshold和force_long_hig_threshold来控制运动区域选择长帧,对于亮度小于force_long_low_threshold的运动区域强制选择长帧,亮度大于force_long_hig_threshold的运动区域不强制选择长帧,对于亮度在两者之间的运动区域采用长短帧融合的方式;
- 可以通过md_thr_low_gain,md_thr_hig_gain来控制运动检测;
- 可以通过md_ref_flicker 来决定运动检测是否参考Flicker检测结果;
- 可以通过short_expo_chk 来控制WDR融合是否检查短帧数据大小。
-
Fusion功能指适用于一般的室内场景(非宽动态)以及夜晚场景,用来改善工频闪问题。其中fusion_threshold [4]是用来控制Fusion选择时每帧的阈值。
API参考
- ss_mpi_isp_set_fswdr_attr:设置动态范围压缩参数。
- ss_mpi_isp_get_fswdr_attr:获取动态范围压缩参数。
ss_mpi_isp_set_fswdr_attr
【描述】
设置帧合成参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
Hi3516CV608不支持。
【举例】
无
【相关主题】
ss_mpi_isp_get_fswdr_attr
【描述】
获取帧合成参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
Hi3516CV608不支持。
【举例】
无
【相关主题】
数据类型
- OT_ISP_WDR_RATIO_NUM:定义用于gain插值的WDR曝光比档位数。
- ot_isp_wdr_merge_mode:定义ISP 合成方式属性。
- ot_isp_fswdr_mdt_attr:定义ISP FSWDR运动检测的属性。
- ot_isp_wdr_combine_attr:定义ISP FSWDR combine属性。
- ot_isp_fusion_attr:定义ISP FUSION属性。
- ot_isp_wdr_wb_gain_pos: 定义白平衡增益在ISP的位置属性
- ot_isp_fswdr_manual_attr:定义ISP FSWDR手动属性。
- ot_isp_fswdr_auto_attr:定义ISP FSWDR自动属性。
- ot_isp_wdr_fs_attr:定义ISP FSWDR属性。
OT_ISP_WDR_RATIO_NUM
【说明】
定义用于gain插值的WDR曝光比档位数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
ot_isp_wdr_merge_mode
【说明】
定义ISP合成方式属性。
【定义】
typedef enum {
OT_ISP_MERGE_WDR_MODE = 0,
OT_ISP_MERGE_FUSION_MODE = 1,
OT_ISP_MERGE_BUTT
} ot_isp_wdr_merge_mode;
【成员】
【注意事项】
无。
【相关数据类型及接口】
ot_isp_fswdr_mdt_attr
【说明】
定义ISPFSWDR运动检测属性。
【定义】
typedef struct {
td_bool short_expo_chk;
td_u16 short_check_threshold;
td_bool md_ref_flicker;
td_u8 mdt_still_threshold;
td_u8 mdt_full_threshold;
td_u8 mdt_long_blend;
ot_op_mode op_type;
ot_isp_fswdr_manual_attr manual_attr;
ot_isp_fswdr_auto_attr auto_attr;
} ot_isp_fswdr_mdt_attr;
【成员】
|
|
【注意事项】
无。
【相关数据类型及接口】
ot_isp_wdr_combine_attr
【说明】
定义ISPFSWDR combine属性。
【定义】
typedef struct {
td_bool motion_comp;
td_u16 short_threshold;
td_u16 long_threshold;
td_bool force_long;
td_u16 force_long_low_threshold;
td_u16 force_long_hig_threshold;
ot_isp_fswdr_mdt_attr wdr_mdt;
} ot_isp_wdr_combine_attr;
【成员】
FSWDR运动检测参数,具体参见ot_isp_fswdr_mdt_attr。 |
【注意事项】
注意force_long_low_threshold应小于等于force_long_hig_threshold, long_threshold应小于等于short_threshold。
【相关数据类型及接口】
ot_isp_fusion_attr
【说明】
定义ISP FUSION属性。
【定义】
typedef struct {
td_bool fusion_blend_en;
td_u8 fusion_blend_wgt;
td_u16 fusion_threshold[OT_ISP_WDR_MAX_FRAME_NUM];
td_bool fusion_force_gray_en;
td_u8 fusion_force_blend_threshold;
} ot_isp_fusion_attr;
【成员】
fusion_blend模式选择长短帧会根据插值出的G通道的值决定,fusion_blend_wgt决定了G通道插值接近局部均值还是局部最大值。其值越大,G通道插值越接近均值。 |
|
fusion_threshold[OT_ISP_WDR_MAX_FRAME_NUM] |
|
【注意事项】
无。
【相关数据类型及接口】
ot_isp_wdr_wb_gain_pos
【说明】
定义白平衡增益在ISP的位置属性。
【定义】
typedef enum {
OT_ISP_WDR_WBGAIN_IN_DG1 = 0,
OT_ISP_WDR_WBGAIN_IN_WB = 1,
OT_ISP_WDR_WBGAIN_POS_BUTT
} ot_isp_wdr_wb_gain_pos;
【成员】
【注意事项】
Hi3519DV500仅支持白平衡增益配置在WB处。
【相关数据类型及接口】
无
ot_isp_fswdr_manual_attr
【说明】
定义ISP FSWDR手动属性。
【定义】
【成员】
【注意事项】
注意md_thr_low_gain应小于等于md_thr_hig_gain。
【相关数据类型及接口】
ot_isp_fswdr_auto_attr
【说明】
定义ISP FSWDR自动属性。
【定义】
typedef struct {
td_u8 md_thr_low_gain[OT_ISP_WDR_RATIO_NUM][OT_ISP_AUTO_ISO_NUM];
td_u8 md_thr_hig_gain[OT_ISP_WDR_RATIO_NUM][OT_ISP_AUTO_ISO_NUM];
} ot_isp_fswdr_auto_attr;
【成员】
md_thr_low_gain[OT_ISP_WDR_RATIO_NUM][OT_ISP_AUTO_ISO_NUM] |
|
md_thr_hig_gain[OT_ISP_WDR_RATIO_NUM][OT_ISP_AUTO_ISO_NUM] |
表 1 md_thr_low_gain/md_thr_hig_gain 在不同曝光比下对应的设置
【相关数据类型及接口】
ot_isp_wdr_fs_attr
【说明】
定义ISP FSWDR属性。
【定义】
typedef struct {
ot_isp_wdr_merge_mode wdr_merge_mode;
ot_isp_wdr_combine_attr wdr_combine;
ot_isp_fusion_attr fusion_attr;
} ot_isp_wdr_fs_attr;
【成员】
|
在室内正常照度下存在工频闪时或者夜晚场景,建议采用Fusion合成,具体参见ot_isp_wdr_merge_mode。 |
|
传统的WDR合成结构体,具体参见ot_isp_wdr_combine_attr。 |
|
Fusion合成结构体,具体参见ot_isp_fusion_attr。 |
【注意事项】
WDR功能分为自动和手动:
- op_type 为OT_OP_MODE_AUTO,使用自动WDR功能。
- op_type 设置为OT_OP_MODE_MANUAL,使用手动WDR功能。
【相关数据类型及接口】
AWB量产标定工具
功能描述
CAUTION:
AWB量产标定结果通过修正AWB的静态白平衡系数实现个体差异校正。因此,用户通过MPI接口ot_isp_awb_attr配置static_wb修改静态白平衡系数,会导致量产标定失效。 AWB量产标定实现的是系统初始化时补偿AWB的静态白平衡系数,系统启动后不再变化。如果客户需要根据产品运行情况实时修改静态白平衡系数,可以通过MPI接口ot_isp_awb_attr配置static_wb。
AWB量产标定工具实现在量产过程中,针对不同机器的差异进行对AWB差异参数校正的功能。用户可以调用ss_mpi_isp_get_lightbox_gain接口,在色温范围4500K到6500K的均匀光源下的均匀背景环境下,获取图像中心若干个块的Rgain和Bgain的均值,即AWB增益,用于量产过程中矫正不同机器的AWB差异参数。
AWB差异参数的校正过程:
- 小规模试产过程中进行:取若干台样机,分别放置到量产标定环境(色温范围4500K到6500K,均匀光源,均匀背景),待AE稳定后(避免RGrGbB任一分量饱和),调用ss_mpi_isp_get_lightbox_gain接口,得到每台样机在量产标定环境的AWB增益值(请参考ot_isp_awb_calibration_gain结构体定义)。
- 小规模试产过程中进行:根据步骤1中若干台样机在量产标定环境的AWB增益,由用户自己确定其中一台机器作为GoldenSample。推荐基于GoldenSample机器完成AWB, CCM标定,同时GoldenSample作为AWB差异参数校准的基准。
- 取GoldenSample,采集多个色温下24色卡Raw数据,完成AWB、CCM标定流程(标定得到静态白平衡系数、普朗克曲线参数、色温曲线参数、多色温CCM矩阵系数等)。
- 将GoldenSample标定得到的AWB、CCM参数通过cmos.c文件的cmos_get_awb_default接口配置。定义cmos.c文件的GOLDEN_RGAIN=GoldenSample在量产标定环境得到的avg_r_gain,定义cmos.c文件的GOLDEN_BGAIN=GoldenSample在量产标定环境得到的avg_b_gain。
- 若用户不进行步骤1、2,则任意选取一台机器作为GoldenSample,完成步骤3、4的操作。
- 量产过程中进行:取任意一台需要矫正的机器作为Sample,重复步骤1,得到该台机器在量产标定环境的AWB增益。通过cmos.c中的sensor_set_init对Sample的AWB增益进行配置。(请参考ot_isp_init_attr和ot_isp_awb_calibration_gain结构体定义。ot_isp_init_attr. sample_r_gain =Sample在量产标定环境得到的avg_r_gain,ot_isp_init_attr sample_b_gain =Sample在量产标定环境得到的avg_b_gain)。
-
AWB程序将会根据GoldenSample机器的AWB增益以及Sample机器的AWB增益实现对Sample机器的AWB差异参数的校正,改善机器个体之间的颜色一致性。
图 1 AWB小规模试产过程中确定GoldenSample流程图

API参考
请参考2.2小节中的ss_mpi_isp_get_lightbox_gain。
数据类型
请参考2.3小节中的ot_isp_awb_calibration_gain。
ColorTone
功能描述
ColorTone提供色调调节接口,用户可通过该接口实现图像颜色偏红、偏绿、偏蓝等喜好调节。
API参考
- ss_mpi_isp_set_color_tone_attr:设置色调的参数。
- ss_mpi_isp_get_color_tone_attr:获取色调的参数。
ss_mpi_isp_set_color_tone_attr
【描述】
设置色调的参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_awb.h、ss_mpi_awb.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a、libss_mpi_awb.a
【注意】
无
【举例】
无
【相关主题】
ss_mpi_isp_get_color_tone_attr
ss_mpi_isp_get_color_tone_attr
【描述】
获取色调的参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_awb.h、ss_mpi_awb.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a、libss_mpi_awb.a
【注意】
无
【举例】
无
【相关主题】
ss_mpi_isp_set_color_tone_attr
数据类型
ot_isp_color_tone_attr:定义色调调整属性。
ot_isp_color_tone_attr
【说明】
定义色调调整属性。
【定义】
typedef struct {
td_u16 red_cast_gain;
td_u16 green_cast_gain;
td_u16 blue_cast_gain;
} ot_isp_color_tone_attr;
【成员】
【注意事项】
ColorTone支持客户调节固定的颜色风格,与色温无关。
【相关数据类型及接口】
无
LDCI
功能描述
LDCI是局域自动对比度增强的简称(Local Dynamic Contrast Improvement)。该算法采用局域直方图均衡来增强图像局部对比度,提升暗区细节。
API参考
- ss_mpi_isp_set_ldci_attr:设置LDCI属性参数。
- ss_mpi_isp_get_ldci_attr:获取LDCI属性参数。
ss_mpi_isp_set_ldci_attr
【描述】
设置LDCI属性参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
ss_mpi_isp_get_ldci_attr
【描述】
获取LDCI属性参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
数据类型
- ot_isp_ldci_gauss_coef_attr:定义GAUSS曲线属性参数。
- ot_isp_ldci_he_wgt_attr:定义直方图均衡权重属性参数。
- ot_isp_ldci_manual_attr:定义LDCI手动模式属性参数。
- ot_isp_ldci_auto_attr:定义LDCI自动模式属性参数。
- ot_isp_ldci_attr:定义LDCI属性参数。
ot_isp_ldci_gauss_coef_attr
【说明】
定义GAUSS分布属性参数。
【定义】
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_ldci_he_wgt_attr
【说明】
定义直方图均衡与原图融合权重属性参数。
【定义】
typedef struct {
ot_isp_ldci_gauss_coef_attr he_pos_wgt;
ot_isp_ldci_gauss_coef_attr he_neg_wgt;
} ot_isp_ldci_he_wgt_attr;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_ldci_manual_attr
【说明】
定义LDCI手动模式属性参数。
【定义】
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_ldci_auto_attr
【说明】
定义LDCI自动模式下属性参数。
【定义】
typedef struct {
ot_isp_ldci_he_wgt_attr he_wgt[OT_ISP_AUTO_ISO_NUM];
td_u16 blc_ctrl[OT_ISP_AUTO_ISO_NUM];
} ot_isp_ldci_auto_attr;
【成员】
he_wgt[OT_ISP_AUTO_ISO_NUM] |
|
blc_ctrl[OT_ISP_AUTO_ISO_NUM] |
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_ldci_attr
【说明】
定义LDCI属性参数。
【定义】
typedef struct {
td_bool enable;
td_u8 gauss_lpf_sigma;
ot_op_mode op_type;
ot_isp_ldci_manual_attr manual_attr;
ot_isp_ldci_auto_attr auto_attr;
td_u16 tpr_incr_coef;
td_u16 tpr_decr_coef;
} ot_isp_ldci_attr;
【成员】
|
|
【注意事项】
无
【相关数据类型及接口】
无
Radial Crop
功能描述
Hi3519DV500是在YUV域对图像进行radial crop操作,将设定半径之外的地方直接拉黑掉。
API参考
- ss_mpi_isp_set_rc_attr:设定Radial Crop属性。
- ss_mpi_isp_get_rc_attr:获取Radial Crop属性。
ss_mpi_isp_set_rc_attr
【描述】
设定Radial Crop 属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
Hi3516CV610不支持。
【举例】
无。
【相关主题】
ss_mpi_isp_get_rc_attr
【描述】
获取Radial Crop属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
Hi3516CV610不支持。
【举例】
无。
【相关主题】
数据类型
ot_isp_rc_attr:定义ISP Radial Crop属性。
ot_isp_rc_attr
【说明】
定义ISP Radial Crop 属性。
【定义】
【成员】
【注意事项】
- 中心点的坐标以及半径的配置值可以直接采用fisheye算法的标定结果,分辨率切换之后,对应的中心点坐标与半径也要随之更新,以避免图像的不正常。
- 当VI配置输出是raw时,需要将radial crop使能关闭,否则会出现异常。需要注意在使用vi_chn_dump的dump工具时,如果需要输出after wdr之后的raw,需要关闭radial crop功能。
- Hi3516CV610不支持。
【相关数据类型及接口】
CSC
功能描述
色彩空间转换模块(Color Space Conversion),用来将RGB信号转换成符合标准的YUV信号。
API参考
- ss_mpi_isp_set_csc_attr:设定CSC(色彩空间转换)模块属性。
- ss_mpi_isp_get_csc_attr:获取CSC(色彩空间转换)模块属性。
ss_mpi_isp_set_csc_attr
【描述】
设定CSC(色彩空间转换)属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
ss_mpi_isp_get_csc_attr
【描述】
获取CSC(色彩空间转换)属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
数据类型
- OT_ISP_CSC_DC_NUM:YUV偏移量的个数。
- OT_ISP_CSC_COEF_NUM:YUV转换系数的个数。
- ot_isp_csc_attr:定义ISP 色彩空间转换模块属性。
- ot_isp_csc_matrx:定义色彩空间转换矩阵系数。
OT_ISP_CSC_DC_NUM
【说明】
YUV偏移量的个数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_CSC_COEF_NUM
【说明】
YUV转换系数的个数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
ot_isp_csc_attr
【说明】
定义ISP 色彩空间转换模块属性。
【定义】
typedef struct {
td_bool enable; /* RW; Range:[0, 1];Format:1.0; Enable/Disable CSC Function */
ot_color_gamut color_gamut; /* RW; Range: [0, 3]; Color gamut type; Not Support COLOR_GAMUT_BT2020 */
td_u8 hue; /* RW; Range:[0, 100];Format:8.0; Csc Hue Value */
td_u8 luma; /* RW; Range:[0, 100];Format:8.0; Csc Luma Value */
td_u8 contr; /* RW; Range:[0, 100];Format:8.0; Csc Contrast Value */
td_u8 satu; /* RW; Range:[0, 100];Format:8.0; Csc Saturation Value */
td_bool limited_range_en; /* RW; Range: [0x0, 0x1];
Enable/Disable: Enable Limited range output mode(default full range output) */
td_bool ext_csc_en; /* RW; Range: [0x0, 0x1]; Enable/Disable: Enable extended luma range */
td_bool ct_mode_en; /* RW; Range: [0x0, 0x1]; Enable/Disable: Enable ct mode */
ot_isp_csc_matrx csc_magtrx; /* RW; Color Space Conversion matrix */
} ot_isp_csc_attr;
【成员】
|
默认值OT_COLOR_GAMUT_BT709。Hi3519DV500/Hi3516CV610不支持OT_COLOR_GAMUT_BT2020。 |
|
【注意事项】
- enColorGamut中可选择OT_COLOR_GAMUT_BT601,OT_COLOR_GAMUT_BT709,OT_COLOR_GAMUT_BT2020,OT_COLOR_GAMUT_USER四种模式。Hi3519DV500/Hi3516CV610不支持OT_COLOR_GAMUT_BT2020模式。在选择OT_COLOR_GAMUT_USER模式下,可根据实际情况自由设定csc_magtrx的参数来进行色彩空间转换。
- 如果将contr值调小(20左右)时,在平坦区域容易出现等高线,出现的原因是因为contr值调小后,会影响画面的动态范围,导致原本0~255(或者10bit 0~1023)的动态范围缩小到原来的20%左右,因此在平坦区域如果有亮度变化,则非常容易产生量化误差出现等高线。
- Hue,luma,contr,satu参数实现的色调,亮度,对比度,饱和度调节的功能是在当前的色彩空间转换矩阵基础上进行的。当这些参数不在默认值时,会对YUV值的范围产生影响,即VI输出端的YUV数据不会准确的在Full range或Limited range规定的值的范围内。建议limited_range_en配置为Full range。
- CSC后的模块,比如Sharpen,LDCI,CA等模块,会对YUV数据进行处理。当开启这些模块时,VI输出端的YUV数据不会准确的在Full range或Limited range规定的值的范围内。建议limited_range_en配置为Full range。
- 当需要系统最终输出的YUV数据在Limited range规定的数值范围内时,可以将CSC的limited_range_en配置为Full range。设置ot_nr_v1中的limit_range_en参数,在VPSS输出端得到Limited range的YUV数据。ot_nr_v1的定义请参见《Hi35xxVxxx 3DNR参数配置说明》。
- 当系统接入YUV数据,需要通过CSC进行YUV和RGB数据之间的转换时,可以按照需要将CSC的limited_range_en配置为Full range或Limited range,或者配置ot_isp_csc_matrx参数。
- 当调节CSC的hue,luma,contr,satu等参数观察颜色变化,觉得变化较慢时,需要注意3DNR的tfs参数是否调节到12以下。tfs设置12以上的时候会有比较强的帧间延时,导致有CSC参数响应不及时的感觉。
【相关数据类型及接口】
ot_isp_csc_matrx
【说明】
定义色彩空间转换矩阵系数。
【定义】
typedef struct {
td_s16 csc_in_dc[OT_ISP_CSC_DC_NUM]; /* RW; Range:[-1024, 1023]; Format: 11.0;
Input dc component for csc matrix */
td_s16 csc_out_dc[OT_ISP_CSC_DC_NUM]; /* RW; Range:[-1024, 1023]; Format: 11.0;
Output dc component for csc matrix */
td_s16 csc_coef[OT_ISP_CSC_COEF_NUM]; /* RW; Range:[-4096, 4095]; Format: 5.10;
3x3 coefficients for csc matrix */
} ot_isp_csc_matrx;
【成员】
csc_in_dc[OT_ISP_CSC_DC_NUM] |
|
csc_out_dc[OT_ISP_CSC_DC_NUM] |
|
csc_coef[OT_ISP_CSC_COEF_NUM] |
【注意事项】
无
【相关数据类型及接口】
CLUT
功能描述
COLOR_3D_LUT是利用线性RGB空间17x17x17分格的3D LUT实现复杂的颜色调整操作,比如亮度的调整,饱和度的调整,色调的调整。阴影区域,中间亮度区域,高亮区域分别调整。
它将像素的RGB信号的bit高位用来查找像素点位于表中的位置,利用RGB信号的bit低位用来在表的一个方格中插值出精确的偏移量。将偏移量应用于原像素值,得到调整后的最终像素值,从而使颜色得到调节。

该单元通过查表的方式,获取R、G以及B分别的调节量ΔR、ΔG和ΔB。
总共需要三类查找表,R、G和B各一张表。
Hi3519DV500:大小分别为R:17x17x17x10bit,G:17x17x17x10bit,B:17x17x17x10bit,即R的调节量为[-511,511],G的调节量为[-511,511],B的调节量为[-511,511]。
CLUT调节量处理的数据是[0, 4095]范围的12bit线性RGB数据。
API参考
- ss_mpi_isp_set_clut_attr:设置CLUT属性。
- ss_mpi_isp_get_clut_attr:获取CLUT属性。
- ss_mpi_isp_set_clut_coeff:设置CLUT系数。
- ss_mpi_isp_get_clut_coeff:获取CLUT系数。
ss_mpi_isp_set_clut_attr
【描述】
设置CLUT属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
头文件:ot_common_isp.h、ss_mpi_isp.h
库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
Hi3516CV610不支持。
【举例】
无。
【相关主题】
ss_mpi_isp_get_clut_attr
【描述】
获取CLUT属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
头文件:ot_common_isp.h、ss_mpi_isp.h
库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
Hi3516CV610不支持。
【举例】
无。
【相关主题】
ss_mpi_isp_set_clut_coeff
【描述】
设置CLUT系数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
Hi3516CV610不支持
【举例】
无
【相关主题】
ss_mpi_isp_get_clut_coeff
【描述】
获取CLUT系数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
Hi3516CV610不支持
【举例】
无
【相关主题】
数据类型
- OT_ISP_CLUT_LUT_LENGTH:CLUT表的存储长度。
- ot_isp_clut_attr:CLUT的增益。
- ot_isp_clut_lut:CLUT的查找表。
OT_ISP_CLUT_LUT_LENGTH
【说明】
CLUT表转换成芯片专用格式后的存储长度。
【定义】
【注意事项】
无。
【相关数据类型及接口】
ot_isp_clut_attr
【说明】
定义CLUT的增益。
【定义】
typedef struct {
td_bool enable; /* RW; Range:[0, 1];Format:1.0; Enable/Disable CLUT Function */
td_u32 gain_r; /* RW; Range:[0, 4095];Format:12.0 */
td_u32 gain_g; /* RW; Range:[0, 4095];Format:12.0 */
td_u32 gain_b; /* RW; Range:[0, 4095];Format:12.0 */
} ot_isp_clut_attr;
【成员】
【注意事项】
- 增益设定为512时,相当于增益是1.0。增益和LUT查表得出的调整量相乘,得到实际调整量。实际调整量和输入RGB值相加得到输出RGB值。Hi3519DV500建议默认增益为512。
- Hi3516CV610不支持
【相关数据类型及接口】
无
ot_isp_clut_lut
【说明】
定义CLUT的查找表。
【定义】
【成员】
【注意事项】
由于采用了压缩存储的格式,这个表的内容会由PQTools生成。一般用户在PQTools界面调试后可以生成这个格式的LUT,不需要关心数据格式。
LUT内容在PQTools生成时符合取值范围的规定。如果客户自行生成的LUT内容超出取值范围,通过接口可以配置,但是会导致图像颜色异常。所以需要按照下面规则来生成LUT。
-
对于Hi3519DV500的用户:
如果用户不使用PQTools,需要将自行生成的3D LUT表加载到芯片。需要做的工作是将17x17x17x3的LUT放入8x3的LUT,然后将8x3的LUT紧凑排列填入长度为5508的LUT。
17x17x17x3的LUT每个元素的范围为[-511, 511],使用10bit有符号数表示。
将17x17x17x3的LUT取成8x3的LUT的过程为:
三维表的下标为偶数时定义为0,下标为奇数时定义为1。R[i][j][k],G[i][j][k],B[i][j][k]中的i代表r的分格,j代表b的分格,k代表g的分格,即ijk代表三维表的地址坐标,对应的是rbg的排列顺序。R[i][j][k],G[i][j][k],B[i][j][k]的值是deltaR,deltaG,deltaB的值。用C代表RGB,真值表如下所示:

上图对应的伪代码如下所示:
for(k = 0; k < 17; k++) { for(j = 0; j < 17; j++) { for(i = 0; i < 17; i++) { switch((i&1) + ((j&1)<<1) + ((k&1)<<2)) { case 0:R0[n0]=R[i][j][k]; G0[n0]=G[i][j][k]; B0[n0]=B[i][j][k]; case 1:R1[n1]=R[i][j][k]; G1[n1]=G[i][j][k]; B1[n1]=B[i][j][k]; case 2:R2[n2]=R[i][j][k]; G2[n2]=G[i][j][k]; B2[n2]=B[i][j][k]; case 3:R3[n3]=R[i][j][k]; G3[n3]=G[i][j][k]; B3[n3]=B[i][j][k]; case 4:R4[n4]=R[i][j][k]; G4[n4]=G[i][j][k]; B4[n4]=B[i][j][k]; case 5:R5[n5]=R[i][j][k]; G5[n5]=G[i][j][k]; B5[n5]=B[i][j][k]; case 6:R6[n6]=R[i][j][k]; G6[n6]=G[i][j][k]; B6[n6]=B[i][j][k]; case 7:R7[n7]=R[i][j][k]; G7[n7]=G[i][j][k]; B7[n7]=B[i][j][k]; } } } }用C代表RGB,取成的8个LUT分别为c0[729]、c1[648]、c2[648]、c3[576]、c4[648]、c5[576]、c6[576]、c7[512]。
下面的描述用_0代表一维数组c0[729]第0个数据,_1代表一维数组c0[729]第1个数据。
8x3的LUT按照每3个数据紧凑排列到1个32bit数据内的格式定义为:
{2’b00,B0_0,G0_0,R0_0},
{2’b00,B1_0,G1_0,R1_0},
{2’b00,B2_0,G2_0,R2_0},
{2’b00,B3_0,G3_0,R3_0},
{2’b00,B0_1,G0_1,R0_1},
{2’b00,B1_1,G1_1,R1_1},
{2’b00,B2_1,G2_1,R2_1},
{2’b00,B3_1,G3_1,R3_1},
{......},
上述格式可视化如下图所示:

整体看如下图所示:

8x3的LUT按照c0[729] 占用空间729 x 4 = 2916和c4[648]占用空间648 x 4 = 2592连续存储成一个长度为5508的一维数组。
-
Hi3516CV610不支持
【相关数据类型及接口】
无
获取ISP模块虚拟地址
功能描述
从地址空间来分,当前ISP模块可分为五个部分:AE库、AWB库、AF库、ISP物理寄存器模块、ISP其他模块。
API参考
ss_mpi_isp_get_isp_reg_attr:获取ISP基地址属性。
ss_mpi_isp_get_isp_reg_attr
【描述】
获取ISP基地址属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
当前ISP模块虚拟地址不提供AF模块的虚拟地址。
【举例】
无
【相关主题】
无
数据类型
ot_isp_reg_attr:定义ISP各子模块寄存器的虚拟地址属性。
ot_isp_reg_attr
【说明】
定义ISP各子模块寄存器的虚拟地址属性。
【定义】
typedef struct {
td_void *isp_ext_reg_addr;
td_u32 isp_ext_reg_size;
td_void *ae_ext_reg_addr;
td_u32 ae_ext_reg_size;
td_void *awb_ext_reg_addr;
td_u32 awb_ext_reg_size;
} ot_isp_reg_attr;
【成员】
【注意事项】
无
【相关数据类型及接口】
查询内部状态信息
功能描述
Inner State Information接口的作用是输出数个与ISO相关的参数其逻辑寄存器当前配置的真实值。
用户在调试过程中可以通过MPI接口读取这些真实值参数,观察参数强度是否正确配置。通过该接口用户只可以获取参数,而非操作改变该寄存器里的值。
API参考
ss_mpi_isp_query_inner_state_info:获取内部寄存器实际强度配置信息和内部状态。
ss_mpi_isp_query_inner_state_info
【描述】
获取内部寄存器实际强度配置和内部状态。
【语法】
td_s32 ss_mpi_isp_query_inner_state_info(ot_vi_pipe vi_pipe, ot_isp_inner_state_info *inner_state_info);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
- 当用户切换分辨率或者在线性模式和WDR模式之间切换时候,可以调用这个接口来查询切换是否已经完成。
- 分辨率/帧率切换时,只查询 res_switch_finish标记。模式切换时,只查询 wdr_switch_finish标记。
- 业务正常运转时,在不改变WDR模式的情况下,合法调用ss_mpi_isp_set_pub_attr,查询到的wdr_switch_finish始终为1。
【举例】
无
【相关主题】
无
数据类型
ot_isp_inner_state_info:定义内部寄存器实际配置信息参数。
ot_isp_inner_state_info
【说明】
定义内部寄存器实际配置信息参数。
【定义】
typedef struct {
td_u16 texture_strength[OT_ISP_SHARPEN_GAIN_NUM];
td_u16 edge_strength[OT_ISP_SHARPEN_GAIN_NUM];
td_u16 texture_freq;
td_u16 edge_freq;
td_u8 over_shoot;
td_u8 under_shoot;
td_u8 shoot_sup_strength;
td_u8 nr_lsc_ratio;
td_u16 coarse_strength[OT_ISP_BAYER_CHN_NUM];
td_u8 wdr_frame_strength[OT_ISP_WDR_MAX_FRAME_NUM];
td_u8 fine_strength;
td_u16 coring_wgt;
td_u16 dehaze_strength_actual;
td_u16 drc_strength_actual;
td_u32 wdr_exp_ratio_actual[OT_ISP_WDR_MAX_FRAME_NUM - 1];
td_bool wdr_switch_finish;
td_bool res_switch_finish;
td_u16 black_level_actual[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_BAYER_CHN_NUM];
td_u16 sns_black_level[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_BAYER_CHN_NUM];
} ot_isp_inner_state_info;
【成员】
texture_strength[OT_ISP_SHARPEN_GAIN_NUM] |
|
edge_strength[OT_ISP_SHARPEN_GAIN_NUM] |
|
图像overshoot和undershoot的抑制强度。用于在保证清晰度不明显下降的前提下,抑制锐化后的overshoot和undershoot的宽度和幅度。 |
|
coarse_strength[OT_ISP_BAYER_CHN_NUM] |
|
wdr_frame_strength[OT_ISP_WDR_MAX_FRAME_NUM] |
|
wdr_exp_ratio_actual[OT_ISP_WDR_MAX_FRAME_NUM - 1] |
2to1时用wdr_exp_ratio_actual[0]表示曝光比 3to1时用wdr_exp_ratio_actual[0]及wdr_exp_ratio_actual[1]表示曝光比 |
black_level_actual[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_BAYER_CHN_NUM] |
|
sns_black_level[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_BAYER_CHN_NUM] |
【注意事项】
- 使用user_black_level_en后,black_level_actual为user_black_level;不使能user_black_level_en时,black_level_actual与sns_black_level的值是一致的。
- wdr_exp_ratio_actual是长短帧实际的曝光比,和wdr融合使用的曝光比不是同一个数值。因为sensor曝光精度问题,wdr_exp_ratio_actual的值可能会与wdr_exp_ratio有细微的偏差,有可能会超出wdr_exp_ratio的限制范围,这是符合预期的。
【相关数据类型及接口】
ss_mpi_isp_query_inner_state_info
DNG
功能描述
DNG (Digital Negative)是Adobe开发的一种开放的raw image file format,里面使用的tag基本上都定义在TIFF或者TIFF/EP中,在DNG Sepcification中只是定义或者建议了数据的组织方式,颜色空间的转换等等。DNG spec标准文档来定义和确定具体的dng数据格式,对标准文档中定义的标签和规定,根据实际应用场景和客户需求选择必要的最小集合实现。将raw数据封装成标准dng文件,可以由dng解析工具进行解析。
API参考
- ss_mpi_isp_get_dng_image_static_info:获取DNG静态信息。
- ss_mpi_isp_set_dng_color_param:设置DNG颜色信息。
- ss_mpi_isp_get_dng_color_param:获取DNG颜色信息。
ss_mpi_isp_get_dng_image_static_info
【描述】
获取DNG静态信息。
【语法】
td_s32 ss_mpi_isp_get_dng_image_static_info(ot_vi_pipe vi_pipe , ot_isp_dng_image_static_info *dng_image_static_info);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
无
ss_mpi_isp_set_dng_color_param
【描述】
设置DNG颜色信息。
【语法】
td_s32 ss_mpi_isp_set_dng_color_param(ot_vi_pipe vi_pipe , const ot_isp_dng_color_param *dng_color_param);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
无
ss_mpi_isp_get_dng_color_param
【描述】
获取DNG颜色信息。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
无
数据类型
- OT_CFACOLORPLANE:滤色阵列的数目。
- ot_isp_dng_image_static_info:定义DNG静态格式信息。
- ot_isp_dng_color_param:定义DNG白平衡校正系数。
- ot_isp_dng_cfa_layout_type:定义滤色阵列类型。
- ot_isp_dng_srational:定义DNG除法结构体。
- ot_isp_dng_black_level_repeat_dim:定义黑电平像素重复维度。
- ot_isp_dng_default_scale:定义将图像转换成方形像素默认的缩放系数。
- ot_isp_dng_repeat_pattern_dim:定义DNG颜色分量重复次数。
- ot_isp_dng_raw_format:定义DNG RAW格式。
- ot_isp_dng_wb_gain:定义在不同光源下的白平衡增益校正值。
- ot_isp_dng_ccm_tab:定义DNG 的ccm校正系数。
OT_CFACOLORPLANE
【说明】
滤色阵列的数目。
【定义】
【注意事项】
无。
【相关数据类型及接口】
ot_isp_dng_image_static_info
【说明】
定义DNG静态格式信息。
【定义】
typedef struct {
ot_isp_dng_raw_format dng_raw_format;
ot_isp_dng_srational color_matrix1[OT_ISP_CCM_MATRIX_SIZE];
ot_isp_dng_srational color_matrix2[OT_ISP_CCM_MATRIX_SIZE];
ot_isp_dng_srational camera_calibration1[OT_ISP_CCM_MATRIX_SIZE];
ot_isp_dng_srational camera_calibration2[OT_ISP_CCM_MATRIX_SIZE];
ot_isp_dng_srational forward_matrix1[OT_ISP_CCM_MATRIX_SIZE];
ot_isp_dng_srational forward_matrix2[OT_ISP_CCM_MATRIX_SIZE];
td_u8 calibration_illuminant1;
td_u8 calibration_illuminant2;
} ot_isp_dng_image_static_info;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_dng_color_param
【说明】
定义DNG白平衡校正系数。
【定义】
typedef struct {
ot_isp_dng_wb_gain wb_gain1;
ot_isp_dng_wb_gain wb_gain2;
ot_isp_dng_ccm_tab ccm_tab1;
ot_isp_dng_ccm_tab ccm_tab2;
} ot_isp_dng_color_param;
【成员】
【注意事项】
判断高色温的条件为r_gain高,b_gain低。
【相关数据类型及接口】
无
ot_isp_dng_cfa_layout_type
【说明】
定义DNG 滤色阵列类型。
【定义】
typedef enum {
OT_ISP_CFALAYOUT_TYPE_RECTANGULAR = 1,
OT_ISP_CFALAYOUT_TYPE_A,
OT_ISP_CFALAYOUT_TYPE_B,
OT_ISP_CFALAYOUT_TYPE_C,
OT_ISP_CFALAYOUT_TYPE_D,
OT_ISP_CFALAYOUT_TYPE_E,
OT_ISP_CFALAYOUT_TYPE_F,
OT_ISP_CFALAYOUT_TYPE_G,
OT_ISP_CFALAYOUT_TYPE_H,
OT_ISP_CFALAYOUT_TYPE_BUTT
} ot_isp_dng_cfa_layout_type;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_dng_srational
【说明】
定义DNG 除法结构体。
【定义】
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_dng_black_level_repeat_dim
【说明】
定义黑电平像素重复维度。
【定义】
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_dng_default_scale
【说明】
定义将图像转换成方形像素默认的缩放系数。
【定义】
typedef struct {
ot_isp_dng_srational default_scale_hor;
ot_isp_dng_srational default_scale_ver;
} ot_isp_dng_default_scale;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_dng_repeat_pattern_dim
【说明】
定义DNG颜色分量重复次数。
【定义】
typedef struct {
td_u16 repeat_pattern_dim_row;
td_u16 repeat_pattern_dim_col;
} ot_isp_dng_repeat_pattern_dim;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_dng_raw_format
【说明】
定义DNG RAW数据格式。
【定义】
typedef struct {
td_u8 bits_per_sample;
td_u8 cfa_plane_color[OT_CFACOLORPLANE];
ot_isp_dng_cfa_layout_type cfa_layout;
ot_isp_dng_black_level_repeat_dim black_level_repeat_dim;
td_u32 white_level;
ot_isp_dng_default_scale default_scale;
ot_isp_dng_repeat_pattern_dim cfa_repeat_pattern_dim;
td_u8 cfa_pattern[OT_ISP_BAYER_CHN_NUM];
} ot_isp_dng_raw_format;
【成员】
cfa_plane_color[OT_CFACOLORPLANE] |
|
cfa_pattern[OT_ISP_BAYER_CHN_NUM] |
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_dng_wb_gain
【说明】
定义DNG 白平衡校正系数。
【定义】
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_dng_ccm_tab
【说明】
定义DNG 的ccm校正系数。
【定义】
【成员】
【注意事项】
无
【相关数据类型及接口】
无
MeshShading量产标定工具
功能描述
本模块用于在Hi3519DV500上实现对单一光源的在线Mesh LSC标定功能。具体调用实例可参考开发包中的lsc_online_cali用例。本模块可针对单一光源生成符合Hi3519DV500中Mesh LSC的标定数据。
在使用本模块进行标定过程中,标定环境与离线标定MLSC时需要的标定环境相同。
在进行Mesh LSC在线标定前,首先需要确定mesh_scale的大小,具体做法为:在需要标定的一批次镜头中,挑选几个典型的镜头样本,将样本镜头在实验室环境运行量产Shading在线标定的用例并预设mesh_scale的值,例如预设的mesh_scale =1,运行用例的时候,报出以下打印Please set mesh scale to 2,表示当前挑选的镜头的Shading的倍数大于4倍,且小于8倍,将打印推荐的mesh_scale=2重新进行预设,并运行Mesh LSC在线标定程序得到MeshShading Table,将MeshShading Table和mesh_scale导入到PQ工具中,开启Mesh Shading校正模块,观察画面的四周的镜头阴影区是否得到合理校正且画面整体亮度无异常。如果镜头的Shading得到了合理的校正,接下来将实验室环境得到mesh_scale值,再大规模应用到产线标定中。
以上做法是基于假设同一批次的镜头,Shading的程度表现差异不大,如果不同批次的镜头,需要在实验室环境重新确定MeshScale的大小。
MeshShading差异的校正过程:
- 产线上Shading校正时,对于消费类sensor不同的模式,可以在线抓取其中最大分辨率下对应光源的RAW(如5000K色温),其余模式下的分辨率,可以根据与最大分辨率的相对位置,调用ss_mpi_isp_mesh_shading_calibration接口,标定得到对应光源RAW的MeshShading Table表。
- 在步骤1得到MeshShading Table表的基础上,用户调用ss_mpi_isp_set_mesh_shading_gain_lut_attr接口将生成的MeshShading Table表写入到板端的Flash,以便于下次机器上电能够获取到相关的Mesh Shading Table表。
API参考
ss_mpi_isp_mesh_shading_calibration:获取Mesh LSC在线标定结果。
ss_mpi_isp_mesh_shading_calibration
【描述】
获取Mesh LSC在线标定结果。
【语法】
td_s32 ss_mpi_isp_mesh_shading_calibration(ot_vi_pipe vi_pipe,const td_u16 *src_raw, ot_isp_mlsc_calibration_cfg *mlsc_cali_cfg, ot_isp_mesh_shading_table *mlsc_table)
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
请参考sample(mpp/sample/lsc_online_cali)当中的在线标定(lsc_online_cali)对该接口的使用方法。如果用户需要自行调用,请注意src_raw是一个指向图像Raw数据的指针,接口内部无法对传入数据的长度进行检验,必须在外部分配正确,否则会出现内存越界错误。分配的空间长度与mlsc_calib_cfg结构体中定义的长和宽相关,请按照下面的示例来分配Raw的内存空间:
【举例】
无
【相关主题】
无
数据类型
- ot_isp_mlsc_calibration_cfg:定义MLSC在线标定CFG参数信息。
- ot_isp_mesh_shading_table:定义MLSC标定结果格式。
ot_isp_mlsc_calibration_cfg
【说明】
定义MLSC在线标定CFG参数信息。
【定义】
typedef struct {
ot_isp_bayer_format bayer;
ot_isp_bayer_raw_bit raw_bit;
td_u16 img_height;
td_u16 img_width;
td_u16 dst_img_height;
td_u16 dst_img_width;
td_u16 offset_x;
td_u16 offset_y;
td_u32 mesh_scale;
td_u16 blc_offset_r;
td_u16 blc_offset_gr;
td_u16 blc_offset_gb;
td_u16 blc_offset_b;
} ot_isp_mlsc_calibration_cfg;
【成员】
【注意事项】
mesh_scale的取值范围为[0, 7],其分别对应的Gain值精度选择如下:
- Mesh Shading在线标定时需要减去黑电平,设置各颜色通道的黑电平时要以12bit为基准,因此输入Raw的比特位宽也一定要相同。
- 当使用裁剪的接口dst_img_height,dst_img_width,offset_x,offset_y时,注意偏移值和裁剪图像的宽高不要超出输入图像的宽高。
【相关数据类型及接口】
无
ot_isp_mesh_shading_table
【说明】
定义MLSC标定结果格式。
【定义】
typedef struct {
td_u8 mesh_scale;
td_u16 x_grid_width[OT_ISP_MLSC_X_HALF_GRID_NUM];
td_u16 y_grid_width[OT_ISP_MLSC_Y_HALF_GRID_NUM];
ot_isp_shading_gain_lut lsc_gain_lut;
} ot_isp_mesh_shading_table;
【成员】
x_grid_width[OT_ISP_MLSC_X_HALF_GRID_NUM] |
|
y_grid_width[OT_ISP_MLSC_Y_HALF_GRID_NUM] |
|
【注意事项】
无
【相关数据类型及接口】
无
Auto Flicker Type Detection
功能描述
Auto Flicker Type Detection (自动工频闪类型检测)是一个结合软件和硬件一起实现的算法。该算法能够计算出当前环境光源的频闪频率是50Hz还是60Hz。
须知:
- 在某些环境中,当存在有50Hz光源和60Hz光源来回变动的情况时(比如在室内50Hz的灯光下,用户可能会关闭灯光,打开60Hz光源的电视),Camera无法应用合适的抗闪参数。所以此时需要检测出当前环境光源的工频闪频率,Camera根据当前环境光源的工频闪频率适配合适的抗闪参数。
- 目前工频闪类型计算在vpss节点获取图像数据进行计算,前端的DIS、LDC、鱼眼校正等模块如果对图像的内容形态改变过大会影响工频闪类型计算的准确性。另外图像噪声过大,也会影响工频闪类型计算的准确性。
API参考
ss_mpi_isp_calc_flicker_type: 获取工频闪类型检测的结果。
ss_mpi_isp_calc_flicker_type
【描述】
输出帧信息,获取工频闪类型检测的结果。
【语法】
ss_mpi_isp_calc_flicker_type(ot_vi_pipe vi_pipe, ot_isp_calc_flicker_input *input_param, ot_isp_calc_flicker_output *output_param, ot_video_frame_info frame[], td_u32 array_size);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ss_mpi_isp.h
- 库文件:libcalcflicker.a
【注意】
- 必须使用连续的3帧数据进行计算,输入的array_size帧数需要等于3。同时frame[]指向的数据必须保证有效。
- 计算的帧数据的分辨率不能超过ISP模块最大能够处理的图像分辨率。
- 为了加快计算速度,接口内部使用VGS硬件模块参与计算,所以用于计算工频闪的图像分辨率不能超过VGS的最大处理分辨率范围。
- 在不同频闪混合的光源下,比如光源环境同时存在50Hz和60Hz的光源,或者工频闪光源只占整个环境光源非常小的一部分,容易出现误判。
- Sample用例中有使用ss_mpi_vpss_get_grp_frame接口(接口具体信息请参见《MPP 媒体处理软件Vx.y开发参考》的VPSS章节)获取3帧数据,但此接口只在Vpss模块工作在离线模式时才有效。当Vpss处于在线模式时,无法获取有效帧数据进行工频闪类型计算。
- 可以参考附录工频闪类型自适应Sample用例处理流程。
【举例】
ot_vi_pipe vi_pipe = 0;
td_u16 frame_num = 3;
ot_video_frame_info frame[3];
ot_isp_calc_flicker_input input_param;
ot_isp_calc_flicker_output output_param;
ot_isp_exp_info exp_info;
ss_mpi_isp_query_exposure_info(vi_pipe, &exp_info);
input_param. lines_per_second = exp_info.lines_per500ms*2
.. .. ..
获取3帧连续帧数据给 frame[3](此处略)
.. .. ..
ret = ss_mpi_isp_calc_flicker_type(vi_pipe, input_param, output_param, frame, frame_num);
【相关主题】
无
数据类型
- ot_isp_calc_flicker_input:定义计算工频闪需要的输入参数。
- ot_isp_calc_flicker_output:定义自动工频闪类型检测输出结果。
ot_isp_calc_flicker_input
【说明】
定义计算工频闪输入参数。
【定义】
【成员】
【注意事项】
- lines_per_second 等于1秒的最大总曝光行数,比如一帧的最大曝光时间为1125行,帧率为30fps,那么lines_per_second = 1125*30。通常,可以使用ot_isp_exp_info这个结构体成员变量lines_per500ms乘以2。
- 需要注意这里的1行时间需要和1行数据的Readout Timing的时间相等,一般sensor的曝光行数单位时间和Readout 1行的时间相同,需要注意少部分sensor的Readout 1行时间等于2行,那么计算lines_per_second时需要除以2。其他等效倍率则除以相应的倍率。
【相关数据类型及接口】
ot_isp_calc_flicker_output
【说明】
定义自动工频闪类型检测输出结果。
【定义】
typedef struct {
ot_isp_calc_flicker_type flicker_type; /*The calculate result of flicker type*/
} ot_isp_calc_flicker_output;
【成员】
ot_isp_calc_flicker_type: 工频闪计算结果。有以下4种状态: |
【注意事项】
无
【相关数据类型及接口】
Auto Color Shading
功能描述
Auto Color Shading (ACS)算法是一个软件上实现的算法,该算法能够根据场景自适应地生成LSC的校正表,通过配置Mesh Shading的Lut校正表,从而能够减轻或消除镜头和sensor造成的color shading。该算法需要在使用前进行标定,标定的数据预先放入cmos.c中。
API参考
- ss_mpi_isp_set_auto_color_shading_attr:设置Auto Color Shading属性参数。
- ss_mpi_isp_get_auto_color_shading_attr:获取Auto Color Shading属性参数。
ss_mpi_isp_set_auto_color_shading_attr
【描述】
设置Auto Color Shading属性参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libacs.a
【注意】
无
【举例】
无
【相关主题】
ss_mpi_isp_get_auto_color_shading_attr
ss_mpi_isp_get_auto_color_shading_attr
【描述】
获取Auto Color Shading属性参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libacs.a
【注意】
无
【举例】
无
【相关主题】
ss_mpi_isp_set_auto_color_shading_attr
数据类型
ot_isp_acs_attr:定义Auto Color Shading属性参数。
ot_isp_acs_attr
【说明】
定义Auto Color Shading属性参数。
【定义】
typedef struct {
td_bool enable;
td_u16 y_strength;
td_u16 run_interval;
td_bool lock_en;
} ot_isp_acs_attr;
【成员】
【注意事项】
- ACS模块运行需要正确参考AWB统计,ACS未开启时,AWB统计模块位置ot_isp_awb_switch设置在OT_ISP_AWB_AFTER_DG;ACS开启时,会自动设置到OT_ISP_AWB_AFTER_EXPANDER,应保持该设置,若此后再手动设置为别的位置后,容易造成ACS震荡等问题。
- ACS模块开关与LSC的模块开关互不影响。ACS算法通过调用LSC的接口来配置Lut校正表,需要看到ACS模块效果时,Mesh Shading模块开关必须使能。
- 关闭ACS模块使能开关时,LSC的Lut表会恢复到未开ACS前的状态。
- ACS会参考mesh_scale的值来配置LSC相应的Lut表,cmos中bit1_lsc使能时会参考cmos中LSC的mesh_scale配置。
- 推荐mesh_scale的值取0~3,而不是4~7,因为4~7无法表示小于1倍的值,当y_strength的值较小时,校正Color Shading可能需要小于1倍的值。
- 开启ACS模块时需要使能cmos中的bit1_acs,ACS会读取驱动文件中配置好的标定参数。当cmos中bit1_lsc使能时,ACS需要配置为golden sample的标定结果,同时lsc_lut.lsc_gain_lut[0]配置为golden sample在D50下标定的表,lsc_lut.lsc_gain_lut[1]配置为当前镜头模组在D50下标定的表,可以解决镜头的一致性问题,模组和golden之间的差异越小,校正的效果越好。如果只用当前模组进行标定,则需要关闭cmos中bit1_lsc使能,否则会影响校正效果。
【相关数据类型及接口】
无
Expander
功能描述
部分sensor内部会做多帧曝光的融合,融合后数据位宽会增大,导致输出成本增大。为减少输出的成本,sensor内部会做数据分段压缩,将数据压缩到一个比较小的位宽。在ISP中为了将数据还原,需要将sensor内部压缩的数据,进行解压缩。
API参考
- ss_mpi_isp_set_expander_attr:设置expander属性参数。
- ss_mpi_isp_get_expander_attr:获取expander属性参数。
ss_mpi_isp_set_expander_attr
【描述】
设置expander属性参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
ss_mpi_isp_get_expander_attr
【描述】
获取expander属性参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
数据类型
- OT_ISP_EXPANDER_NODE_NUM:定义expander lut的深度。
- OT_ISP_EXPANDER_POINT_NUM_MAX:定义expander拐点数目的最大值。
- ot_isp_expander_attr:定义expander属性参数。
OT_ISP_EXPANDER_NODE_NUM
【说明】
定义expander lut的深度。
【定义】
Hi3519DV500:
Hi3516CV610:
【注意事项】
无
【相关数据类型及接口】
OT_ISP_EXPANDER_POINT_NUM_MAX
【说明】
定义expander拐点数目的最大值。
【定义】
#define OT_ISP_EXPANDER_POINT_NUM_MAX ([OT_ISP_EXPANDER_NODE_NUM](#ZH-CN_TOPIC_0000001338276986) - 1)
【注意事项】
无
【相关数据类型及接口】
ot_isp_expander_attr
【说明】
定义expander属性参数。
【定义】
typedef struct {
td_bool enable;
td_u8 bit_depth_in;
td_u8 bit_depth_out;
td_u16 knee_point_num;
ot_point knee_point_coord[OT_ISP_EXPANDER_POINT_NUM_MAX];
} ot_isp_expander_attr;
【成员】
|
|
|
|
knee_point_coord[OT_ISP_EXPANDER_POINT_NUM_MAX] |
【注意事项】
-
在sensor手册中会给出sensor在sensor built-in模式下内部压缩时使用的拐点配置,需要将这几个拐点配置按照对应的原则进行转换,然后配置到knee_point_coord中即可。
-
Hi3519DV500转换原则如下:
- knee_point_coord的横坐标x需要根据sensor压缩曲线转换到[0,256]之间(8bit),例如sensor压缩输出的后有效数据位宽是12bit,则需要将sensor压缩曲线拐点的纵坐标右移4bit得到knee_point_coord的横坐标x;
- knee_point_coord的纵坐标y需要根据sensor压缩曲线转换到[0,1048576]之间(20bit),例如sensor合成有效数据未压缩之前有效位宽是16bit,则需要将sensor压缩曲线的拐点的横坐标左移4bit,得到knee_point_coord的纵坐标y。
- 不必配置(0,0)的拐点坐标,代码内部在进行插值时,会自动将(0,0)作为第一个拐点坐标。
-
Hi3516CV610转换原则如下:
- knee_point_coord的横坐标x需要根据sensor压缩曲线转换到[0,128]之间(7bit),例如sensor压缩输出的后有效数据位宽是12bit,则需要将sensor压缩曲线拐点的纵坐标右移5bit得到knee_point_coord的横坐标x;
- knee_point_coord的纵坐标y需要根据sensor压缩曲线转换到[0,131072]之间(17bit),例如sensor合成有效数据未压缩之前有效位宽是16bit,则需要将sensor压缩曲线的拐点的横坐标左移1bit,得到knee_point_coord的纵坐标y。
- 不必配置(0,0)的拐点坐标,代码内部在进行插值时,会自动将(0,0)作为第一个拐点坐标。
-
-
高频次的动态修改expander的拐点配置,可能会导致同一幅图像使用不同的解压缩曲线
- expander拐点会影响built-in模式下BE黑电平的配置,动态调节expander拐点,图像可能会有颜色的跳变。
- Hi3516CV610不支持在线模式下配置expander参数,仅可配置使能参数。
【相关数据类型及接口】
Local BLC
功能描述
某些sensor在一些情况下会出现局部BLC不一致的情况,这样有可能会导致局部的偏色,Local BLC可以根据标定好的数据分区域校正BLC,使BLC在各个区域保持一致。
Local BLC算法使用Mesh(网格)方式对画面进行标定/矫正,算法会将整个Bayer域画面分割成32x32个子区域,这32x32个区域大小大致相等,算法将分别对RAW域中的每个通道进行处理。
FPN也可以校正局部BLC不一致,建议在FPN不方便使用的情况下考虑使用Local BLC。
Local BLC位于FE0,算法参数由离线标定工具生成,标定精度16bit,不建议手动调试。
说明:
Hi3516CV610不支持此模块。
API参考
- ss_mpi_isp_set_lblc_attr:设置Local BLC算法参数。
- ss_mpi_isp_get_lblc_attr:获取Local BLC算法参数。
- ss_mpi_isp_set_lblc_lut_attr:设定Local BLC表属性。
- ss_mpi_isp_get_lblc_lut_attr:获取Local BLC表属性。
ss_mpi_isp_set_lblc_attr
【描述】
设置Local BLC算法参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a, libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
ss_mpi_isp_get_lblc_attr
【描述】
获取Local BLC算法参数。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a, libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
ss_mpi_isp_set_lblc_lut_attr
【描述】
设定Local BLC表属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
ss_mpi_isp_get_lblc_lut_attr
【描述】
获取Local BLC表属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无。
【举例】
无。
【相关主题】
数据类型
- OT_ISP_LBLC_GRID_POINTS:定义Local BLC分块格点的数量。
- ot_isp_lblc_attr:定义Local BLC算法的参数。
- ot_isp_lblc_lut_attr:定义Local BLC表的参数。
OT_ISP_LBLC_GRID_POINTS
【说明】
定义Local BLC分块格点的数量。
【定义】
#define OT_ISP_LBLC_GRID_COL 33
#define OT_ISP_LBLC_GRID_ROW 33
#define OT_ISP_LBLC_GRID_POINTS (OT_ISP_LBLC_GRID_COL * OT_ISP_LBLC_GRID_ROW)
【注意事项】
无。
【相关数据类型及接口】
ot_isp_lblc_attr
【说明】
定义Local BLC算法的参数。
【定义】
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_lblc_lut_attr
【说明】
定义Local BLC表的属性,该表一般通过标定获取,不建议手动调试。
【定义】
typedef struct {
td_u16 offset_r;
td_u16 offset_gr;
td_u16 offset_gb;
td_u16 offset_b;
td_u16 mesh_blc_r[OT_ISP_LBLC_GRID_POINTS];
td_u16 mesh_blc_gr[OT_ISP_LBLC_GRID_POINTS];
td_u16 mesh_blc_gb[OT_ISP_LBLC_GRID_POINTS];
td_u16 mesh_blc_b[OT_ISP_LBLC_GRID_POINTS];
} ot_isp_lblc_lut_attr;
【成员】
mesh_blc_r[OT_ISP_LBLC_GRID_POINTS] |
R通道Mesh分块的BLC表,该数组表示画面从左至右、从上至下的网格交点处的R分量的数据值。取值范围:[0, 16383] |
mesh_blc_gr[OT_ISP_LBLC_GRID_POINTS] |
Gr通道Mesh分块的BLC表,该数组表示画面从左至右、从上至下的网格交点处的Gr分量的数据值。取值范围:[0, 16383] |
mesh_blc_gb[OT_ISP_LBLC_GRID_POINTS] |
Gb通道Mesh分块的BLC表,该数组表示画面从左至右、从上至下的网格交点处的Gb分量的数据值。取值范围:[0, 16383] |
mesh_blc_b[OT_ISP_LBLC_GRID_POINTS] |
B通道Mesh分块的BLC表,该数组表示画面从左至右、从上至下的网格交点处的B分量的数据值。取值范围:[0, 16383] |
【注意事项】
增益表的默认配置与ot_isp_cmos_alg_key中的bit1_lblc 标志位有关,如果bit1_lblc=1,则采用cmos_ex.h中的配置值作为默认值;否则默认配置为4096。
【相关数据类型及接口】
统计信息
概述
ISP提供的3A统计信息、运动区域占比统计信息及相关配置。
功能描述
AE统计信息
实现自动曝光信息的统计,软件根据统计信息调节sensor可实现自动曝光的功能。AE统计信息包含分区间的R/Gr/Gb/B均值统计、带权重的全局R/Gr/Gb/B均值、1024段直方图信息。
AE 区域统计信息
每个分块均可以输出16bit R,Gr,Gb,B均值(Average R/Gr/Gb/B)。以R、Gr为例,区块的统计信息读取地址与数据的对应关系如表1所示。m表示水平分区个数,n表示垂直分区个数。
表 1 AE区域统计信息
【注意事项】
Hi3519DV500支持:
- 最大支持17×15分块。
- 输入最小分辨率为64x64。
- 分区域统计信息每块最小分辨率为20x15。
- 输入分辨率宽高必须是偶数。
- 默认分块情况下支持最小分辨率为340x226。
Hi3516CV610支持:
- 最大支持32×32分块。
- 输入最小分辨率为120x120。
- 分区域统计信息每块最小分辨率为20x15。
- 输入分辨率宽高必须是偶数。
- 当分辨率小于640x480时,分块数变为17*15,当分辨率小于340x226时,分块数变成6*8。
带权重的AE全局统计信息
与AE的区域统计信息基本一致,对于整幅图像,AE也提供了4个全局统计信息。分别为OT_ISP_AE_TOTAL_R_AVER,OT_ISP_AE_TOTAL_GR_AVER,OT_ISP_AE_TOTAL_GB_AVER,OT_ISP_AE_TOTAL_B_AVER。其物理意义与分块统计一致。
带权重的AE直方图信息
AE提供1024阶直方图统计0-1023,直方图信息读取地址与数据的对应关系如表1所示。
表 1 AE直方图统计信息
AE支持FourPlaneMode模式,在FourPlaneMode模式下,AE提供四通道256段直方图统计0~255,直方图信息读取地址与数据的对应关系如表2所示。
表 2 AE直方图统计信息
MG统计信息
MG模块统计DRC后分块均值,与AE统计分块均值相比,可以得出分块均值增益最大值。MG统计信息包含分区间R/Gr/Gb/B均值统计。
MG区域统计信息
MG最大支持17×15分块,最小支持1×1分块,每个分块均可以输出8bit R,Gr,Gb,B均值(Average R/Gr/Gb/B)。区块的统计信息读取地址与数据的对应关系如表1所示。m表示水平分区个数,n表示垂直分区个数。
表 1 MG区域统计信息
AWB统计信息
AWB统计信息包含全局统计信息和区域统计信息。
- 全局统计信息:整幅图像的R,G,B均值,以及有效统计点的个数。
- 区域统计信息:最大支持图像的32x32分块,最小支持图像的2x2分块,每个分块均可以输出R,G,B均值,以及有效统计点的个数。
AWB中统计的有效点,除了要满足配置的RGB上限与下限要求外(black_level,white_level),像素点颜色还需要满足配置的有效像素颜色空间,具体如图1所示,绿色区块内的为有效像素的颜色范围。

AWB统计的有效像素区域是一个四边形,其中上下左右四个边界由cr_ref_min/max, cb_ref_min/max这4个参数决定,它们代表了允许的r/g, b/g的最大与最小值。
AWB区域统计信息
AWB中最大支持图像的32x32分块,最小支持图像的2x2分块,每个分块均可以输出R、G、B均值(Average R/G/B)。其中统计的像素点均为16bit,分块内统计有效点个数Count All,点数统计值均已根据图像大小做了归一化处理,归一化到16bit。同时,每一个分块支持分亮度区间进行统计,最大支持分4个亮度区间。区块的统计信息读取地址与数据的对应关系如表1所示。
须知:
- 当分辨率较小,分块数较多时,如果每块的分辨率小于60x14,那么需要减少分块数,以免每块过小。建议在分辨率小的情况下,使用较少的分块数。
- 如果要输出低分辨率,需要在业务启动的时候设置一个比较小的AWB统计信息分块数。
表 1 AWB区域统计信息
AWB全局统计信息
与AWB的区域统计信息基本一致,对于整幅图像,AWB也提供了四个全局统计信息。分别为ISP_AWB_AVG_R/G/B,ISP_AWB_CNT_ALL。其物理意义与分块统计一致。
运动区域占比统计信息
- 通过调度接口ss_mpi_isp_set_stats_cfg,将ot_isp_motion_stats_cfg中motion_stats_en使能打开后,会统计大于motion_thr阈值的像素点个数,并计算占比,将此占比认为是运动区域占比。具体相关约束可见ot_isp_motion_stats_cfg的相关配置。
- 可通过接口ss_mpi_isp_get_motion_stats进行获取运动区域占比统计信息。
detail_stats分块统计信息
- detail_stats统计整幅图像,ss_mpi_isp_set_stats_cfg接口设置的crop信息无法作用在detail_stats统计信息上。detail_stats统计的是整幅图像的分块统计信息,包括ae分块统计信息和awb分块统计信息,相比AE 区域统计信息、AWB区域统计信息而言,提供的分块更精细, 分块数更多,占用内存较大。打开detail_stats统计信息统计功能,系统性能会降低,多占用VIPROC性能=帧率/interval.
- detail_stats统计信息,只受BE中的blc和isp_dgain模块影响,不受其他模块影响,调节其他模块效果,detail_stats统计信息不受影响。
-
ss_mpi_isp_set_detail_stats_cfg接口设置分块数,col代表列划分大块数,最大值为OT_ISP_DETAIL_STATS_MAX_COLUMN, row代表行划分大块数,最大值为OT_ISP_DETAIL_STATS_MAX_ROW。划分块数需要满足须知分辨率要求:
例如原始图像分辨率为(2688, 1520), 划分块数设置为col=6, row=4, 则每块的分辨率(448, 380), 小于(640, 480), 则划分不满足要求, 划分块数应该小于col <= 4 (2688/640), row <= 3 (1520/480)。除此之外,划分块数越多,则消耗内存越大,可根据实际情况进行划分,detail_stats使能时,对图像分辨率和col、row都存在约束,详细请见ss_mpi_isp_set_detail_stats_cfg接口约束。
-
根据ss_mpi_isp_set_detail_stats_cfg接口设置的col和row进行划分后,ISP会根据大块数,细分颗粒度更小的分块,最终输出AE detail分块统计信息和AWB detail分块统计信息.
- 获取到的detail_stats统计信息,数据量较大,勿使用栈内存进行存放,推荐使用堆或者MMZ内存进行存放。
须知:
当detail_stats使能时,并且图像分辨率较小,设置分块数时,需要考虑到每块的分辨率是否小于640x480,如果每块的分辨率小于640x480,那么需要减少分块数,以免每块过小,否则VI创建pipe将会失败。建议在分辨率小的情况下,使用较少的分块数。
detail AE分块统计信息
AE最大支持OT_ISP_DETAIL_AE_ZONE_ROW x OT_ISP_DETAIL_AE_ZONE_COLUMN分块,每个分块均可以输出16bit R,Gr,Gb,B均值(Average R/Gr/Gb/B)。对应的结构体请见ot_isp_detail_ae_stats中的be_zone_avg, 实际块数计算方式请见ot_isp_detail_ae_stats,结构体中的ot_isp_detail_ae_grid_info代表每个小块的起始坐标,用户可以通过此坐标信息查询到具体某块的AE分块统计信息。
须知:
为了节省获取统计信息接口的耗时,存放detail_stats的内存,如果曾经获取过坐标信息, 则ot_isp_detail_ae_grid_info中status会被置为1。在分辨率不变并且分块个数不变的情况下,坐标信息不会改变,status的状态位可以不清除,再次获取统计信息时,ISP内部将不会重新更新坐标信息,可节省接口耗时。
detail AWB分块统计信息
AWB中最大支持OT_ISP_DETAIL_AWB_ZONE_NUM个分块,每个分块均可以输出R、G、B均值(Average R/G/B)。其中统计的像素点均为16bit,分块内统计有效点个数Count All,点数统计值均已根据ot_isp_detail_ae_grid_info图像大小做了归一化处理,归一化到16bit。对应结构体为ot_isp_detail_awb_stats中zone_avg_r、zone_avg_g、zone_avg_b和zone_count_all,实际块数计算方式请见ot_isp_detail_awb_stats,结构体中的ot_isp_detail_awb_grid_info代表每个小块的起始坐标,获取到统计信息之后,可以通过此坐标信息查询到具体某块的AWB 分块统计信息。
须知:
为了节省获取统计信息接口的耗时,存放detail_stats的内存,如果曾经获取过坐标信息, 则ot_isp_detail_awb_grid_info中status会被置为1。在分辨率不变并且分块个数不变的情况下,坐标信息不会改变,status的状态位可以不清除,再次获取统计信息时,ISP内部将不会重新更新坐标信息,可节省接口耗时。
API参考
须知:
统计信息的API接口必须在调用ss_mpi_isp_init接口之后才能调用。
- ss_mpi_isp_set_stats_cfg:设置ISP统计信息配置。
- ss_mpi_isp_get_stats_cfg:获取ISP统计信息配置。
- ss_mpi_isp_get_ae_stats:获取AE统计信息。
- ss_mpi_isp_get_ae_stitch_stats:获取拼接模式AE统计信息。
- ss_mpi_isp_get_mg_stats:获取MG统计信息。
- ss_mpi_isp_get_wb_stats:获取AWB统计信息。
- ss_mpi_isp_get_wb_stitch_stats:获取拼接模式AWB统计信息。
- ss_mpi_isp_get_focus_stats:获取AF统计信息。
- ss_mpi_isp_get_motion_stats:获取运动区域占比统计信息。
须知:
- detail_stats统计信息API接口与以上统计信息接口不同,ss_mpi_isp_set_detail_stats_cfg接口需要在ss_mpi_isp_mem_init之前设置并修改。
- ss_mpi_isp_get_detail_stats_cfg不限制调用顺序。
- ss_mpi_isp_get_detail_stats需在ss_mpi_isp_init接口之后才能调用。
- ss_mpi_isp_set_detail_stats_cfg:设置detail_stats统计信息的配置。
- ss_mpi_isp_get_detail_stats_cfg:获取detail_stats统计信息的配置。
- ss_mpi_isp_get_detail_stats:获取detail_stats统计信息。
ss_mpi_isp_set_stats_cfg
【描述】
设置ISP统计信息配置。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
用户可以关闭不需要的统计信息,以提高系统性能。
【举例】
无
【相关主题】
ss_mpi_isp_get_stats_cfg
【描述】
获取ISP统计信息配置。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
无
【举例】
无
【相关主题】
ss_mpi_isp_get_ae_stats
【描述】
获取AE统计信息。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
ot_isp_ae_stats结构体较大,调用该接口时推荐调用malloc动态分配空间。
【举例】
无
【相关主题】
无
ss_mpi_isp_get_ae_stitch_stats
【描述】
获取拼接模式AE统计信息。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
- 只有使用FE0和FE2拼接才有拼接后的1024段直方图信息和均值信息,其他路拼接只有256段直方图信息。
- ot_isp_ae_stitch_stats结构体较大,调用该接口时推荐调用malloc动态分配空间。
- Hi3516CV610不支持。
【举例】
无
【相关主题】
无
ss_mpi_isp_get_mg_stats
【描述】
获取MG统计信息。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
Hi3516CV610不支持。
【举例】
无
【相关主题】
无
ss_mpi_isp_get_wb_stats
【描述】
获取WB统计信息。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
ot_isp_wb_stats结构体较大,调用该接口时推荐调用malloc动态分配空间。
【举例】
无
【相关主题】
无
ss_mpi_isp_get_wb_stitch_stats
【描述】
获取拼接模式下WB统计信息。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
- ot_isp_wb_stitch_stats结构体较大,调用该接口时推荐调用malloc动态分配空间。
- Hi3516CV610不支持。
【举例】
无
【相关主题】
无
ss_mpi_isp_get_focus_stats
【描述】
获取AF统计信息。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
ot_isp_af_stats结构体较大,调用该接口时推荐调用malloc动态分配空间。
【举例】
无
【相关主题】
无
ss_mpi_isp_get_motion_stats
【描述】
获取运动区域占比统计信息。
【语法】
【参数】
vi_pipe号。取值范围:[0, OT_ISP_MAX_PIPE_NUM] |
||
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ss_mpi_isp.h
- 库文件:libss_mpi_isp.a、libot_mpi_isp.a
【注意】
只有BNR中md开关和nr使能都打开,才支持获取运动占比统计信息,具体可见ot_isp_nr_attr中的md_en使能和enable(nr使能)。
【举例】
无
【相关主题】
无
ss_mpi_isp_set_detail_stats_cfg
【描述】
设置detail_stats统计信息的配置。
【语法】
td_s32 ss_mpi_isp_set_detail_stats_cfg(ot_vi_pipe vi_pipe, const ot_isp_detail_stats_cfg *detail_stats_cfg)
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ss_mpi_isp.h
- 库文件:libss_mpi_isp.a、libot_mpi_isp.a
【注意】
- 不需要detail_stats统计信息时,可以不调度此接口,系统会默认关闭detail_stats使能。打开detail_stats统计信息统计功能,系统性能会降低,多占用的viproc性能 = 帧率/ interval。
- 只允许在VI创建pipe之前设置修改,之后不允许设置修改参数;只允许在ss_mpi_isp_mem_init之前设置并修改,mem_init之后将不允许修改如需修改,需要销毁vi和isp,再重新设置参数创建。此接口属于静态接口,不支持动态修改。
- 限制只允许分辨率[1920*1080, 3840x2160]范围内,使能detail_stats, 否则VI pipe将会创建失败。
- wdr模式、在线模式、aidrc、拼接场景不支持设置detail_stats功能使能,否则VI pipe将会创建失败。
- detail_stats使能打开时,只允许《MPP 媒体处理软件 V6.0 开发参考》“视频输入”章节中ot_vi_pipe_attr的compress_mode设置为非压缩格式, 否则VI pipe将会创建失败。
- detail_stats使能打开时,不支持模式切换, 需要销毁ISP并且关闭detail_stats使能进行切换, 否则因为wdr不支持detail_stats, VI pipe将会创建失败。
- detail_stats使能打开时,如果进行分辨率切换,则需要保证原始分块数配置在新分辨率下满足要求,否则VI在重新创建pipe时,将创建失败。分块要求请见detail_stats分块统计信息。
- detail_stats使能打开时,awb统计信息的位置不允许修改到ot_isp_awb_switch中的OT_ISP_AWB_AFTER_DRC位置,否则拿到的统计信息不准确。
- detail_stats使能打开时,要求detail_stats统计信息分块数大于1,内部参数col和row不能同时等于1。
- 用户可以增大interval统计信息写出间隔数,和控制ot_isp_detail_stats_ctrl中的ctrl参数(例如只统计写出AE统计信息),以提高系统性能。
- Hi3516CV610不支持
【举例】
if(detail_cfg->enable){
pipe_info->pipe_attr.compress_mode = OT_COMPRESS_MODE_NONE;
ret = ss_mpi_isp_set_detail_stats_cfg(vi_pipe, detail_cfg);
if (ret != HI_SUCCESS) {
printf("ss_mpi_isp_set_detail_stats_cfg failed with %#x!\n", ret);
return ret;
}
}
……
ret = ss_mpi_vi_create_pipe(vi_pipe, &pipe_info->pipe_attr);
if (ret != HI_SUCCESS) {
vi_mst_trace("vi create pipe(%d) failed with %#x!\n", vi_pipe, ret);
return ret;
}
……
ret = ss_mpi_isp_mem_init(vi_pipe);
if (ret != HI_SUCCESS) {
printf("SS_MPI_ISP_MemInit failed with %#x!\n", ret);
return ret;
}
【相关主题】
ss_mpi_isp_get_detail_stats_cfg
ss_mpi_isp_get_detail_stats_cfg
【描述】
获取detail_stats统计信息的配置。
【语法】
td_s32 ss_mpi_isp_get_detail_stats_cfg(ot_vi_pipe vi_pipe, ot_isp_detail_stats_cfg *detail_stats_cfg);
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ss_mpi_isp.h
- 库文件:libss_mpi_isp.a、libot_mpi_isp.a
【注意】
Hi3516CV610不支持
【举例】
无
【相关主题】
ss_mpi_isp_set_detail_stats_cfg
ss_mpi_isp_get_detail_stats
【描述】
获取detail_stats统计信息。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ss_mpi_isp.h
- 库文件:libss_mpi_isp.a、libot_mpi_isp.a
【注意】
- detail_stats存放数据较大,请勿使用栈内存进行存放,推荐使用堆内存和MMZ内存进行存放。
- detail_stats统计信息配置,ss_mpi_isp_set_stats_cfg接口设置的crop信息无法作用在detail_stats统计信息上,detail_stats统计图像宽高对应此ss_mpi_isp_set_pub_attr接口中的wnd_rect宽高, wb的分块个数配置也不会作用在detail_stats统计信息上。
- 当VI FMU功能开启时,将获取不到detail_stats统计信息。FMU功能可参考《MPP媒体处理软件6.0开发参考》“视频输入”章节的ss_mpi_vi_set_chn_fmu_mode 接口。
- 获取时需要按照帧率和interval进行获取. 如果获取太频繁, 获取得到的是上一次获取的统计信息,可以根据PTS进行区分。例如帧率是30,interval是60,则每60帧更新一次统计信息,如果每隔2帧来获取一次统计信息,统计信息还未更新,则获取得到的是上一次获取到的统计信息,可以修改成每60帧获取统计信息,与此同时,也可节省系统的CPU耗时。
- detail_stats统计信息,只受BE中的blc和isp_dgain模块影响,不受其他模块影响,调节BE其他模块效果,detail_stats统计信息不受影响。
- ot_isp_detail_stats结构体较大,调用该接口时推荐调用malloc动态分配空间。
- Hi3516CV610不支持
【举例】
无
【相关主题】
无
数据类型
- ot_isp_stats_cfg:定义ISP 3A统计信息配置。
- ot_isp_stats_ctrl:定义ISP 3A统计信息使能。
- ot_isp_ae_stats_cfg:定义AE统计信息配置。
- ot_isp_ae_switch:定义AE统计模块在ISP pipeline的位置。
- ot_isp_ae_four_plane_mode:FourPlaneMode使能。
- ot_isp_ae_hist_skip: 直方图统计时采样点设置。
- ot_isp_ae_hist_offset_x:直方图统计时水平方向起始点设置。
- ot_isp_ae_hist_offset_y:直方图统计时垂直方向起始点设置。
- ot_isp_ae_hist_config:定义全局直方图统计时的采样点方式。
- ot_isp_ae_stat_mode:定义统计模块的开方模式。
- ot_isp_ae_crop:对AE模块输入图像进行裁剪。
- ot_isp_awb_switch:定义ISP WB统计模块在ISP pipeline的位置。
- ot_isp_awb_crop:对AWB模块输入图像进行裁剪。
- ot_isp_wb_stats_cfg:定义AWB统计信息配置。
- ot_isp_ae_grid_info:定义AE分区间统计信息的坐标信息。
- ot_isp_be_ae_grid_info: 定义AE分区间统计信息的坐标信息。
- ot_isp_ae_stats:定义AE统计信息。
- ot_isp_ae_stitch_stats:定义拼接模式AE统计信息。
- ot_isp_mg_grid_info:定义MG分区间统计信息的坐标信息。
- ot_isp_mg_stats:定义MG统计信息。
- ot_isp_awb_grid_info:定义AWB分区间统计信息的坐标信息。
- ot_isp_wb_stats:定义AWB统计信息。
- ot_isp_wb_stitch_stats:定义拼接模式AWB统计信息。
- OT_ISP_IIR_EN_NUM:定义AF IIR使能的个数。
- OT_ISP_IIR_GAIN_NUM:定义AF IIR gain的个数。
- OT_ISP_IIR_SHIFT_NUM:定义AF IIR shift的个数。
- OT_ISP_ACC_SHIFT_H_NUM:定义AF IIR累加统计shift的个数。
- OT_ISP_ACC_SHIFT_V_NUM:定义AF FIR累加统计shift的个数。
- OT_ISP_AF_ZONE_ROW:定义AF水平方向的分块个数。
- OT_ISP_AF_ZONE_COLUMN:定义AF垂直方向的分块个数。
- ot_isp_focus_stats_cfg:定义AF统计信息配置。
- ot_isp_af_cfg:定义AF统计信息配置参数。
- ot_isp_af_peak_mode:PEAK模式,决定分区间统计值是否进行求峰值处理。
- ot_isp_af_square_mode:平方模式,决定分区间统计值是否进行平方处理。
- ot_isp_af_crop:AF输入图像的裁剪。
- ot_isp_af_stats_pos:AF统计位置。
- ot_isp_af_raw_cfg:AF RAW域统计配置。
- ot_isp_af_pre_filter_cfg:AF预滤波器配置。
- ot_isp_af_level_depend:AF Level Depend Gain配置。
- ot_isp_af_coring:AF Coring 配置。
- ot_isp_af_h_param:AF统计水平滤波器IIR参数设置。
- ot_isp_af_v_param:AF统计垂直滤波器IIR参数设置。
- ot_isp_af_fv_param:AF统计结果输出格式参数。
- ot_isp_focus_zone:定义AF统计信息参数。
- ot_isp_fe_focus_stats:定义FE AF统计信息。
- ot_isp_be_focus_stats:定义BE AF统计信息。
- ot_isp_focus_grid_info:定义AF分区间统计信息的坐标信息。
- ot_isp_af_stats:定义FE和BE的AF统计信息。
- ot_isp_detail_stats_cfg:定义detail_stats统计信息的配置信息。
- ot_isp_detail_stats_ctrl:定义detail_stats中读取统计信息的控制使能。
- ot_isp_detail_stats:定义detail_stats的统计信息。
- ot_isp_detail_ae_stats:定义AE的detail_stats统计信息。
- ot_isp_detail_awb_stats:定义AWB的detail_stats统计信息。
- ot_isp_detail_ae_grid_info:定义AE的detail_stats的统计信息坐标。
- ot_isp_detail_awb_grid_info:定义AWB的detail_stats的统计信息坐标。
- OT_ISP_DETAIL_AE_ZONE_ROW:定义AE的detail_stats分块统计信息垂直方向的分块行数。
- OT_ISP_DETAIL_AE_ZONE_COLUMN:定义AE的detail_stats分块统计信息水平方向的分块列数。
- OT_ISP_DETAIL_AWB_ZONE_NUM:定义AWB的detail_stats分块统计信息分块个数。
- OT_ISP_DETAIL_STATS_MAX_ROW:定义detail_stats分块统计信息垂直方向的最大分块个数。
- OT_ISP_DETAIL_STATS_MAX_COLUMN:定义detail_stats分块统计信息水平方向的最大分块列数。
- OT_ISP_DETAIL_STATS_BLK_NUM_MAX:定义detail_stats分块统计信息水平方向的最大分块行数。
- ot_isp_motion_stats_cfg:定义运动区域占比统计信息的配置。
- ot_isp_motion_stats:定义运动区域占比统计信息。
ot_isp_stats_cfg
【说明】
定义ISP 3A统计信息配置。
【定义】
typedef struct {
ot_isp_stats_ctrl ctrl;
ot_isp_stats_ctrl update;
ot_isp_ae_stats_cfg ae_cfg;
ot_isp_wb_stats_cfg wb_cfg;
ot_isp_focus_stats_cfg focus_cfg;
ot_isp_motion_stats_cfg motion_cfg;
} ot_isp_stats_cfg;
【成员】
【注意事项】
无。
【相关数据类型及接口】
无
ot_isp_stats_ctrl
【说明】
定义ISP 3A统计信息使能。
【定义】
typedef union {
td_u32 key;
struct {
td_u32 bit1_fe_ae_global_stat : 1; /* [0] */
td_u32 bit1_fe_ae_local_stat : 1; /* [1] not support for Hi3516CV610 */
td_u32 bit1_fe_ae_stitch_global_stat : 1; /* [2] not support for Hi3516CV610 */
td_u32 bit1_fe_ae_stitch_local_stat : 1; /* [3] not support for Hi3516CV610 */
td_u32 bit1_be_ae_global_stat : 1; /* [4] */
td_u32 bit1_be_ae_local_stat : 1; /* [5] */
td_u32 bit1_be_ae_stitch_global_stat : 1; /* [6] not support for Hi3516CV610 */
td_u32 bit1_be_ae_stitch_local_stat : 1; /* [7] not support for Hi3516CV610 */
td_u32 bit1_awb_stat1 : 1; /* [8] */
td_u32 bit1_awb_stat2 : 1; /* [9] */
td_u32 bit2_reserved0 : 2; /* [10:11] */
td_u32 bit1_fe_af_stat : 1; /* [12] not support for Hi3516CV610 */
td_u32 bit1_be_af_stat : 1; /* [13] */
td_u32 bit2_reserved1 : 2; /* [14:15] */
td_u32 bit1_dehaze : 1; /* [16] */
td_u32 bit1_mg_stat : 1; /* [17] not support for Hi3516CV610 */
td_u32 bit1_extend_stats : 1; /* [18] */
td_u32 bit13_reserved : 13; /* [19:31] */
};
} ot_isp_stats_ctrl;
【成员】
【注意事项】
- 用户可以关闭不使用的统计信息,如此就不会读相应统计信息,从而提高系统性能。
- bit1_fe_ae_global_stat~ bit13_reserved 32个bit为使用ss_mpi_isp_get_xx_stats接口(xx表示AE/AWB/AF)获取统计信息时相应的开关。isp firmware运转需要获取统计信息供相关算法使用。
-
如果用户使用ss_mpi_isp_get_xx_stats(xx表示AE/AWB/AF)实现自己的3A算法,可以通过disable ot_isp_stats_cfg中update中相应的bit来关掉中断服务程序中相关统计信息的更新以达到降低CPU占用率的目的。update中bit顺序定义也是bit1_fe_ae_global_stat~ bit13_reserved。
例如:可以置零update的bit0来停止更新fe_ae_global_stat统计信息。
-
如果用户需要使用FE统计信息估算出来的BE统计信息,则需要打开bit1_extend_stats扩展统计信息使能。
【相关数据类型及接口】
ot_isp_ae_stats_cfg
【说明】
定义AE统计信息配置。
【定义】
typedef struct {
ot_isp_ae_switch ae_switch;
ot_isp_ae_hist_config hist_config;
ot_isp_ae_four_plane_mode four_plane_mode;
ot_isp_ae_stat_mode hist_mode;
ot_isp_ae_stat_mode aver_mode;
ot_isp_ae_stat_mode max_gain_mode;
ot_isp_ae_crop crop;
ot_isp_ae_crop fe_crop;
td_u8 weight[OT_ISP_AE_ZONE_ROW][OT_ISP_AE_ZONE_COLUMN];
td_u8 be_weight[OT_ISP_BE_AE_ZONE_ROW][OT_ISP_BE_AE_ZONE_COLUMN];
} ot_isp_ae_stats_cfg;
【成员】
MG模块开方模式。0为不开方,1为开方。仅影响MG模块统计信息。为了与AE分块统计信息进行比较,建议与aver_mode配置为同一模式。Hi3516CV610不支持。 |
|
|
Hi3516CV610 BE提供32*32的统计信息,需用通过be_weight对BE权重表更新,FE仍然使用的weight_table的权重表。 |
【注意事项】
- 线性模式数据流走的是channel 1,默认使用全局1024段直方图进行AE控制,此时channel 2/3/4 WDR合成前全局1024段直方图全为0。
- 全局4分量统计平均值会受15*17权重表的影响。
- Channel 1/2/3/4全局1024段段直方图会受15*17权重表的影响,WDR模式可以使用这几路直方图信息进行AE控制。如2合1可使用channel 1/2,3合1可使用channel 1/2/3,4合1可使用channel 1/2/3/4等。
- 配置ae_switch/hist_config/four_plane_mode相关参数时,需要把AE的大面积单色判断功能关闭。
- 自动曝光的静态统计信息分为15*17个区域,可通过设定权重表改变每个区域的权重。如可使中心区域的权重加大,则中心区域的亮度变化会使图像的全局直方图统计信息产生更多的变化。该属性可调节感兴趣区域的曝光权重,可用于实现指定区域的背光补偿。若能确定具体产品形态感兴趣区域的位置,可将这些位置的权重加大。如对于运动DV和行车记录仪,感兴趣区域一般在画面的中下部分,那么可适当加大场景中下部分区域的权重,使得感兴趣区域得到合理曝光。
- HI3516CV610小分辨率时,根据该分辨率下的分块数n*m,be_weight的左上角n*m块生效。
- WDR模式下,hist_mode、aver_mode、max_gain_mode推荐使用root模式(不开方模式),但是如果BLC偏移导致AE统计信息误差偏大,可以切换为normal模式(开方模式),减少统计信息误差。
【相关数据类型及接口】
无
ot_isp_ae_switch
【说明】
定义AE统计模块在ISP pipeline的位置。
【定义】
typedef enum {
OT_ISP_AE_AFTER_DG = 0,
OT_ISP_AE_AFTER_WB,
OT_ISP_AE_AFTER_DRC,
OT_ISP_AE_SWITCH_BUTT
} ot_isp_ae_switch;
【成员】
【注意事项】
- 配置此参数时,需要把AE的大面积单色判断功能关闭。
- AE统计模块在ISP pipeline BE的位置在DG后时,统计结果会受DG配置值影响;位置在WB后时,统计结果会受DG和WB配置值影响;位置在DRC后时,统计结果会受DG,WB和DRC配置值影响。位置在WB或DRC后时,如果DG增益或者WB增益配置为全0,会导致画面变黑,统计信息不对,AE调节过亮等问题。详细架构图请参考《ISP图像调优指南》2.2 ISP功能框图章节描述。
【相关数据类型及接口】
ot_isp_ae_four_plane_mode
【说明】
FourPlaneMode使能。
【定义】
typedef enum {
OT_ISP_AE_FOUR_PLANE_MODE_DISABLE = 0,
OT_ISP_AE_FOUR_PLANE_MODE_ENABLE,
OT_ISP_AE_FOUR_PLANE_MODE_BUTT
} ot_isp_ae_four_plane_mode;
【成员】
【注意事项】
- 配置此参数时,需要把AE的大面积单色判断功能关闭。
- Hi3516CV610 FE统计信息不支持four_plane_mode。
【相关数据类型及接口】
ot_isp_ae_hist_skip
【说明】
直方图统计时采样点设置。
【定义】
typedef enum {
OT_ISP_AE_HIST_SKIP_EVERY_PIXEL = 0,
OT_ISP_AE_HIST_SKIP_EVERY_2ND_PIXEL,
OT_ISP_AE_HIST_SKIP_EVERY_3RD_PIXEL,
OT_ISP_AE_HIST_SKIP_EVERY_4TH_PIXEL,
OT_ISP_AE_HIST_SKIP_EVERY_5TH_PIXEL,
OT_ISP_AE_HIST_SKIP_EVERY_8TH_PIXEL,
OT_ISP_AE_HIST_SKIP_EVERY_9TH_PIXEL,
OT_ISP_AE_HIST_SKIP_BUTT
} ot_isp_ae_hist_skip;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_ae_hist_offset_x
【说明】
直方图统计时水平方向起始点设置。
【定义】
typedef enum {
OT_ISP_AE_HIST_START_FORM_FIRST_COLUMN = 0,
OT_ISP_AE_HIST_START_FORM_SECOND_COLUMN,
OT_ISP_AE_HIST_OFFSET_X_BUTT
} ot_isp_ae_hist_offset_x;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_ae_hist_offset_y
【说明】
直方图统计时垂直方向起始点设置。
【定义】
typedef enum {
OT_ISP_AE_HIST_START_FORM_FIRST_ROW = 0,
OT_ISP_AE_HIST_START_FORM_SECOND_ROW,
OT_ISP_AE_HIST_OFFSET_Y_BUTT
} ot_isp_ae_hist_offset_y;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_ae_hist_config
【说明】
定义全局直方图统计时的采样点方式。
【定义】
typedef struct {
ot_isp_ae_hist_skip hist_skip_x;
ot_isp_ae_hist_skip hist_skip_y;
ot_isp_ae_hist_offset_x hist_offset_x;
ot_isp_ae_hist_offset_y hist_offset_y;
} ot_isp_ae_hist_config;
【成员】
【注意事项】
- 可根据Sensor输入的Bayer数据格式,合理配置该结构体,使得全局直方图统计时只计入某单个分量数据。
- RGBIR模式推荐全局直方图统计时只计入G分量,可根据RGBIR Sensor的Bayer数据格式合理配置该结构体实现。
- 配置hist_config相关参数时,需要把AE的大面积单色判断功能关闭。
【相关数据类型及接口】
无
ot_isp_ae_stat_mode
【说明】
定义统计模块的开方模式。
【定义】
typedef enum {
OT_ISP_AE_NORMAL = 0,
OT_ISP_AE_ROOT,
OT_ISP_AE_STAT_MODE_BUTT
} ot_isp_ae_stat_mode;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_ae_crop
【说明】
对AE模块输入图像进行裁剪。
【定义】
【成员】
|
|
|
|
【注意事项】
- 默认分块数下,当图像裁剪分辨率小于340X226时,仅全局直方图可用。
- 水平方向起始位置与Crop宽度之和应小于图像宽度,垂直方向起始位置与Crop高度之和应小于图像高度。
- 对于BE的AE统计信息,ISP BE分块场景下,不支持AE CROP(输入图像裁剪)功能。
- AE CROP(输入图像裁剪)参数会同步对MG模块生效。
【相关数据类型及接口】
ot_isp_awb_switch
【说明】
定义AWB统计模块在ISP pipeline的位置。
【定义】
typedef enum {
OT_ISP_AWB_AFTER_DG = 0,
OT_ISP_AWB_AFTER_EXPANDER,
OT_ISP_AWB_AFTER_DRC,
OT_ISP_AWB_SWITCH_BUTT
} ot_isp_awb_switch;
【成员】
【注意事项】
Expander模块在Digital Gain前,设置AWB统计在Expander后时,AWB统计输出未做Dgain增益处理。极低照度下,AWB统计输出的R, G, B均值在黑电平附近波动,准确度较差。不推荐在低照度下使用Expander后统计信息。
【相关数据类型及接口】
ot_isp_awb_crop
【说明】
对AWB模块输入图像进行裁剪。
【定义】
typedef struct {
td_bool enable;
td_u16 x;
td_u16 y;
td_u16 width;
td_u16 height;
} ot_isp_awb_crop;
【成员】
【注意事项】
- AWB要求每个分块的最小分辨率为20*15,当裁剪后的图像分辨率较小,分块数较多时,如果每块的分辨率小于20*15,那么需要减少分块数,以免每块过小。
- 水平方向起始位置与Crop宽度之和应小于图像宽度,垂直方向起始位置与Crop高度之和应小于图像高度。
- ISP BE分块场景下,不支持AWB CROP(输入图像裁剪)功能。
【相关数据类型及接口】
ot_isp_wb_stats_cfg
【说明】
定义AWB统计信息配置。
【定义】
typedef struct {
ot_isp_awb_switch awb_switch;
td_u16 zone_row;
td_u16 zone_col;
td_u16 white_level;
td_u16 black_level;
td_u16 cb_max;
td_u16 cb_min;
td_u16 cr_max;
td_u16 cr_min;
ot_isp_awb_crop crop;
} ot_isp_wb_stats_cfg;
【成员】
WB统计垂直方向分块个数。取值范围:[ceil(ImageHeight/1024), min(0x20, ImageHeight / 15)]。 |
|
WB统计水平方向分块个数,取值范围:[max(BlkNum, ceil(ImageWidth/1024), min(0x20, ImageWidth/20)], BlkNum为ISP BE的分块数目。 |
|
【注意事项】
拼接模式下,每一路的参数是独立配置的。每一路的分块个数都需要配置,而且需要相同。即每一路的awb_switch,zone_row,zone_col需要相同。
【相关数据类型及接口】
无
ot_isp_ae_grid_info
【说明】
定义AE分区间统计信息的坐标信息。
【定义】
typedef struct {
td_u16 grid_y_pos[OT_ISP_AE_ZONE_ROW + 1];
td_u16 grid_x_pos[OT_ISP_AE_ZONE_COLUMN + 1];
td_u8 status;
} ot_isp_ae_grid_info;
【成员】
【注意事项】
- 非分块场景下,AE分区间统计信息为15*17个均匀分区的统计信息。
- BE分块场景下,AE分区间统计信息的分区大小是不均匀的,若按照均匀分区间的方式显示AE统计信息,会出现图像与统计信息不对应的情况,为避免这种问题,故提供每个分区的起始坐标信息。
【相关数据类型及接口】
无
ot_isp_be_ae_grid_info
【说明】
定义AE分区间统计信息的坐标信息。
【定义】
typedef struct {
td_u16 grid_y_pos[OT_ISP_BE_AE_ZONE_ROW + 1];
td_u16 grid_x_pos[OT_ISP_BE_AE_ZONE_COLUMN + 1];
td_u8 status;
} ot_isp_be_ae_grid_info;
【成员】
【注意事项】
Hi3519DV500 不支持。
ot_isp_ae_stats
【说明】
定义AE统计信息。
【定义】
typedef struct {
td_u32 fe_hist1024_value[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_HIST_NUM];
td_u16 fe_global_avg[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_BAYER_CHN_NUM];
td_u16 fe_zone_avg[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_AE_ZONE_ROW][OT_ISP_AE_ZONE_COLUMN][OT_ISP_BAYER_CHN_NUM];
td_u32 be_estimate_hist1024_value[OT_ISP_HIST_NUM];
td_u32 be_hist1024_value[OT_ISP_HIST_NUM];
td_u16 be_global_avg[OT_ISP_BAYER_CHN_NUM];
td_u16 be_zone_avg[OT_ISP_BE_AE_ZONE_ROW][OT_ISP_BE_AE_ZONE_COLUMN][OT_ISP_BAYER_CHN_NUM];
ot_isp_ae_grid_info fe_grid_info;
ot_isp_be_ae_grid_info be_grid_info;
td_u64 pts;
} ot_isp_ae_stats;
【成员】
【注意事项】
- WDR模式下只在主路所在Pipe才可以获取所有长短帧的统计信息,以WDR2TO1为例,OT_ISP_WDR_MAX_FRAME_NUM对应下标为0时表示短帧统计信息,为1时表示长帧信息。
- WDR合成前(FE)统计信息受到位于FE AE之前处理模块(FE AE之前的模块有DG/WB)增益影响,这些模块的FE增益值由算法内部保证与BE保持一致,无需单独配置。如果DG增益或者WB增益配置为全0,会导致统计信息不对,AE调节过亮等问题。
- 当图像宽小于600或高小于200时,分区间统计信息不可用。
- be_estimate_hist1024_value仅在2合1WDR模式下可使用,且仅支持估算DG后的统计信息,该直方图形式不支持FourPlaneMode。噪声会对BE统计信息有影响,在噪声大的场景,开启BNR之后,估算的统计信息不能接近真实的BE统计信息。另外DPC、CRB(Hi3519dv500, Hi3516CV610不支持)、LSC等模块也会影响统计信息的估算。
- YUV模式不支持获取统计信息pts。
- pts每帧都会覆盖更新,若需要获取到每一帧raw对应的统计信息pts,则需要以帧间隔调用此接口;否则,统计信息pts与raw pts可能不是一一对应的。
-
帧合成WDR通路,长帧送FE0,短帧送FE1。为了AE看到统计信息和普通WDR模式保持一致,会将FE1的数据放在索引0,FE0的数据放在索引1。
-
fe_hist1024_value、be_hist1024_value分别表示位于FE及BE的全局1024段直方图统计信息。该统计信息取自输入数据流中的高10bit数据统计,每个bin中的数据表示该灰度值对应的像素个数。全局1024段直方图受分区间权重的影响,1024个bin的数据之和即为带权重统计的像素点个数。目前,AE算法默认使用Gr通道的统计信息,在大面积红色时,采用R和Gb通道的统计信息,在大面积蓝色时,采用B和Gr通道的统计信息。
- 当MIPI、VI DEV的data_rate配置为DATA_RATE_X2时,fe_hist1024_value中的pixel_count、pixel_weight数目会减半。
- fe_global_avg、be_global_avg分别表示位于FE及BE的全局R/Gr/Gb/B 4分量取高16bit统计得到的均值,取值范围:[0, 0xFFFF]。全局4分量平均值受分区间权重影响。
- fe_zone_avg、be_zone_avg分别表示位于FE及BE的15*17区间每个区间R/Gr/Gb/B 4分量取高16bit统计得到的均值,取值范围:[0, 0xFFFF]
-
AE统计模块可将输入数据开方后再进行统计。数据开方,指对输入数据归一化至1后做开方处理。以1024段直方图统计为例:
- 若输入数据为12bit,某个像素值为2048,若数据开方关闭,直接取高10bit数据进行统计,为灰度值512对应的bin像素个数加1;
- 若数据开方使能,像素值2048归一化至1后为0.5,0.5开方为0.707,用10bit表示0.707为724,此时在直方图上表现为灰度值724对应的bin像素个数加1。
由此可见,像素值较小的数据开方处理后像素值显著增大,相当于通过压缩亮区的统计精度来提升暗区的统计精度。建议在WDR模式下数据开方使能,线性模式下数据开方关闭。在开方模式下,统计精度为11bit,低5bit值为0,因此16bit最大值为0xFFE0。此外,AE统计模块在ISP pipeline的位置可以变化。
-
hmax_time * vmax * fps = 1s,其中vmax 和 fps都由sensor驱动内部确定,hmax_time依据此公式计算,单位ns。
表 1 统计信息ot_isp_ae_stats的成员变量默认配置说明
说明:
- 表1中指出仅在ISP默认配置下生效,实际会受到黑电平配置及AE统计信息位置的影响。
- WDR合成前(FE)统计信息为固定在WB模块之后,不可配置。使用FE统计信息时需要减去黑电平,直方图应减去10bit黑电平,均值应减去16bit黑电平。WDR合成前(FE)统计信息受到位于FE AE之前处理模块(在Hi3519DV500中,FE AE之前的处理模块包括DG/WB)增益影响,这些模块的FE增益值由算法内部确保与BE保持一致,无需单独配置。
- 在Hi3519DV500中第0路FE统计信息会经过水平下采样,因此点数减半。
- 线性模式推荐使用WDR合成前(FE)1024段直方图。WDR模式推荐使用WDR合成前(FE)1024段直方图,或者使用WDR合成后(BE)开方模式的1024段直方图。离线模式下业务压力大时,WDR合成前(FE)实时性更好,因此离线模式下推荐使用FE统计信息。SDK提供的AE算法在如果采用的是BE统计信息,默认在线性模式下使用(BE)不开方模式的统计信息,在WDR模式下使用(BE)开方模式的统计信息。如果线性模式下使用(BE)开方模式的统计信息,或者WDR模式下使用(BE)不开方模式的统计信息,会导致SDK提供AE算法异常。
- Hi3519DV500: FE通路中只有FE0,FE2支持分块统计信息,全局均值统计信息和1024段直方图。FE1,FE3只支持256段直方图。
- Hi3516CV610: FE通路只支持256段直方图,不支持分块统计信息和全局均值统计信息。
- 仅当使用FE0和FE2拼接时,才有拼接后的1024段直方图信息和均值信息,其他路径拼接仅有256段直方图信息。
【相关数据类型及接口】
ot_isp_ae_stitch_stats
【说明】
定义拼接模式AE统计信息。
【定义】
typedef struct {
td_u32 fe_hist1024_value[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_HIST_NUM];
td_u16 fe_global_avg[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_BAYER_CHN_NUM];
td_u16 fe_zone_avg[OT_ISP_MAX_STITCH_NUM][OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_AE_ZONE_ROW][OT_ISP_AE_ZONE_COLUMN][OT_ISP_BAYER_CHN_NUM];
td_u32 be_hist1024_value[OT_ISP_HIST_NUM];
td_u16 be_global_avg[OT_ISP_BAYER_CHN_NUM];
td_u16 be_zone_avg[OT_ISP_MAX_STITCH_NUM][OT_ISP_BE_AE_ZONE_ROW][OT_ISP_BE_AE_ZONE_COLUMN][OT_ISP_BAYER_CHN_NUM];
td_u64 pts;
} ot_isp_ae_stitch_stats;
【成员】
【注意事项】
- 拼接后统计信息仅在拼接模式下生效,并且仅在拼接主路可以获取。
- 拼接后的分块均值只有参与拼接的Pipe分区间均值有效,其余Pipe的均值无效。如Pipe0和Pipe1进行拼接,则OT_ISP_MAX_STITCH_NUM对应下标为0,1时fe_zone_avg/be_zone_avg才有有效统计信息。
- WDR模式下只在拼接主路所在Pipe才可以获取所有长短帧的统计信息,以WDR2TO1为例,OT_ISP_WDR_MAX_FRAME_NUM对应下标为0时表示短帧统计信息,为1时表示长帧信息。
- WDR合成前(FE)统计信息受到位于FE AE之前处理模块(FE AE之前的模块有DG/WB)增益影响,这些模块的FE增益值由算法内部保证与BE保持一致,无需单独配置。
- YUV模式不支持获取统计信息pts。
- pts每帧都会覆盖更新,若需要获取到每一帧raw对应的统计信息pts,则需要以帧间隔调用此接口;否则,统计信息pts与raw pts可能不是一一对应的。
- Hi3516CV610不支持。
【相关数据类型及接口】
无
ot_isp_mg_grid_info
【说明】
定义MG分区间统计信息的坐标信息。
【定义】
typedef struct {
td_u16 grid_y_pos[OT_ISP_MG_ZONE_ROW + 1];
td_u16 grid_x_pos[OT_ISP_MG_ZONE_COLUMN + 1];
td_u8 status;
} ot_isp_mg_grid_info;
【成员】
【注意事项】
- 非分块场景下,MG分区间统计信息为15*17个均匀分区的统计信息。
- BE分块场景下,MG分区间统计信息的分区大小是不均匀的,若按照均匀分区间的方式显示MG统计信息,会出现图像与统计信息不对应的情况,为避免这种问题,故提供每个分区的起始坐标信息。
- Hi3516CV610不支持。
【相关数据类型及接口】
无
ot_isp_mg_stats
【说明】
定义MG统计信息。
【定义】
typedef struct {
td_u16 zone_avg[OT_ISP_MG_ZONE_ROW][OT_ISP_MG_ZONE_COLUMN][OT_ISP_BAYER_CHN_NUM];
ot_isp_mg_grid_info grid_info;
} ot_isp_mg_stats;
【成员】
【注意事项】
Hi3516CV610不支持。
【相关数据类型及接口】
无
ot_isp_awb_grid_info
【说明】
定义AWB分区间统计信息的坐标信息。
【定义】
typedef struct {
td_u16 grid_y_pos[OT_ISP_AWB_ZONE_ORIG_ROW + 1];
td_u16 grid_x_pos[OT_ISP_AWB_ZONE_ORIG_COLUMN + 1];
td_u8 status;
} ot_isp_awb_grid_info;
【成员】
【注意事项】
- 非分块场景下,AWB分区间统计信息为zone_row* zone_col个均匀分区的统计信息。
- BE分块场景下,AWB分区间统计信息的分区大小是不均匀的,若按照均匀分区间的方式显示AWB统计信息,会出现图像与统计信息不对应的情况,为避免这种问题,故提供每个分区的起始坐标信息。
【相关数据类型及接口】
无
ot_isp_wb_stats
【说明】
定义AWB统计信息。
【定义】
typedef struct {
td_u16 global_r;
td_u16 global_g;
td_u16 global_b;
td_u16 count_all;
td_u16 zone_avg_r[OT_ISP_AWB_ZONE_NUM];
td_u16 zone_avg_g[OT_ISP_AWB_ZONE_NUM];
td_u16 zone_avg_b[OT_ISP_AWB_ZONE_NUM];
td_u16 zone_count_all[OT_ISP_AWB_ZONE_NUM];
ot_isp_awb_grid_info grid_info;
td_u64 pts;
} ot_isp_wb_stats;
【成员】
【注意事项】
表 1 AWB区域统计信息(以zone_avg_r为例,zone_row=32,zone_col=32)
zone_count_all做归一化是为了消除分辨率差异对灰点个数的影响。归一化公式:CountAll = (Count of Gray Pixels << 16) / (Count of All Pixels)。
- YUV模式不支持获取统计信息pts。
- pts每帧都会覆盖更新,若需要获取到每一帧raw对应的统计信息pts,则需要以帧间隔调用此接口;否则,统计信息pts与raw pts可能不是一一对应的。
【相关数据类型及接口】
无
ot_isp_wb_stitch_stats
【说明】
定义拼接模式WB统计信息。
【定义】
typedef struct {
td_u16 zone_row;
td_u16 zone_col;
td_u16 zone_avg_r[OT_ISP_AWB_ZONE_STITCH_MAX];
td_u16 zone_avg_g[OT_ISP_AWB_ZONE_STITCH_MAX];
td_u16 zone_avg_b[OT_ISP_AWB_ZONE_STITCH_MAX];
td_u16 zone_count_all[OT_ISP_AWB_ZONE_STITCH_MAX];
td_u64 pts;
} ot_isp_wb_stitch_stats;
【成员】
【注意事项】
-
AWB统计信息的排列顺序请参考表1。
-
拼接后统计信息仅在拼接模式下生效,并且仅在拼接主路可以获取。
- YUV模式不支持获取统计信息pts。
- pts每帧都会覆盖更新,若需要获取到每一帧raw对应的统计信息pts,则需要以帧间隔调用此接口;否则,统计信息pts与raw pts可能不是一一对应的。
【相关数据类型及接口】
无
OT_ISP_IIR_EN_NUM
【说明】
定义AF IIR使能的个数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_IIR_GAIN_NUM
【说明】
定义AF IIR gain的个数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_IIR_SHIFT_NUM
【说明】
定义AF IIR shift的个数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_FIR_GAIN_NUM
【说明】
定义AF FIR gain的个数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_ACC_SHIFT_H_NUM
【说明】
定义AF IIR累加统计shift的个数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_ACC_SHIFT_V_NUM
【说明】
定义AF FIR累加统计shift的个数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_AF_ZONE_ROW
【说明】
定义AF水平方向的分块个数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_AF_ZONE_COLUMN
【说明】
定义AF垂直方向的分块个数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
ot_isp_focus_stats_cfg
【说明】
定义AF统计信息配置。
【定义】
typedef struct {
ot_isp_af_cfg config;
ot_isp_af_h_param h_param_iir0;
ot_isp_af_h_param h_param_iir1;
ot_isp_af_v_param v_param_fir0;
ot_isp_af_v_param v_param_fir1;
ot_isp_af_fv_param fv_param;
} ot_isp_focus_stats_cfg;
【成员】
【注意事项】
当分辨率较小,分块数较多时,如果每块的分辨率小于32x32,那么需要减少分块数,以免每块过小。建议在分辨率小的情况下,使用较少的分块数。
【相关数据类型及接口】
无
ot_isp_af_cfg
【说明】
定义AF统计信息配置参数。
【定义】
typedef struct {
td_bool af_en;
td_u16 zone_col;
td_u16 zone_row;
ot_isp_af_peak_mode peak_mode;
ot_isp_af_square_mode square_mode;
ot_isp_af_crop crop;
ot_isp_af_crop fe_crop;
ot_isp_af_stats_pos stats_pos;
ot_isp_af_raw_cfg raw_cfg;
ot_isp_af_pre_filter_cfg pre_flt_cfg;
td_u16 high_luma_threshold
} ot_isp_af_cfg;
【成员】
【注意事项】
-
分区间统计值的计算方式为:
- peak_mode为OT_ISP_AF_STA_NORM且square_mode为OT_ISP_AF_STA_SUM_NORM模式时,对分区间内每个像素的滤波器输出值求和即为分区间统计值;
- peak_mode为OT_ISP_AF_STA_NORM且square_mode为OT_ISP_AF_STA_SUM_SQUARE模式时,对分区间内每个像素的滤波器输出值求平方和即为分区间统计值;
- peak_mode为OT_ISP_AF_STA_PEAK且square_mode为OT_ISP_AF_STA_SUM_NORM模式时,先对分区间内一行中每个像素的滤波器输出值取最大值,再对多行的最大值求和即为分区间统计值;
- peak_mode为OT_ISP_AF_STA_PEAK且square_mode为OT_ISP_AF_STA_SUM_SQUARE模式时,先对分区间内一行中每个像素的滤波器输出值取最大值,再对多行的最大值求平方和即为分区间统计值。
-
分区间亮度统计值(y)的计算方式为:
对分区间内每个像素的亮度求和即为分区间亮度统计值(y)。
-
当ISP BE处于分块方式时,AF统计信息的水平方向窗口个数最小为BlockNum(BlockNum可以参考ISP 的proc信息)分块的个数,此时取值范围为[BlockNum, 17]。
【相关数据类型及接口】
无
ot_isp_af_peak_mode
【说明】
PEAK模式,决定分区间统计值是否进行求峰值处理。
【定义】
typedef enum {
OT_ISP_AF_STA_NORM = 0,
OT_ISP_AF_STA_PEAK,
OT_ISP_AF_STA_BUTT
} ot_isp_af_peak_mode;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_af_square_mode
【说明】
平方模式,决定分区间统计值是否进行平方处理。
【定义】
typedef enum {
OT_ISP_AF_STA_SUM_NORM = 0,
OT_ISP_AF_STA_SUM_SQUARE,
OT_ISP_AF_STA_SUM_BUTT
} ot_isp_af_square_mode;
【成员】
【注意事项】
采用Square模式,会对滤波器输出归一化后平方再做统计,如图1所示,input为滤波后输出像素值,output为处理后输出值,相比normal模式,在临近焦点附近可以得到比较陡峭的FV曲线,并且对幅值较小的噪声信号有一定的抑制作用,但也会使FV曲线平坦区域更加平坦,用户应该根据实际的场景需求来设定这个参数。

【相关数据类型及接口】
无
ot_isp_af_crop
【说明】
对AF模块输入图像进行裁剪。
【定义】
【成员】
【注意事项】
- 水平方向起始位置与Crop宽度之和应小于图像宽度,垂直方向起始位置与Crop高度之和应小于图像高度。
- 对于BE的AF统计信息,ISP BE 分块场景下,不支持AF CROP(输入图像裁剪)功能。
【相关数据类型及接口】
无
ot_isp_af_stats_pos
【说明】
配置AF模块统计位置。
【定义】
typedef enum {
OT_ISP_AF_STATS_AFTER_DGAIN = 0,
OT_ISP_AF_STATS_AFTER_DRC,
OT_ISP_AF_STATS_AFTER_CSC,
OT_ISP_AF_STATS_BUTT
} ot_isp_af_stats_pos;
【成员】
【注意事项】
- WDR模式下,非宽动态场景的Bayer域(即RAW域)统计信息无明显变化趋势,推荐使用YUV域统计信息。
- AF的FE统计信息只支持DGain之后进行统计,而BE统计信息支持DGain、DRC和CSC之后进行统计,详见《ISP 图像调优指南》文档的ISP功能框图章节。
【相关数据类型及接口】
无
ot_isp_af_raw_cfg
【说明】
AF模块Bayer域配置。
【定义】
typedef struct {
td_u8 gamma_gain_limit;
td_u8 gamma_value;
ot_isp_bayer_format bayer_format;
} ot_isp_af_raw_cfg;
【成员】
设置Bayer pattern,支持BAYER_RGGB,BAYER_GRBG,BAYER_GBRG,BAYER_BGGR四种。 |
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_af_pre_filter_cfg
【说明】
AF模块预滤波器配置。
【定义】
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_af_level_depend
【说明】
AF Level Depend Gain 模块配置。
【定义】
typedef struct {
td_bool enable;
td_u16 threshold_low;
td_u16 gain_low;
td_u16 slope_low;
td_u16 threshold_high;
td_u16 gain_high;
td_u16 slope_high;
} ot_isp_af_level_depend;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_af_coring
【说明】
AF Coring 模块配置。
【定义】
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_af_h_param
【说明】
AF统计水平滤波器IIR参数设置。
【定义】
typedef struct {
td_bool narrow_band_en;
td_bool iir_en[OT_ISP_IIR_EN_NUM];
td_u8 iir_shift;
td_s16 iir_gain[OT_ISP_IIR_GAIN_NUM];
td_u16 iir_shift_lut[OT_ISP_IIR_SHIFT_NUM];
ot_isp_af_level_depend level_depend;
ot_isp_af_coring coring;
} ot_isp_af_h_param;
【成员】
iir_en[OT_ISP_IIR_EN_NUM] |
|
iir_gain[OT_ISP_IIR_GAIN_NUM] |
|
iir_shift_lut[OT_ISP_IIR_SHIFT_NUM] |
|
【注意事项】
- iir_gain[0]为无符号8bit数,其他iir_gain[1]-[6]为有符号10bit数,且不能等于-512。IIR使能、narrow_band_en使能、滤波器系数以及iir_shift通过PQ Tools可以生成,用户可以根据实际需要调节LDG和Coring模块以获取最优FV统计值输出。
- iir_shift Hi3519DV500, Hi3516CV610不支持。可以使用iir_shift_lut进行替代。
【相关数据类型及接口】
无
ot_isp_af_v_param
【说明】
AF统计垂直滤波器FIR参数设置。
【定义】
typedef struct {
td_s16 fir_gain[OT_ISP_FIR_GAIN_NUM];
ot_isp_af_level_depend level_depend;
ot_isp_af_coring coring;
} ot_isp_af_v_param;
【成员】
fir_gain[OT_ISP_FIR_GAIN_NUM] |
|
【注意事项】
FIR滤波器系数通过PQ Tools可以生成,用户可以根据实际需要调节LDG和Coring模块以获取最优垂直FV统计值输出。
【相关数据类型及接口】
无
ot_isp_af_fv_param
【说明】
AF统计结果输出格式参数。
【定义】
typedef struct {
td_u16 acc_shift_y;
td_u16 acc_shift_h[OT_ISP_ACC_SHIFT_H_NUM];
td_u16 acc_shift_v[OT_ISP_ACC_SHIFT_V_NUM];
td_u16 hl_cnt_shift;
} ot_isp_af_fv_param;
【成员】
acc_shift_h[OT_ISP_ACC_SHIFT_H_NUM] |
|
acc_shift_v[OT_ISP_ACC_SHIFT_V_NUM] |
|
【注意事项】
FV值用unsinged 16bit表示,当场景细节较多或噪声较多时,FV值可能会溢出,这就需要对输出进行向右移位以保证输出在合理范围。用户根据自己的需求对相应的shift值进行调节。
【相关数据类型及接口】
无
ot_isp_focus_zone
【说明】
定义AF统计信息参数。
【定义】
typedef struct {
td_u16 v1;
td_u16 h1;
td_u16 v2;
td_u16 h2;
td_u16 y;
td_u16 hl_cnt;
} ot_isp_focus_zone;
【成员】
|
【注意事项】
y为每个块的Y分量累加值,用户可以用此值辅助AF算法,比如某些块中含有高亮光源,容易对FV值产生干扰,可根据亮度情况降低块FV对全局FV的影响,亦可用这些块实现一个移动侦测算法,用于检测聚焦过程中的一些运动干扰,用户可以根据自己AF算法的需求使用这个字段的统计信息。
【相关数据类型及接口】
无
ot_isp_fe_focus_stats
【说明】
定义FE AF统计信息。
【定义】
typedef struct {
ot_isp_focus_zone zone_metrics[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_AF_ZONE_ROW][OT_ISP_AF_ZONE_COLUMN];
} ot_isp_fe_focus_stats;
【成员】
【注意事项】
Hi3516CV610不支持
【相关数据类型及接口】
无
ot_isp_be_focus_stats
【说明】
定义BE AF统计信息。
【定义】
typedef struct {
ot_isp_focus_zone zone_metrics[OT_ISP_AF_ZONE_ROW][OT_ISP_AF_ZONE_COLUMN];
} ot_isp_be_focus_stats;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_focus_grid_info
【说明】
定义AF分区间统计信息的坐标信息。
【定义】
typedef struct {
td_u16 grid_y_pos[OT_ISP_AF_ZONE_ROW + 1];
td_u16 grid_x_pos[OT_ISP_AF_ZONE_COLUMN + 1];
td_u8 status;
} ot_isp_focus_grid_info;
【成员】
【注意事项】
- 非分块场景下,AF分区间统计信息为zone_col * zone_row个均匀分区的统计信息。
- BE分块场景下,AF分区间统计信息的分区大小是不均匀的,若按照均匀分区间的方式显示AF统计信息,会出现图像与统计信息不对应的情况,为避免这种问题,故提供每个分区的起始坐标信息。
【相关数据类型及接口】
无
ot_isp_af_stats
【说明】
定义FE和BE的AF统计信息。
【定义】
typedef struct {
ot_isp_fe_focus_stats fe_af_stat;
ot_isp_be_focus_stats be_af_stat;
ot_isp_focus_grid_info fe_af_grid_info;
ot_isp_focus_grid_info be_af_grid_info;
td_u64 pts;
} ot_isp_af_stats;
【成员】
【注意事项】
- 线性模式下离线模式推荐使用FE的统计信息(实时性更佳)。
- WDR模式下推荐使用BE DRC后的统计信息(参考ot_isp_af_stats_pos)。
- Hi3519DV500中AF支持从FE0获取统计信息,不支持从其他FE通道获取统计信息。请参考《ISP 图像调优指南》第2章关于ISP FE的说明。
- YUV模式不支持获取统计信息pts。
- pts每帧都会覆盖更新,若需要获取到每一帧raw对应的统计信息pts,则需要以帧间隔调用此接口;否则,统计信息pts与raw pts可能不是一一对应的。
- VI离线时,如果需要获取到AF pts对应帧的AF BE统计信息,使用ss_mpi_isp_get_vd_time_out接口获取到帧起始中断后马上调用接口获取AF统计信息。
- VI离线时,如果需要减少一帧AF BE统计信息获取延时(获取同一帧的AF FE、BE统计信息),使用ss_mpi_isp_get_vd_time_out接口获取到帧结束中断后马上调用接口获取AF统计信息。
- AF统计信息中的宏定义OT_ISP_WDR_MAX_FRAME_NUM,表示当前统计信息所在的帧索引。默认情况下,只有索引0有统计信息。但是当pipe reverse之后,AF统计信息的索引也要相应调整。
- Hi3516CV610 FE没有AF统计模块,因此FE相关的AF配置都不生效。
【相关数据类型及接口】
无
ot_isp_detail_stats_cfg
【说明】
定义detail_stats统计信息的配置。
【定义】
typedef struct {
td_bool enable;
ot_isp_detail_stats_ctrl ctrl;
td_u8 row;
td_u8 col;
td_u16 interval;
} ot_isp_detail_stats_cfg;
【成员】
detail_stats的垂直分块行数。取值范围[1, 4], 当col=1,enable=true时,row取值范围为(1, 4]。 |
|
detail_stats的水平分块列数。取值范围[1, 6], 当row=1,enable=true时,col取值范围为(1, 6]。 |
|
【注意事项】
- 接口注意事项请见ss_mpi_isp_set_detail_stats_cfg接口描述
- detail_stats的enable等于true时,col和row不能同时等于1。
- Hi3516CV610不支持。
【相关数据类型及接口】
ss_mpi_isp_set_detail_stats_cfg
ss_mpi_isp_get_detail_stats_cfg
ot_isp_detail_stats_ctrl
【说明】
定义detail_stats中读取统计信息的控制使能。
【定义】
typedef union {
td_u32 key;
struct {
td_u32 bit1_ae : 1;
td_u32 bit1_awb : 1;
td_u32 bit30_reserved : 30;
};
} ot_isp_detail_stats_ctrl;
【成员】
【注意事项】
- 当bit1_ae等于0时,关闭AE统计detail_stats统计信息使能,将获取不到对应的AE detail_stats统计信息。
- 当bit1_awb等于0时,关闭AWB统计detail_stats统计信息使能,将获取不到对应的AWB detail_stats统计信息。
- detail_stats的enable等于true时,bit1_ae和bit1_awb不能同时等于0。
- Hi3516CV610不支持。
【相关数据类型及接口】
ss_mpi_isp_set_detail_stats_cfg
ss_mpi_isp_get_detail_stats_cfg
ot_isp_detail_stats
【说明】
定义detail_stats中统计信息。
【定义】
typedef struct {
ot_isp_detail_ae_stats ae_stats;
ot_isp_detail_awb_stats awb_stats;
td_u64 pts;
} ot_isp_detail_stats;
【成员】
detail_stats统计信息的ae分块统计信息。具体请见ot_isp_detail_ae_stats。 |
|
detail_stats统计信息的awb分块统计信息。具体请见ot_isp_detail_awb_stats 。 |
|
【注意事项】
Hi3516CV610不支持。
【相关数据类型及接口】
ot_isp_detail_ae_stats
【说明】
定义AE的detail_stats统计信息。
【定义】
typedef struct {
td_u16 be_zone_avg[OT_ISP_DETAIL_AE_ZONE_ROW][OT_ISP_DETAIL_AE_ZONE_COLUMN][OT_ISP_BAYER_CHN_NUM];
ot_isp_detail_ae_grid_info ae_grid_info;
} ot_isp_detail_ae_stats;
【成员】
【注意事项】
- be_zone_avg是按照最大分块数存放统计信息。实际读取时,可以按照ot_isp_detail_stats_cfg中row和col实际划分行列数读取,例如row和col为实际划分的行列数,则获取AE的detail_stats统计信息可以通过此数组获取be_zone_avg[row * OT_ISP_AE_ZONE_ROW][col * OT_ISP_AE_ZONE_COLUMN][OT_ISP_BAYER_CHN_NUM]
- Hi3516CV610不支持。
【相关数据类型及接口】
ot_isp_detail_awb_stats
【说明】
定义AWB的detail_stats统计信息。
【定义】
typedef struct {
td_u16 zone_avg_r[OT_ISP_DETAIL_AWB_ZONE_NUM];
td_u16 zone_avg_g[OT_ISP_DETAIL_AWB_ZONE_NUM];
td_u16 zone_avg_b[OT_ISP_DETAIL_AWB_ZONE_NUM];
td_u16 zone_count_all[OT_ISP_DETAIL_AWB_ZONE_NUM];
ot_isp_detail_awb_grid_info awb_grid_info;
} ot_isp_detail_awb_stats;
【成员】
【注意事项】
- zone_avg_r、zone_avg_g、zone_avg_b、zone_count_all是按照最大分块数存放统计信息。实际读取时,可以按照ot_isp_detail_stats_cfg中row和col实际划分行列数读取,例如row和col为实际划分的行列数,则AWB detail_stats统计信息行方向的总块数为:row*OT_ISP_AWB_ZONE_ORIG_ROW, 列方向的总块数为:col*OT_ISP_AWB_ZONE_ORIG_COLUMN. 整幅图像总块数为zone_avg_r[row*OT_ISP_AWB_ZONE_ORIG_ROW * col*OT_ISP_AWB_ZONE_ORIG_COLUMN]. zone_avg_g、zone_avg_b、zone_count_all总块数和zone_avg_r一致。
- Hi3516CV610不支持
【相关数据类型及接口】
ot_isp_detail_ae_grid_info
【说明】
定义AE的detail_stats分区间统计信息的坐标信息。
【定义】
typedef struct {
td_u16 grid_y_pos[OT_ISP_DETAIL_AE_ZONE_ROW + 1];
td_u16 grid_x_pos[OT_ISP_DETAIL_AE_ZONE_COLUMN + 1];
td_u8 status;
} ot_isp_detail_ae_grid_info;
【成员】
【注意事项】
- AE detail分块统计信息的坐标信息,status标志位代表坐标信息已更新。存放统计信息的内存如果已经获取过坐标信息,可以不清除status状态位,同样分辨率和同样分块数时,坐标信息不变,ISP内部可根据此标志位,节省计算坐标的耗时,从而节省获取统计信息接口的耗时。
- Hi3516CV610不支持此结构体的功能。
【相关数据类型及接口
ot_isp_detail_awb_grid_info
【说明】
定义AWB detail_stats分区间统计信息的坐标信息。
【定义】
typedef struct {
td_u16 grid_y_pos[OT_ISP_AWB_ZONE_ORIG_ROW * OT_ISP_DETAIL_STATS_MAX_ROW + 1];
td_u16 grid_x_pos[OT_ISP_AWB_ZONE_ORIG_COLUMN * OT_ISP_DETAIL_STATS_MAX_COLUMN + 1];
td_u8 status;
} ot_isp_detail_awb_grid_info;
【成员】
【注意事项】
- AWB detail分块统计信息的坐标信息,status标志位代表坐标信息已更新。存放统计信息的内存如果已经获取过坐标信息,可以不清除status状态位,同样分辨率和同样分块数时,坐标信息不变,ISP内部可根据此标志位,节省计算坐标的耗时,从而节省获取统计信息接口的耗时。
- Hi3516CV610不支持
【相关数据类型及接口】
OT_ISP_DETAIL_AE_ZONE_ROW
【说明】
定义AE的detail_stats分块统计信息垂直方向的分块行数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_DETAIL_AE_ZONE_COLUMN
【说明】
定义AE的detail_stats分块统计信息水平方向的分块列数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_DETAIL_AWB_ZONE_NUM
【说明】
定义AWB的detail_stats分块统计信息分块个数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
无。
OT_ISP_DETAIL_STATS_MAX_ROW
【说明】
定义detail_stats分块统计信息垂直方向的最大分块个数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_DETAIL_STATS_BLK_NUM_MAX
OT_ISP_DETAIL_STATS_MAX_COLUMN
【说明】
定义detail_stats分块统计信息水平方向的最大分块列数。
【定义】
【注意事项】
无。
【相关数据类型及接口】
OT_ISP_DETAIL_STATS_BLK_NUM_MAX
OT_ISP_DETAIL_STATS_BLK_NUM_MAX
【说明】
定义detail_stats分块统计信息水平方向的最大分块行数。
【定义】
#define OT_ISP_DETAIL_STATS_BLK_NUM_MAX (OT_ISP_DETAIL_STATS_MAX_COLUMN * OT_ISP_DETAIL_STATS_MAX_ROW)
【注意事项】
无。
【相关数据类型及接口】
ot_isp_motion_stats_cfg
【说明】
定义运动区域占比统计信息的配置。
【定义】
【成员】
【注意事项】
- 只有BNR中md开关和nr使能都打开,才支持获取运动占比统计信息,motion_stats_en才能配置为true. 具体可见ot_isp_nr_attr中的md_en使能和enable(nr使能)。否则不支持motion_stats_en配置为true。
- 当motion_stats_en=true时,需要将BNR的buf个数增加到3个,才能获取到正确的运动区域占比统计信息,修改接口请见《MPP 媒体处理软件 V6.0 开发参考》“视频输入”章节的ss_mpi_vi_set_pipe_bnr_buf_num。
【相关数据类型及接口】
ot_isp_motion_stats
【说明】
定义运动区域占比统计信息。
【定义】
【成员】
【注意事项】
- 只有BNR中md开关和nr使能都打开,才支持获取运动占比统计信息,具体可见ot_isp_nr_attr中的md_en使能和enable(nr使能)。
- 只有ot_isp_motion_stats_cfg中的motion_stats_en打开,才支持获取运动占比统计信息。
【相关数据类型及接口】
Debug
概述
ISP提供Debug MPI供客户调用,以方便客户定位相关图像质量问题。
功能描述
Debug提供记录ISP在运行过程中的状态信息,以方便记录在ISP运行过程中出现的异常状态,需要记录的帧数可以由用户自己指定。
API参考
- ss_mpi_isp_set_debug:设置ISP调试接口。
- ss_mpi_isp_get_debug:获取ISP调试接口。
ss_mpi_isp_set_debug
【描述】
设置ISP调试信息属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
- 调试信息的成员变量为SYS,可以设置使能开关。
- 需要用户来分配内存以存储相应的调试信息,且需要将分配的内存地址作为输入传入。
- 调用该接口的进程需要与isp主进程是不同进程。
- 该接口主要提供给PQT使用,不建议其他功能使用。
【举例】
td_s32 ret = 0;
td_u32 depth = 10;
td_u32 size = 0;
ot_isp_debug_info debug_ifo;td_void *virt_Addr = TD_NULL; /* virt addr malloc memory */
td_u64 phys_Addr;
size = sizeof(ot_isp_debug_attr) + sizeof(ot_isp_debug_status) * depth;
ret = ss_mpi_sys_mmz_alloc(&phys_Addr, &virt_Addr, OT_NULL, OT_NULL, size);
if (ret != TD_SUCCESS) {
printf("Buf not enough!\n");
return TD_FAILURE;
}
debug_ifo.debug_en = TD_TRUE;
debug_ifo.depth = depth;
debug_ifo.phys_addr = phys_Addr;
debug_ifo.debug_type = OT_ISP_DEBUG_BLC;
ret = ss_mpi_isp_set_debug(vi_pipe, &debug_ifo);
if (ret != TD_SUCCESS) {
printf("ss_mpi_isp_set_debug failed 0x%x!\n", ret);
return TD_FAILURE;
}
【相关主题】
无
ss_mpi_isp_get_debug
【描述】
获取ISP调试信息属性。
【语法】
【参数】
【返回值】
失败,其值为错误码。 |
【需求】
- 头文件:ot_common_isp.h、ss_mpi_isp.h
- 库文件:libot_mpi_isp.a、libss_mpi_isp.a
【注意】
该接口主要提供给PQT使用,不建议其他功能使用。
【举例】
无
数据类型
- ot_isp_debug_info:定义ISP调试信息属性。
- ot_isp_debug_type:定义ISP调试信息算法。
- ot_isp_debug_attr:定义ISP调试属性。
- ot_isp_debug_status:定义ISP调试参数。
ot_isp_debug_info
【说明】
定义ISP调试信息属性。
【定义】
typedef struct {
ot_isp_debug_type debug_type;
td_bool debug_en;
td_u64 phys_addr;
td_u32 depth;
} ot_isp_debug_info;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_debug_type
【说明】
定义ISP调试信息的算法。
【定义】
typedef enum {
OT_ISP_DEBUG_AE = 0,
OT_ISP_DEBUG_AWB,
OT_ISP_DEBUG_BLC,
OT_ISP_DEBUG_DEHAZE,
OT_ISP_DEBUG_BUTT,
} ot_isp_debug_type;
【成员】
【注意事项】
无
【相关数据类型及接口】
ot_isp_debug_attr
【说明】
定义ISP调试属性
【定义】
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_debug_status
【说明】
定义ISP调试参数
【定义】
typedef struct {
td_u32 frame_num_begain;
td_u16 black_level_actual[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_BAYER_CHN_NUM];
td_u16 black_level_original[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_BAYER_CHN_NUM];
td_u32 frame_num_end;
} ot_isp_debug_status;
【成员】
【注意事项】
black_level_original只在动态黑电平打开时才能获取到。
【相关数据类型及接口】
无
错误码
ISP API错误码如Tableau 1所示。
表 1 ISP API错误码
Proc 调试信息说明
概述
调试信息采用了proc文件系统,可实时反映当前系统的运行状态,所记录的信息可供问题定位及分析时使用。
【文件目录】
/proc/umap/isp
【开启方法】
- 调用ss_mpi_isp_set_ctrl_param设置ISP控制参数proc_param = n,其中n=0关闭proc,非0表示每隔n帧更新一次proc。
-
调用ss_mpi_isp_set_ctrl_param设置update_pos = 0或update_pos = 1,默认值为0
update_pos =0表示ISP中断配置寄存器的位置是使用帧起始中断update_pos =1表示ISP中断配置寄存器的位置是使用帧结束中断
-
调用ss_mpi_isp_set_mod_param设置interrupt_bottom_half中断底半部,默认值为0
interrupt_bottom_half =0表示ISP内核态处理(读统计信息和配置sensor和ISP同步寄存器)在中断服务程序中完成
interrupt_bottom_half =1表示ISP内核态处理(读统计信息和配置sensor和ISP同步寄存器)在中断下半部完成
注意:
-
开启Proc信息会消耗CPU资源。推荐设为30帧更新一次,或仅Debug时开启。
-
拼接sync模式时,拼接组内的PIPE共同使用拼接组内主pipe对应ISP的配置,proc以主pipe为准。
- 算法Proc信息是在用户态更新,若算法proc信息与cat命令查看信息同时操作,则cat查看不到算法proc信息,需要再次执行cat命令。
【信息查看方法】
- 在控制台上可以使用cat命令查看信息,例如cat /proc/umap/isp;也可以使用其他常用的文件操作命令,例如cp /proc/umap/isp ./ -rf,将ISP的proc文件拷贝到当前目录。
- 在应用程序中可以将上述文件当作普通只读文件进行读操作,例如fopen、fread等。
说明:
参数在描述时有以下2种情况需要注意:
- 取值为{0, 1}的参数,如未列出具体取值和含义的对应关系,则参数为1时表示肯定,为0时表示否定。
- 取值为{aaa, bbb, ccc}的参数,未列出具体取值和含义的对应关系,但可直接根据取值aaa、bbb或ccc判断参数含义。
ISP
【调试信息】
[ISP] Version: [Hi3519DV500_MPP_V1.0.0.0 B010 Release], Build Time[Oct 26 2022, 14:03:12]
----------------------------------------ISP framework: 25122701---------------------------------------------------------
----------------------------------------isp proc pipe[0]----------------------------------------------------------------
----------------------------------------module/control param------------------------------------------------------------
proc_param stat_intvl update_pos int_bothalf int_timeout pwm_number run_wakeup
30 1 0 0 200 3 0
port_int_delay quick_start ldci_tprflten long_frm_int_en be_buf_num ob_update_pos alg_run_sel
0 0 0 0 20 frame end normal
----------------------------------------detail stats info---------------------------------------------------------------
enable ctrl col row interval
1 ae awb 2 2 1
blk_w0 blk_w1 blk_h0 blk_h1
960 960 1080 1080
----------------------------------------isp mode------------------------------------------------------------------------
stitch_mode running_mode block_num data_mode run_once
normal online 1 raw 0
----------------------------------------sensor info---------------------------------------------------------------------
sensor_type dev
i2c 0
----------------------------------------drv info------------------------------------------------------------------------
vi_pipe int_cnt int_t max_int_t avg_int_t int_gap_t max_gap_t int_rat
0 2439 214 272 214 33291 33542 31
int_type pt_int_cnt pt_int_t pt_max_int_t pt_int_gap_t pt_max_gap_t pt_int_rat reset_cnt
start 0 0 0 0 0 0 2
fe_stat_t fe_stat_max_t cp_stat_t cp_stat_max_t be_stat_t be_stat_max_t be_stat_lost
27 34 31 58 83 101 7
be_end_t be_end_max_t sensor_cfg_t sensor_max_t sensor_avg_t
0 0 7 34 7
sync_cfg_gap sync_cfg_gap_max sync_cfg_gap_min ldci_comp_err_cnt stitch_pts_cnt sync_id_err_cnt
33290 33542 32950 0 0 0
usr_t max_usr_t cros_cnt cros_end_t cros_usr_t cros_run_t cros_switch_t cros_lock_t
961 2190 0 0 0 0 0 0
cros_pre_run_t cros_pre_swi_t cros_pre_lock_t
0 0 0
----------------------------------------pubattr info--------------------------------------------------------------------
wnd_x wnd_y wnd_w wnd_h sns_w sns_h sns_mode flip mirror bayer
0 0 1920 1080 1920 1080 0 0 0 rggb
crop_en crop_x crop_y crop_w crop_h wdr_mode
0 0 0 1920 1080 linear
----------------------------------------send raw isp frame info---------------------------------------------------------
----------------------------------------fe roi info---------------------------------------------------------------------
fe_roi_en fe_roi_x fe_roi_y fe_roi_w fe_roi_h
0 0 0 1919 1079
----------------------------------------share mem info------------------------------------------------------------------
share_all_en share[0] share[1] share[2] share[3] share[4]
0 1982
[AE] Version: [Hi3519DV500_MPP_V1.0.0.0 B010 Release], Build Time[Oct 25 2022, 17:27:11]
----------------------------------------ae info-------------------------------------------------------------------------
sys_gain line ae_inter in_crmnt exp 1st_time
1024 554 1 256 15375 566666
comp ev_bias ori_ave offset speed tole error fps real_fps b_delay w_delay
56 1024 45 9 64 2 2 30.00 3000 8 0
max_line max_linet max_agt max_dgt max_idgt max_sgt manu_en ma_line ma_ag ma_dg ma_ispdg
1124 65535 62416 38485 2048 4691562 0 0 0 0 0
wdr_mode anflick slow_mod gain_th au_ir_en ir_type ma_ir_en dbg_ir_st stat_pos
linear 0 1 4691562 0 dc_iris 0 0 BE
face_luma pep_luma noroi_cnt exp_coef
0 0 349 1024
node_id int_time sys_gain iris_ape up_stgy dw_stgy mltply
0 1 1024 1 0 4 1024
1 1124 1024 1 1 0 1150976
2 1124 4691562 1 4 1 5273315688
----------------------------------------isp ae info---------------------------------------------------------------------
again dgain isp_dg iso
1024 1024 1024 100
int_time[0] int_time[1] int_time[2] int_time[3] ae_inter sns_ratio
262403 0 0 0 1 64
piris_valid piris_pos piris_gain hmax_times vmax
0 0 1 29603 1126
[AWB] Version: [Hi3519DV500_MPP_V1.0.0.0 B010 Release], Build Time[Oct 25 2022, 17:27:11]
----------------------------------------awb info------------------------------------------------------------------------
manuen sat zones speed
0 128 32 256
sector_en hue0 hue1 hue2 hue3 hue4 hue5
1 20 20 0 20 20 20
sat0 sat1 sat2 sat3 sat4 sat5
20 20 20 20 20 20
----------------------------------------isp awb info--------------------------------------------------------------------
gain0 gain1 gain2 gain3 cotemp
0x1d2 0x100 0x100 0x185 5988
color00 color01 color02 color10 color11 color12 color20 color21 color22
0x1ca 0x80a9 0x8021 0x8040 0x1b5 0x8075 0x8009 0x8086 0x18f
----------------------------------------dpc info------------------------------------------------------------------------
enable strength blend_ratio
1 0 0
1 0 0
----------------------------------------crosstalk info------------------------------------------------------------------
enable slope sensi_slope threshold sensi_th strength filter_md
1 9 9 300 300 128 0
----------------------------------------fswdr info-------------------------------------------------------------------
motion_comp_en long_thr short_thr md_thr_low_gain md_thr_high_gain
0 3008 4032 0 0
----------------------------------------fpn correct info(Hi3519DV500)----------------------------------------------------------------
en op_type strength offset aibnr_mode
0 -- -- -- --
----------------------------------------fpn correct info(Hi3516CV610)----------------------------------------------------------------
en op_type strength offset0 offset1
0 -- -- -- --
----------------------------------------black level actual info---------------------------------------------------------
mode user_en blc_mode isp_blc_r isp_blc_gr isp_blc_gb isp_blc_b sns_blc_r sns_blc_gr sns_blc_gb sns_blc_b
auto 0 global 960 960 960 960 960 960 960 960
offset ob_x ob_y ob_width ob_height blc_clamp_info
0 0 0 1920 10 1
----------------------------------------bayernr info(Hi3519DV500)--------------------------------------------------
enable tnr_enable sfm0_coarse_str1 sfm0_coarse_str2 sfm0_coarse_str3 sfm0_coarse_str4
1 1 108 108 108 108
nr_lsc_enable coring_wgt fine_strength sfm0_de_prot coring_mot_ratio
0 50 128 16 0
sfm1_strength sfm1_adp_strength sfm6_strength sfm7_strength sth
512 2 64 64 100
md_mode md_size_ratio tfs sfr_r sfr_g sfr_b md_sta_ratio md_mot_ratio
1 32 255 26 32 26 26 13
user_def_md user_def_slope user_def_dark user_def_color md_anti_fli_str md_sta_fine_str
0 0 90 16 32 32
dering_strength dering_thresh dering_sta_strength dering_mot_strength
64 64 16 16
snr_sfm0_wdr_str0 snr_sfm0_wdr_str1 snr_sfm0_wdr_str3 snr_sfm0_fus_str0 snr_sfm0_fus_str1
16 16 16 16 16
md_wdr_str0 md_wdr_str1 md_fus_str0 md_fus_str1
16 16 16 16
snr_wdr_sfm6_str0 snr_wdr_sfm6_str1 snr_wdr_sfm7_str0 snr_wdr_sfm7_str1
64 16 64 16
snr_fus_sfm6_str0 snr_fus_sfm6_str1 snr_fus_sfm7_str0 snr_fus_sfm7_str1
64 16 64 16
bnr_proc_iso k b
237 0.067507 0.025618
----------------------------------------bayernr info(Hi3516CV610)-------------------------------------
enable md_en nr_lsc_enable fine_strength sfm0_de_prot tss coring_wgt
1 1 0 128 16 0 50
sfm0_coarse_str1 sfm0_coarse_str2 sfm0_coarse_str3 sfm0_coarse_str4 ref_mode load_ref_en
108 108 108 108 md_mode 0
md_mode tfs md_sta_ratio md_mot_ratio md_sta_fine_str
2 255 26 13 32
md_anti_fli_str user_def_md user_def_slope user_def_dark sfr_r sfr_g sfr_b
32 0 0 90 26 32 26
snr_sfm0_wdr_str0 snr_sfm0_wdr_str1 snr_sfm0_wdr_str3 snr_sfm0_fus_str0 snr_sfm0_fus_str1
16 16 16 16 16
md_wdr_str0 md_wdr_str1 md_fus_str0 md_fus_str1
16 16 16 16
bnr_proc_iso k b
25118 4.303804 9.501861
----------------------------------------acs info------------------------------------------------------------------------
enable y_strength run_interval lock_enable
0 256 2 0
----------------------------------------radial_crop info----------------------------------------------------------------
enable center_ver center_hor radius
0 0 3839 540
----------------------------------------drc info------------------------------------------------------------------------
en manu_en strength
0 0 0
----------------------------------------dehaze info------------------------------------------------------------------------
en manu_en manu_strength auto_strength
0 0 0 0
----------------------------------------cac info------------------------------------------------------------------------
enable edge_thr[0] edge_thr[1] edge_gain cac_rb_strength
0 0 0 0 0
satu_low_thd satu_high_thd purple_alpha edge_alpha cr_str cb_str
0 0 0 0 0 0
----------------------------------------bayershp info-------------------------------------------------------------------
enable mf_gain hf_gain dark_gain overshoot undershoot
1 3 2 1 128 128
mf_strength:
0 0 32 32 32 32 32 32
hf_strength:
0 0 16 32 32 16 16 0
dark_strength:
0 0 16 16 4 2 0 0
----------------------------------------demosaic info-------------------------------------------------------------------
enable nondir_str nondir_mf_str nondir_hf_str de_smth_range
1 48 82 0 2
color_noise_thdf color_noise_strf color_noise_thdy color_noise_stry
0 8 1 10
----------------------------------------anti false color info-----------------------------------------------------------
en threshold strength
1 10 12
----------------------------------------sharpen info(Hi3519DV500)-----------------------------------------------------------
sharpen_en
1
luma_wgt(0-7):
[31 31 31 31 31 31 31 31]
luma_wgt(8-15):
[31 31 31 31 31 31 31 28]
luma_wgt(16-23):
[23 23 23 23 23 23 23 23]
luma_wgt(24-31):
[23 23 23 23 23 23 23 23]
texture_strength(0-7):
[153 172 186 201 217 233 251 269]
texture_strength(8-15):
[286 300 308 312 313 311 306 297]
texture_strength(16-23):
[285 273 263 255 249 243 234 224]
texture_strength(24-31):
[216 208 201 195 188 181 175 171]
edge_strength(0-7):
[195 210 235 260 295 320 340 350]
edge_strength(8-15):
[360 360 355 345 335 330 325 320]
edge_strength(16-23):
[315 310 305 295 285 280 275 265]
edge_strength(24-31):
[250 240 220 200 180 160 140 125]
texture_freq edge_freq over_shoot under_shoot shoot_sup_str detail_ctrl
180 128 60 60 8 128
edge_filt_str edge_filt_max_cap r_gain g_gain b_gain skin_gain
60 18 12 32 18 30
shoot_sup_adj detail_ctrl_thr max_sharp_gain skin_umax skin_umin skin_vmax skin_vmin
9 180 30 128 100 150 135
----------------------------------------sharpen info(Hi3516CV610)--------------------------------------------------------------------
sharpen_en
1
luma_wgt(0-15):
30 30 30 30 30 30 30 30 30 30 31 31 31 31 31 31
luma_wgt(16-31):
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
texture_strength(0-15):
153 167 178 192 208 223 239 255 271 287 298 306 309 310 309 306
texture_strength(16-31):
299 290 280 270 258 247 237 227 217 207 200 194 187 180 174 170
edge_strength(0-15):
195 209 234 259 294 318 338 348 358 358 353 344 334 329 324 319
edge_strength(16-31):
314 309 304 294 285 280 275 265 250 240 220 200 180 160 140 125
edge_gain_by_rly(0-15):
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
edge_rly_by_mot(0-15):
16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
edge_rly_by_luma(0-15):
16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
mf_gain_by_mot(0-15):
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
hf_gain_by_mot(0-15):
32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
lmf_gain_by_mot(0-15):
16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
texture_freq edge_freq over_shoot under_shoot shoot_sup_str detail_ctrl
190 100 62 62 7 128
edge_filt_str edge_filt_max_cap r_gain g_gain b_gain skin_gain
58 18 16 32 20 30
shoot_sup_adj detail_ctrl_thr max_sharp_gain skin_umax skin_umin skin_vmax skin_vmin
8 160 30 128 100 150 135
shoot_inner_threshold shoot_outer_threshold shoot_protect_threshold
0 0 0
edge_rly_fine_threshold edge_rly_coarse_threshold edge_over_shoot edge_under_shoot
0 0 20 120
----------------------------------------ldci info-----------------------------------------------------------------------
enable manual gauss_lpf_sigma
1 0 36
he_pos_wgt he_pos_sigma he_pos_mean he_neg_wgt he_neg_sigma he_neg_mean blc_ctrl
50 80 32 60 80 128 20
----------------------------------------ca info-------------------------------------------------------------------------
enable iso_ratio
1 1024
----------------------------------------lblc info-----------------------------------------------------------------------
enable strength offset_r offset_gr offset_gb offset_b
0 256 4096 4096 4096 409
----------------------------------------alg run time info---------------------------------------------------------------
ae: 199 awb: 145 fswdr: 15 flicker: 12 blc: 17 nr: 136 drc: 11
dehaze: 78 demosaic: 14 sharpen: 15 ldci: 22 all: 734
----------------------------------------isp proc end[0]-----------------------------------------------------------------
【调试信息分析】
记录当前ISP模块的使用情况。
【参数说明】
表示Port中断延时时间。单位详见ot_isp_ctrl_param结构体的换算介绍。 |
||
短帧ISP数字增益,10bit精度。仅在WDR模式支持。isp_dg与isp_dg_sf只有isp_dg是实际的isp_dgain, isp_dg_sf不实际生效到isp_dgain中。 |
||
ISO值,表示系统增益,以常数100乘以倍数为单位,例如系统中sensor的增益为2倍,ISP的增益为1倍,那么整个系统的ISO值计算方式为:2*1*100=200,即系统ISO为200,本文档中涉及到的ISO都是采用这种计算方法。 |
||
不受shoot_inner_threshold和shoot_outer_threshold参数影响的shoot保护阈值参数。Hi3519DV500不支持。 |
||
【注意事项】
用户通过PQTools手动配置PubAttr修改画面帧率时,sensor的最大曝光时间会发生修改。绝大部分修改帧率时,帧率越高则最大曝光时间越低。
3A开发指南概述
概述
ISP 3A版本依赖于相应的SDK大版本,通过一系列数字图像处理算法完成对数字图像的效果处理。主要包含Firmware框架及SDK提供的3A库,Firmware提供算法的基本框架,处理统计信息,驱动数字图像处理算法,并包含坏点校正、去噪、色彩增强、镜头阴影校正等处理。3A库以注册的方式,添加到Firmware中,完成曝光、白平衡、色彩还原等处理。
功能描述
ISP的Firmware架构及Firmware工作流程及文件组织结构请参考本文档“功能描述”小节,本小节不再赘述。
3A开发使用者指南
软件流程
ISP 软件流程请参考“软件流程”小节,本小节不再赘述。
Sensor对接
Sensor库主要是为了提供差异化的sensor适配,里面的内容可以分为两部分:Sensor向ISP库注册的差异化适配,这些差异化适配主要由Firmware中的基础算法单元决定;Sensor向3A库注册的差异化适配。Sensor的适配包括算法的初始化默认值,及sensor控制接口,sensor的适配是通过接口回调的形式注册给ISP库和3A算法库。图1表示了Sensor与ISP库和3A算法库之间的关系。

关于sensor注册ISP库,sensor注册3A算法库部分详细请参考《sensor调试指南》
开发者指南
概述
用户可以基于Firmware框架开发定制3A库,并注册到Firmware中,Firmware将会在中断的驱动下,获取每帧的统计信息,运行算法库,配置ISP寄存器。
Sensor注册到ISP库,以实现差异化适配Firmware中的基础算法单元的部分,仍需要参考"3A开发使用者指南"部分的内容实现,以保证Firmware中的坏点校正、去噪、色彩增强、镜头阴影校正等处理算法正常运行。Sensor注册到3A算法库的部分,请用户根据自己开发定制的3A库,自行定义数据结构,实现Sensor曝光控制等。
如果用户只是使用3A算法库,并不自己开发3A算法库,可以忽略此章节内容。
AE算法注册ISP库
AE算法注册ISP库调用ss_mpi_isp_ae_lib_reg_callback,如图1所示。

AE算法实现了一个ss_mpi_ae_register的注册函数,在这个函数中调用ISP提供的ss_mpi_isp_ae_lib_reg_callback回调接口,用户调用注册函数以实现向ISP注册AE算法,示例如下:
【举例】
/* 实现注册函数 */
ot_isp_ae_register ae_register;
td_s32 ret = TD_SUCCESS;
ae_check_pointer_return(ae_lib);
ae_check_handle_id_return(ae_lib->id);
ae_check_lib_name_return(ae_lib->lib_name);
/* 调用钩子函数 */
ae_register.ae_exp_func.pfn_ae_init = ae_init;
ae_register.ae_exp_func.pfn_ae_run = ae_run;
ae_register.ae_exp_func.pfn_ae_ctrl = ae_ctrl;
ae_register.ae_exp_func.pfn_ae_exit = ae_exit;
ret = ss_mpi_isp_ae_lib_reg_callback(vi_pipe, ae_lib, &ae_register);
if (ret != TD_SUCCESS) {
printf("Ot_ae register failed!\n");
}
用户需要在自开发定制的AE库中实现以下回调函数:
表 1 AE算法向ISP库注册的回调函数
说明:
- 调用ss_mpi_isp_init时将调用pfn_ae_init回调函数,以初始化AE算法库。
- 调用ss_mpi_isp_run时将调用pfn_ae_run回调函数,以运行AE算法库,计算得到sensor的曝光时间和增益、ISP的数字增益。
- pfn_ae_ctrl回调函数的目的是改变算法库内部状态。运行时Firmware会隐式调用pfn_ae_ctrl回调函数,通知AE算法库切换WDR和线性模式、设置FPS。
- 当前Firmware定义的ctrl命令详参ot_isp_ctrl_cmd。 调用ss_mpi_isp_exit时将调用pfn_ae_exit回调函数,以销毁AE算法库。
结构体ot_isp_ae_param,ot_isp_ae_info,ot_isp_ae_result的成员变量请参看"数据类型"小节相应的数据类型。
AWB算法注册ISP库
AWB算法注册ISP库调用ss_mpi_isp_awb_lib_reg_callback,如图1所示:

AWB算法实现了一个ss_mpi_awb_register的注册函数,在这个函数中调用ISP提供的ss_mpi_isp_awb_lib_reg_callback回调接口,用户调用注册函数以实现向ISP注册AWB算法,示例和AE算法库注册类似。
用户需要在自开发定制的AWB库中实现以下回调函数:
表 1 AWB算法向ISP库注册的回调函数
说明:
- 调用ss_mpi_isp_init时将调用pfn_awb_init回调函数,以初始化AWB算法库。
- 调用ss_mpi_isp_run时将调用pfn_awb_run回调函数,以运行AWB算法库,计算得到白平衡增益、色彩校正矩阵。
- pfn_awb_ctrl回调函数的目的是改变算法库内部状态。运行时Firmware会隐式调用pfn_awb_ctrl回调函数,通知AWB算法库切换WDR和线性模式、设置ISO和曝光时间。设置ISO的目的是为了实现ISO与饱和度的联动,增益大时色度噪声也会比较大,所以需要调节饱和度。设置曝光时间是为了awb算法判断环境照度,优化场景效果。当前Firmware定义的ctrl命令详参ot_isp_ctrl_cmd。
- 调用ss_mpi_isp_exit时将调用pfn_awb_exit回调函数,以销毁AWB算法库。
结构体ot_isp_awb_param,ot_isp_awb_info,ot_isp_awb_result的成员变量请参看数据类型小节相应的数据类型。
开发用户AF算法
说明:
ss_mpi_isp_get_vd_time_out和ss_mpi_isp_get_focus_stats请参考前面章节。
用户开发的AF算法可以参考图1所示的结构,AF算法在一个thread内运行,使用ss_mpi_isp_get_vd_time_out接口将算法同步在VD下运行。通过调用ss_mpi_isp_get_focus_stats来获取AF相关的统计信息,相关算法参考统计信息完成目标zoom和focus位置的计算,AF算法输出result,包括lens的位置信息和速度。调用Lens Driver将镜头镜片驱动到设定的位置即完成当前帧的操作。AF Alg向上提供控制接口和查询接口,方便用户完成一键聚焦,变焦,手动聚焦,查询算法状态等操作。

【举例】
如果用户使用的是Linux系统,推荐将算法放在user space完成,lens driver放在kernel space,ISP驱动提供同步回调功能,参考“AE/AF同步回调”章节。
while (1)
{
ret = ss_mpi_isp_get_vd_time_out(vi_pipe, OT_ISP_VD_FE_START, 5000);
ret |= ss_mpi_isp_get_focus_stats(vi_pipe, &af_stat);
if (ret != TD_SUCCESS) {
printf("ss_mpi_isp_get_focus_stats error!(ret = 0x%x)\n", ret);
return TD_FAILURE;
}
// User Auto Focus Alg Source
usr_af_alg_run();
// Update Lens Position
lens_drv_zoom_to_dest_pos(pos, pps);
lens_dry_focus_to_dest_pos(pos, pps);
}
AF统计信息使用说明
概述
被动式自动对焦一般是通过分析图像特征得出图像清晰度值FV(Focus Value), 通过驱动对焦马达调节焦点到最佳位置,如图1所示,图像越清晰FV值越大,Peak点对应聚焦清晰点。获取图像清晰度算法有多种,如灰度梯度法,高频分量法等,Hi3519DV500和Hi3516CV610采用高频分量法来计算FV,即图像越清晰的时候高频部分幅值越大,将图像通过高通滤波器便可以得到高频分量。它们一共提供四个滤波器和亮度信息,分别为水平方向滤波H1,H2,垂直方向滤波V1,V2,以及Y和高亮计数器HlCnt。Hi3519DV500提供FE(Front End)及BE(Behind End)两个独立的AF统计信息获取模块。AF模块支持的最小分辨率为256*120,低于该分辨率AF逻辑功能无法支持。

Hi3519DV500提供Bayer域或者YUV域进行统计,配置MPI中的stats_pos字段即可以进行统计位置的调整。WDR模式下,非宽动态场景的Bayer域(即RAW域)统计信息无明显变化趋势,推荐使用YUV域统计信息。首先对图像进行预处理滤波,去除椒盐噪声对统计值的干扰,用户可以设置pre_flt_cfg.enable来使能PreFilter。配置pre_flt_cfg.strength来控制滤波强度。在经过水平垂直四组滤波器后会对输出做Level Depend Gain和Coring,关于这两个模块将在后面的章节详述。模块框图2所示。

水平垂直滤波器分别采用IIR和FIR实现如图3所示。

输入图像的裁剪
AF模块支持对输入图像的裁剪,如图1用户可以根据实际需求配置crop中X,Y,W,H四个参数对指定区域进行统计。

Bayer域配置
如果用户将统计位置调整到Bayer域则需要配置以下几点。
- 配置bayer_format来指定bayer数据的pattern。支持如图1所示的4种pattern。
- 配置AF 模块Gamma使能,raw上的线性数据需要做Gamma处理。


须知:
图中的GAMMA_EN与ot_isp_af_raw_cfg中的gamma_value等效,GAIN_LMT与ot_isp_af_raw_cfg中的gamma_gain_limit等效。 Hi3519DV500只支持gamma_value为0或1。
抑制光源对FV值的影响
因为FV值容易受到SpotLight的影响,在聚焦模糊的时候因为光晕扩散,图像中低频分量会增加,会出现图像模糊反而FV值变大的现象。为了抑制这一现象,提供以下方法。
-
高亮计数器
如图1,在聚焦模糊的时候因为光晕扩大画面中高亮点的个数增加,清晰的时候高亮点的个数最小,通过配置合适的高亮点判断门限high_luma_threshold即可以辅助实现SpotLight场景聚焦。

-
Level Depend Gain
LDG的主要原理为通过参考画面像素亮度来衰减滤波器的输出,从而抑制SpotLight对FV值的影响。如图2横坐标为像素亮度值,纵坐标为对滤波器输出的Gain,此处的Gain为8bit定点小数Q8。用户可以通过调整图中6个参数控制曲线的形状。

须知: 由于点光源有如上所述特性,会导致H和V的滤波器都不准确,因此推荐用上述方法减轻这种影响。
Coring
将滤波器输出通过Coring模块可以提高FV曲线的抗噪声能力,如图1所示,设置图中3个参数便可以确定coring曲线的形状,通过设置合理的参数便可以实现不统计噪声,以及增加有效信号对统计信息的贡献,从而提升统计信息在低照度场景中的性能。

统计模式配置
统计模块支持以下两种模式:
-
峰值配置模式
设置为peak模式时,block的统计值为滤波后图像每行最大值之和,而非peak模式下,则直接将每个点的值求和。求和模式适用于噪声较大场景。
-
平方配置模式,有以下两种选择。
- 0:Linear mode
- 1:Square mode
设置为Square模式后,会先对滤波器输出进行归一化后进行平方再做统计。
Square模式的FV曲线在焦点附近会更加陡峭,相应的映射曲线如图1所示。

同时也支持以下配置:
-
输出shift
对输出值right shift缩小,防止值溢出。
-
Block大小
对通过滤波器后的图像可以进行分块统计,如图2所示,块的大小可以设置,最大支持17*15个blocks,最终块的统计值是对每个pixel的累加或者对每行最大值累加。以水平方向为例,因为累加器的宽度为unsigned 29bits,滤波器输出pixel宽度为unsigned 11bits,所以当块内输出值都为2047的时候,最大支持累加的pixel个数为2^18,否者会发生溢出,用户设置大小时应该注意。

统计信息配置注意事项
表 1 统计信息配置注意事项
YUV输入时gamma_value(参考 ot_isp_af_raw_cfg)设置为0。 |
统计值的获取
当一帧图像最后一个pixel通过AF模块后, 统计值即更新,推荐用户通过ss_mpi_isp_get_vd_time_out同步获取统计值,然后AutoFocus和ZoomTracking算法完成目标focus和position的计算,需要注意的是因为LINUX user space任务调度不能保证一致的实时性,建议将需要保证实时性的驱动配置放在kernel space完成。
FV值计算
一般的推荐最终生成如图1所示的两条曲线,我们将low BandPass filter生成的FV命名为FV1,High BandPass filter生成的命名为FV2,“FV计算参考代码”中变量focus_cfg的值为默认推荐使用的AF滤波器参数,FV1使用在低照度场合,FV2使用在正常照度场合。对于每一个block,FV1,FV2的计算方式为:

H1,H2,V1,V2分别为水平垂直四组滤波器的统计值,可设置适当的权重对水平和垂直方向的滤波器输出统计值进行混合。
最终的FV值还需要对每个block进行加权,即FV1,FV2采用如下公式计算。

FV计算参考代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ot_type.h"
#include "ss_mpi_isp.h"
#define BLEND_SHIFT 6
#define ALPHA 64 // 1
#define BELTA 54 // 0.85
#define FEINFO
static int af_weight[15][17] = {
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
};
int main(int argc, char *argv[])
{
td_s32 ret = TD_SUCCESS;
td_u8 wdr_chn;
td_u32 frm_cnt = 0;
td_u32 i, j, k;
td_u16 stat_data;
ot_vi_pipe vi_pipe;
ot_isp_af_stats af_stats;
ot_isp_stats_cfg stats_cfg;
ot_isp_focus_zone zone_metrics[OT_ISP_WDR_MAX_FRAME_NUM][OT_ISP_AF_ZONE_ROW][OT_ISP_AF_ZONE_COLUMN] = { 0 };
ot_isp_focus_stats_cfg focus_cfg = {
{1, 17, 15, 1, 0, {0, 0, 0, 1920, 1080}, {0, 0, 0, 1920, 1080}, 0, {0x0, 0x1, 0}, {1, 0x9bff}, 0xf0},
{1, {1, 1, 1}, 15, {188, 414, -330, 486, -461, 400, -328}, {7, 0, 3, 1}, {1, 0, 255, 0, 240, 8, 14},
{127, 12, 2047}
},
{0, {1, 1, 0}, 2, {200, 200, -110, 461, -415, 0, 0}, {6, 0, 1, 0}, {0, 0, 0, 0, 0, 0, 0},
{ 15, 12, 2047}
},
{{ 20, 16, 0, -16, -20}, {1, 0, 255, 0, 220, 8, 14}, {38, 12, 1800}},
{{ -12, -24, 0, 24, 12}, {1, 0, 255, 0, 220, 8, 14}, {15, 12, 2047}},
{4, {0, 0}, {1, 1}, 0}
};
char param1, param2;
if (argc < 3) {
printf("use like. ./sample_af isp_Pipe c -> Fv curve\n");
printf("......... ./sample_af isp_Pipe h 0 -> h0 blocks\n");
printf("......... ./sample_af isp_Pipe h 1 -> h1 blocks\n");
printf("......... ./sample_af isp_Pipe v 0 -> v0 blocks\n");
printf("......... ./sample_af isp_Pipe v 1 -> v1 blocks\n");
printf("......... ./sample_af isp_Pipe y 0 -> y blocks\n");
printf("......... ./sample_af isp_Pipe y 1 -> hlcnt blocks\n");
return -1;
}
if ((param1 = *argv[2]) != 'c' && !argv[3]) {
printf("args was too less!, should be %c + X\n", *argv[1]);
return -1;
} else if (argv[3]) {
param2 = *argv[3];
}
if ('0' != *argv[1] && '1' != *argv[1]) {
printf("vi_pipe num Err!\n");
return -1;
}
vi_pipe = atoi(argv[1]);
ret = ss_mpi_isp_get_stats_cfg(vi_pipe, &stats_cfg);
if (TD_SUCCESS != ret) {
printf("ss_mpi_isp_get_stats_cfg error!(ret = 0x%x)\n", ret);
return TD_FAILURE;
}
memcpy(&stats_cfg.focus_cfg, &focus_cfg, sizeof(ot_isp_focus_stats_cfg));
ret = ss_mpi_isp_set_stats_cfg(vi_pipe, &stats_cfg);
if (TD_SUCCESS != ret) {
printf("ss_mpi_isp_set_stats_cfg error!(ret = 0x%x)\n", ret);
return TD_FAILURE;
}
#if 1
while (1) {
ret = ss_mpi_isp_get_vd_time_out(vi_pipe, OT_ISP_VD_FE_START, 5000);
ret |= ss_mpi_isp_get_focus_stats(vi_pipe, &af_stats);
if (ret != TD_SUCCESS) {
printf("ss_mpi_isp_get_focus_stats error!(ret = 0x%x)\n", ret);
return TD_FAILURE;
}
#ifdef FEINFO
memcpy(zone_metrics, &af_stats.fe_af_stat, sizeof(ot_isp_focus_zone) * OT_ISP_WDR_MAX_FRAME_NUM * OT_ISP_AF_ZONE_ROW * OT_ISP_AF_ZONE_COLUMN);
#else
memcpy(zone_metrics[0], &af_stats.be_af_stat, sizeof(ot_isp_focus_zone) * OT_ISP_AF_ZONE_ROW * OT_ISP_AF_ZONE_COLUMN);
#endif
if (param1 != 'c') {
if ((++frm_cnt % 30)) {
continue;
}
wdr_chn = 1;
for (k = 0; k < wdr_chn; k++) {
for (i = 0; i < 15; i++) {
for (j = 0; j < 17; j++) {
if (param1 == 'h' && param2 == '0') {
stat_data = zone_metrics[k][i][j].h1;
} else if (param1 == 'h' && param2 == '1') {
stat_data = zone_metrics[k][i][j].h2;
} else if (param1 == 'v' && param2 == '0') {
stat_data = zone_metrics[k][i][j].v1;
} else if (param1 == 'v' && param2 == '1') {
stat_data = zone_metrics[k][i][j].v2;
} else if (param1 == 'y' && param2 == '0') {
stat_data = zone_metrics[k][i][j].y;
} else {
stat_data = zone_metrics[k][i][j].hl_cnt;
}
printf("%6d", stat_data);
}
printf("\n");
}
}
printf("------------------------------------------------%c-%c----------------------------------------------\n\n\n\n\n", param1, param2);
continue;
}
td_u32 sum_fv1 = 0;
td_u32 sum_fv2 = 0;
td_u32 wgt_sum = 0;
td_u32 fv1_n, fv2_n, fv1, fv2;
if ((++frm_cnt % 2)) {
continue;
}
wdr_chn = 1;
for (k = 0; k < wdr_chn; k++) {
for ( i = 0 ; i < focus_cfg.config.zone_row; i++ ) {
for ( j = 0 ; j < focus_cfg.config.zone_col; j++ ) {
td_u32 h1 = zone_metrics[k][i][j].h1;
td_u32 h2 = zone_metrics[k][i][j].h2;
td_u32 v1 = zone_metrics[k][i][j].v1;
td_u32 v2 = zone_metrics[k][i][j].v2;
fv1_n = (h1 * ALPHA + v1 * ((1 << BLEND_SHIFT) - ALPHA)) >> BLEND_SHIFT;
fv2_n = (h2 * BELTA + v2 * ((1 << BLEND_SHIFT) - BELTA)) >> BLEND_SHIFT;
sum_fv1 += af_weight[i][j] * fv1_n;
sum_fv2 += af_weight[i][j] * fv2_n;
wgt_sum += af_weight[i][j];
}
}
}
fv1 = sum_fv1 / wgt_sum;
fv2 = sum_fv2 / wgt_sum;
printf("%4d %4d\n", fv1, fv2);
}
#endif
return TD_SUCCESS;
}
PQTools 滤波器设计工具使用说明
PQ工具提供了自动对焦参数仿真插件,使图像质量调试人员可以:
- 根据截止频率自动获取较适合的AF参数,并查看对应的频率响应曲线;
-
自行配置AF参数,并查看对应的频率响应曲线。
工具界面
从PQ工具主界面工具栏的外挂插件下拉框中选择“PQ Auto Focus Simulator”,可以打开自动对焦参数仿真工具,如图1所示。

工具分为For Horizental filters 和For Vertical filters两个页签,相互独立,分别对应水平和垂直方向的滤波器参数仿真。下面叙述的内容对两个页签均有效。
AF水平滤波器具备以下两种模式:
- 窄带模式(Narrow Band):此种模式下,AF水平滤波器将在一个较小的频率范围内进行对焦。当用户设置的截止频率的低频小于0.04时,工具将推荐用户使用窄带模式。这个模式下,截止频率高频最大值为0.25。
- 宽带模式(Wide Band):此种模式下,AF水平滤波器将在一个较大的频率范围内进行对焦。当截止频率的低频大于或等于0.04时,工具将推荐用户使用宽带模式。这个模式下,截止频率高频最大值为0.5。
用户可以在PQ工具主界面(已经加载调试表)上找到StatisticsConfig -> AFConfig_HParam_IIR0的寄存器分组来对模式和滤波系数进行设置。
通过截止频率获取AF滤波系数
在每个页签中,用户均可以用截止频率来生成滤波系数。在Generate from Frequencies处输入截止频率的低频和高频后,点击“Generate AF Parameters”,即可生成截止频率对应的滤波系数,显示在Parameters adjustment下方的各个文本框中,并在右侧的坐标图上显示对应该组滤波系数的频率响应曲线,曲线以红色表示,如图1和图2所示。


须知:
截止频率在工具中会自动适配精度。水平滤波器的截止频率取小数点后两位,垂直滤波器的截止频率取小数点后一位。取精度时,多余的小数位数直接舍弃。
手动配置滤波系数
除了通过截止频率获取对应的滤波系数,用户还可以手动进行每个滤波系数项进行设置。在Parameters adjustment处,找到对应的参数并进行修改后,工具将自动计算这组参数的频率响应曲线并绘制在右侧。曲线以红色表示。
设置参考组
如果用户想要在不同组的滤波系数间对比,可以使用参考组功能。当用户需要将某一组滤波系数列为参考组时,点击“Add to Reference List”按钮,工具即会在右下角的列表中添加一行,列出该参考组的参数项,如图1所示。

对于每一个参考组,工具还将在上方的坐标图上生成一条曲线,以灰色表示,如图2所示:

用户还可以将某一参考组的曲线高亮显示出来。在列表中点击需要高亮显示的参考组,此时对应的曲线会在上方的坐标图中变成蓝色,如图3所示。

通过这样的方式,用户可以在不同的参考组间进行频率响应曲线对比,从而发现更优的方案。
须知:
- 在坐标图上,红色的当前参数曲线和蓝色的参考组高亮曲线相对其他的灰色参考组曲线处于更上方的位置。因此,会出现刚刚添加参考组时看不到灰色曲线的状况。此时只要修改滤波系数,使红色曲线重新绘制,就能看到灰色的参考曲线。
- 每个页签上最多只能添加6组参考组。如果需要添加更多参考组,请先点击Clear Reference List删除所有参考组。
AE/AF同步回调
当一帧图像最后一个pixel通过AF模块后,统计值即更新,推荐用户通过ss_mpi_isp_get_vd_time_out同步获取3A统计值,例如AutoFocus和ZoomTracking算法完成目标focus和zoom position的计算。
如果用户使用的是LINUX系统,因为user space任务调度不能保证一致的实时性,建议将需要保证实时性的驱动配置放在kernel space完成。ISP提供同步回调接口的注册,可以实现与VD同步。在本章有相应的接口使用描述,用户可以将实时性要求较高的任务放在同步回调里面,底层提供HwIRQ,Workqueue两种方式实现,可以选择相应的实现方式以确定实时级别。HwIRQ是指任务放在中断服务中实现,实时性最高;Workqueue的实时性取决于linux系统调用。
目前在sample_ist.c提供了注册同步任务的示例,可以在内核态及时获取AE/AF的统计信息,用于及时性要求较高的特性,但是需要注意使用此种方式获取AE/AF统计信息,中断耗时过长,需注意在中断获取和配置的总耗时是否会出现跨帧,出现跨帧则可能达不到预期效果。

【注意事项】
- 注册ot_sample_ist.ko之后,将调度ot_isp_sync_task_register,将同步节点注册到ISP内。如果同步节点只需要AE同步任务处理,可以将AF同步任务进行删除, 减少中断冗余耗时,反之AF亦然。
- sample_ist.c文件中只提供了AF和AE打印分块统计信息的示例(info打印级别,需要修改isp的打印等级才可以看到示例打印信息),如果需要其他统计信息,可以按需完成回调函数isp_sync_tsk_callback的实现。
- AE和AF统计信息只提供了统计信息,皆未提供坐标信息。
-
使用同步任务获取AE/AF统计信息时,需要注意增加的中断耗时,勿出现跨帧处理。
API参考
- ot_isp_sync_task_register:向ISP注册同步回调接口。
-
ot_isp_sync_task_unregister:向ISP反注册同步回调接口。
ot_isp_sync_task_register
【描述】
向ISP注册同步回调接口。
【语法】
【参数】
【返回值】
【需求】
头文件:isp_ext.h.
【注意】
- 使用前需要确保ISP驱动已加载。
- 因为ISP同步回调内部实现不保存用户传入的new_node指向的实体,所以要求使用ot_isp_sync_task_node定义实体时不能为局部变量。
【举例】
无
【相关主题】
ot_isp_sync_task_unregister
【描述】
向ISP反注册同步回调接口。
【语法】
【参数】
【返回值】
【需求】
头文件:isp_ext.h.
【注意】
使用前需要确保ISP驱动已加载。
【举例】
无
【相关主题】
数据类型
- ot_isp_sync_tsk_method:定义同步回调方法,决定实时性。
- ot_isp_drv_focus_zone:AF分区间统计信息。
- ot_isp_drv_fe_focus_statistics:AF FE统计信息
- ot_isp_drv_be_focus_statistics:AF BE统计信息
- ot_isp_drv_af_statistics:AF模块统计信息。
-
ot_isp_sync_task_node:定义同步回调节点信息。
ot_isp_sync_tsk_method
【说明】
定义同步回调方法,决定实时性。
【定义】
typedef enum {
ISP_SYNC_TSK_METHOD_HW_IRQ = 0,
ISP_SYNC_TSK_METHOD_WORKQUE,
ISP_SYNC_TSK_METHOD_BUTT
} ot_isp_sync_tsk_method;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_drv_focus_zone
【说明】
AF分区间统计信息。
【定义】
typedef struct {
td_u16 v1;
td_u16 h1;
td_u16 v2;
td_u16 h2;
td_u16 y;
td_u16 hl_cnt;
} ot_isp_drv_focus_zone;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_drv_fe_focus_statistics
【说明】
AF FE分块统计信息。
【定义】
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_drv_be_focus_statistics
【说明】
AF BE分块统计信息。
【定义】
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_drv_af_statistics
【说明】
AF模块统计信息。
【定义】
typedef struct {
ot_isp_drv_fe_focus_statistics fe_af_stat;
ot_isp_drv_be_focus_statistics be_af_stat;
} ot_isp_drv_af_statistics;
【成员】
【注意事项】
无
【相关数据类型及接口】
无
ot_isp_sync_task_node
【说明】
定义同步回调节点信息。
【定义】
typedef struct {
ot_isp_sync_tsk_method method;
td_s32 (*isp_sync_tsk_callback)(td_u64 data);
td_u64 data;
const char *sz_id;
struct osal_list_head list;
ot_isp_drv_af_statistics *focus_stat;
ot_isp_ae_stats *ae_stat;
} ot_isp_sync_task_node;
【成员】
【举例】
获取AF统计信息同步节点
ot_isp_sync_task_node sync_node= {
.method = ISP_SYNC_TSK_METHOD_HW_IRQ,
.isp_sync_tsk_callback = sync_af_calc,
.data = 0,
.focus_stat = &g_focus_stat, /* if don't need af stats, can delete this task or */
/* set focus_stat = TD_NULL and let isp_sync_tsk_callback do nothing */
.ae_stat = TD_NULL,
.sz_id = "hw_0"
};
获取AE统计信息同步节点
ot_isp_sync_task_node sync_node= {
.method = ISP_SYNC_TSK_METHOD_HW_IRQ,
.isp_sync_tsk_callback = sync_ae_calc,
.data = 1,
.focus_stat = TD_NULL,
.ae_stat = &g_ae_stats, /* if don't need ae stats, can delete this task or */
/* set ae_stat = TD_NULL and let isp_sync_tsk_callback do nothing */
.sz_id = "hw_0"
};
【注意事项】
-
如果不需要使用AF统计信息,可以将focus_stat置为TD_NULL,ae_stat赋为有效值,不注册focus_stat有效的同步任务节点。
中断根据注册的同步任务节点中ae_stat和focus_stat的有效性,来决定获取AE还是AF统计信息,如果只需其中一个,可以将另一个置为NULL,节省中断耗时。
-
AE统计信息复用ot_isp_ae_stats的结构体,其中的坐标信息未赋值,内核态获取的AE统计信息规格同接口层获取的AE统计信息,请见ot_isp_ae_stats的结构体。
【相关数据类型及接口】
不带光敏AE快速收敛模式(无光敏快启)使用说明
概述
无光敏快启是在没有光敏传感器反馈当前亮度的情况下,AE算法在启动后以最快速收敛到目标亮度范围的功能。此功能目前在大部分场景下可以在10帧内收敛到目标亮度范围。其中目标亮度范围为[目标亮度-目标亮度*10%,目标亮度+目标亮度*10%]。例如,当目标量亮度为50,则目标亮度范围为[45,55]。在使用此功能时,Sensor的驱动要进行相应的适配。
适配不带光敏AE快速收敛模式(无光敏快启)
-
适配Sensor的写寄存器方式。无光敏快启要求对配置给Sensor的曝光参数的延迟生效要求为3帧。即AE算法在第1帧对Sensor配置曝光参数,在第4帧时能够获取到相应曝光参数生效的亮度统计信息(即Raw)。如果Sensor的延迟生效帧数不符合3帧,则需要对Sensor的驱动进行修改适配。一般来说,目前大部分的Sensor在平台上,总体的延迟生效帧数为4帧。可将Sensor驱动适配为调用I2C接口直接写Sensor寄存器的方式设定曝光参数(包括曝光行数、Sensor模拟增益、Sensor数字增益)。这样的方式可以使Sensor提前1帧生效曝光参数。具体可参考hy_s0603的驱动代码进行适配。
需要注意将Sensor改为用I2C接口直接写寄存器的方式后,相应的曝光行数、Sensor模拟增益、Sensor数字增益和ISP 数字增益的生效延迟帧数也要同保证同步,以确保曝光的同步。
-
配置pfn_cmos_ae_quick_start_status_set回调函数。无光敏快启收敛后,会调用此回调函数同时设定quick_start_status为TD_TRUE。此时通过此参数状态,将步骤1中的直接调用I2C接口方式配置寄存器的方式更改回普通方式。
-
设定无光敏快启相关参数:
- ae_sns_dft->quick_start.quick_start_enable设置为TD_TRUE打开无光敏快启功能。
- ae_sns_dft->quick_start.black_frame_num设定初始坏帧数。因部分Sensor在启动时,会输出若干坏帧,为了确保AE算法能够及时获取到有效的统计数据。需要填入正确的坏帧数,没有坏帧则填入0。
- ae_sns_dft->quick_start.ir_mode_en 设置无光敏快启下是否支持红外模式。如果是需要支持带有IR CUT和IR LED无光敏快启,则需要打开此模式。
- ae_sns_dft->quick_start.init_exposure_ir 设置无光敏快启红外模式下的初始曝光量。
- ae_sns_dft->quick_start.iso_thr_ir 设置无光敏快启普通模式切换到红外模式的ISO阈值。上层根据获取到的ISO值是否大于iso_thr_ir判定是否要打开IR CUT和IR LED进入红外模式。同时AE快速收敛算法内部也会根据此参数判定是否要切换到快速收敛的红外模式进行继续收敛。
- ae_sns_dft->quick_start.ir_cut_delay_time 设置无光敏快启IR CUT打开需要的物理时间。单位为ms。
以上变量值均可通过Sensor驱动中的sensor_set_init()函数由外部传入进行灵活设定。
-
标定初始曝光量。在相同的曝光参数下,由于不同Sensor具有不同的光电敏感度。同时不同大小的光圈和不同的滤光片的选择都会对Sensor的最终曝光亮度有不同影响。当前的无光敏快启的初始曝光量需要进行标定。标定步骤和方法如下:
- 将辉度箱设定为EV8亮度。
- 将max_hist_offset设置为0,同时将AE算法设定为手动模式。
- 将相机镜头对着辉度箱。调节曝光量,同时查看Proc调试信息的OriAve值(不带权重的画面平均亮度),当OriAve值为80时,此时对应的曝光量作为初始曝光量。
-
初始曝光量微调。对于不同的产品形态有不同的亮度使用范围,可以对步骤4的初始曝光量进行微调,加快无光敏快启AE算法收敛的速度,以适应不同产品需求。
注意事项
- 在13.6.2小节的2中,将Sensor 配置为用I2C接口直接写Sensor寄存器的方式设定曝光量。在无光敏快启收敛完成后,需要进行相应的配置将Sensor的配置方式设定回普通方式。
- 初始亮度80为推荐值,用户可以根据产品形态和适应的亮度范围在此基础上进行上下调节以达到最佳收敛速度。如果没有辉度箱标定环境。可以使用曝光时间24ms,ISO100,光圈1.6相应的等曝光量曝光参数组合作为初始曝光量的进行调试。
带IR CUT无光敏快启基本流程

须知:
- 在确定长时间处于低照度环境下,为了减少IR CUT的切换次数,可以不进行IR CUT复位操作,即省略如上红色字体部分操作。
- 蓝框内的流程为上层应用操作。
附录
注册函数的关系
ss_mpi_isp_ae_lib_reg_callback和ss_mpi_isp_awb_lib_reg_callback这两个接口是ISP firmware库提供的钩子函数,用于开发3A算法库时实现注册动作。例如SDK 提供的3A算法库的ss_mpi_ae_register和ss_mpi_awb_register接口,在实现时调用了相应的钩子函数,所以调用ss_mpi_ae_register能实现AE算法库向ISP firmware库注册。
同样的,3A算法库同样也提供了钩子函数,用于Sensor库实现向3A算法库注册的动作。例如ss_mpi_ae_sensor_reg_callback和ss_mpi_awb_sensor_reg_callback,在xxx_cmos.c中可以看到调用了这些钩子函数的函数sensor_register_callback。用户在开发3A算法库时,也可以通过提供钩子函数的方式,实现Sensor库向3A算法库的注册。
当然,ISP firmware库也提供了钩子函数,用于Sensor库实现向ISP firmware库注册的动作。例如ss_mpi_isp_sensor_reg_callback,在xxx_cmos.c中可以看到调用了该钩子函数的函数sensor_register_callback。
所以,当用户调用ss_mpi_ae_register、ss_mpi_awb_register和sensor_register_callback就完成了3A算法库向ISP firmware库注册、Sensor库向3A算法库和ISP firmware库注册。
说明:
用户开发3A算法库时,请自行实现ss_mpi_axx_register接口。同时也请自行实现ss_mpi_axx_sensor_reg_callback钩子函数,并在sensor_register_callback中增加调用该钩子函数的代码,相关代码可以参考ISP firmware库的开源代码。
扩展性的设计考虑
在代码中有ot_vi_pipe、ot_isp_3a_alg_lib、ot_sensor_id这样一些概念,这些概念是出于架构扩展性的考虑。
- ot_vi_pipe主要考虑的是支持多个ISP单元的情形。无论是多个ISP硬件单元,或是一个ISP硬件单元分时复用,从软件意义上讲,需要预留出扩展性。
- ot_isp_3a_alg_lib主要考虑的是支持多个算法库,并动态切换的情形。例如用户实现了一套AE算法代码,但注册两个库,分别用于正常场景和抓拍场景,那么这时候需要用结构体中的handle来进行区分。例如用户实现了一套AWB算法代码,同时又想在某些场景下使用AWB算法库,那么这时候可以用结构体中的lib_name进行区分。当用户注册多个AE库,或AWB库时,ISP firmware将会全部对它们进行初始化,但是在运行时,仅会调用有效的库,设置有效库的接口是ss_mpi_isp_set_bind_attr,通过此接口可以快速切换运算的库。
- ot_sensor_id仅起一个校验作用,确认注册给ISP firmware库和3A算法库的是同一款sensor。
这些概念仅是设计时预留的冗余,如果完全不需要这些概念,可以在开发时去掉这些概念。
3A架构的设计思路
设计思路基本是这样,ISP firmware初始化并销毁各个算法单元;在运行时,提供前一帧的统计信息,并根据返回值配置寄存器,其他内容,均由用户开发。所以当用户替换自己的3A算法后,当前的AE/AWB的MPI不可复用,cmos.c中的AE/AWB相关的内容不可复用,对于AE的权重配置和AWB的找白点配置的内容不可复用,这几个配置理论上是由3A算法配置,而不是从ISP firmware获取,ISP firmware中仅有简单的初始化值。
3A算法并不需要显式地去配置ISP寄存器,只需将需要配置的ISP寄存器值写到ot_isp_ae_result和ot_isp_awb_result结构体中即可;也不需要显式地去读取ISP寄存器,只需从ot_isp_ae_info和ot_isp_awb_info结构体中读取即可。
外部寄存器的说明
在_录像机_的应用中,通常除了业务主程序进程外,板端还会有另外的进程去支持PC端的工具来调节图像质量。ISP的各个算法的许多状态、参数均驻留于全局变量中,不足以支持多进程的访问,所以引入外部寄存器的概念,用以支持多进程的业务场景。用户通过PC端工具与板端进程通信,调用SDK提供的MPI,实际是改变外部寄存器中的内容,从而改变业务主程序中的ISP的各个算法的状态和参数。
外部寄存器还能与实际的硬件寄存器通过统一的接口读写,形式上与实际的硬件寄存器无差别。
用户如果使用外部寄存器的话,有这些已封装好的接口可以使用,当然用户也可以有其他方案实现多进程的支持。外部寄存器的地址空间是自定义的,只要不冲突即可。详细请参考开源代码,接口定义在isp_vreg.h文件中。
工频闪类型自适应Sample用例处理流程

- 以上为工频闪类型自适应Sample用例的处理流程(calcflicker sample用例0)。此用例使用多次检测的结果进行确认后自动适配相应的抗闪参数。此用例作为使用Auto Flicker Type Detection(自动工频闪类型检测)接口进行自适应抗闪的参考。
-
检测结果为OT_ISP_FLICKER_TYPE_UNKNOW(有未知类型的工频闪)的原因有几种情况:
-
Camera摇晃导致检测不稳定。
- 图像中存在大面积的运动物体。
- 环境光源为同时存在50Hz和60Hz的混合光源。
- 环境光源为既不是50Hz也不是60Hz频率的非通用频率光源。以上这几种情况可根据实际情况灵活处理。

