项目中用到的OV9712d Sensor,因为产品结构的问题,采用的是小镜头模组,不带滤光片,所以在傍晚时分的低色温情况下,视频画面80%呈绿色;白天时分高色温环境下,视频画面70%以上呈蓝色,这种偏色使监控画面看起来很奇怪。
这主要是因为:可见光的光谱成分随色温变化而变化,在低色温光源下,白色物体偏红,在高色温光源下,白色物体偏蓝。人眼可根据大脑的判断,识别物体的真实颜色,所以看起来偏色了。
海思SDK中已经提供了ISP的WB(White Balance)白平衡算法。
AWB 算法的功能是降低外界光源对物体真实颜色的影响,使得我们采集的颜色信息转变为在理想日光光源下的无偏色信息。
色温:色温是按绝对黑体来定义的,光源的辐射在可见区和绝对黑体的辐射完全相同时,此时黑体的温度就称此光源的色温。
白平衡:在不同色温的光源下,白色会偏蓝或偏红。白平衡算法通过调整 R, G, B三个颜色通道的强度,使白色真实呈现。
AWB模块有硬件的 WB 统计信息模块及 AWB 控制策略算法 fireware 两部分组成。ISP的 WB 统计信息模块统计 sensor 输出的 R, G, B 三个颜色通道的平均比值。可提供整幅图像加权后的比值,还可提供将整幅图像分成 M*N 区块的每个区块的比值。支持将图像分成 M*N(M 行 N 列)区域,统计每个区域的G/R,G/B 均值以及参与统计的白点个数。
海思SDK库中提供的AWB 控制接口如下:
HI_MPI_ISP_SetWBType:设置白平衡类型
HI_MPI_ISP_GetWBType:获取白平衡类型
HI_MPI_ISP_GetAWBAttr:设置自动白平衡属性
HI_MPI_ISP_GetAWBAttr:获取自动白平衡属性
HI_MPI_ISP_SetMWBAttr:设置手动白平衡属性
HI_MPI_ISP_GetMWBAttr:获取手动白平衡属性
HI_MPI_ISP_SetAWBAlgType:设置白平衡算法类型
HI_MPI_ISP_GetAWBAlgType:获取白平衡算法类型
HI_MPI_ISP_SetAdvAWBAttr:设置 ADV 白平衡算法属性
HI_MPI_ISP_GetAdvAWBAttr:获取 ADV 白平衡的属性
HI_MPI_ISP_SetLightSource:设置独立光源点属性
HI_MPI_ISP_GetLightSource:获取独立光源点属性
typedef struct hiISP_ADV_AWB_ATTR_S
{
HI_BOOL bAccuPrior;
HI_U8 u8Tolerance;
HI_U16 u16CurveLLimit;
HI_U16 u16CurveRLimit;
HI_BOOL bGainNormEn;
ISP_AWB_IN_OUT_ATTR_S stInOrOut;
ISP_AWB_CT_LIMIT_ATTR_S stCTLimit;
} ISP_ADV_AWB_ATTR_S;
以上结构体用来控制和调节ISP的白平衡效果,其中:
bAccuPrior: 使能后,可提升室内普通场景白平衡精度。混合光源,大面积纯色,室外等场景建议关闭。
u16CurveLLimit: 对色温曲线的左侧宽度做限制。取值范围为[0x0, 0xFF],取值越小,可支持的光源范围越宽,白平衡精度稍有下降。
u16CurveRLimit: 对色温曲线的右侧宽度做限制。取值范围为[0x100, 0xFFF],取值越大,可支持的光源范围越宽,白平衡精度稍有下降。
u16CurveLLimit: 取值<=0x100, u16CurveRLimit 取值>=0x100。u16CurveLLimit 参数可以排除绿色块的干扰,u16CurveRLimit 参数可以排除红色、蓝色块的干扰。
所以,根据当前环境的色温情况,调节u16CurveLLimit 和u16CurveRLimit的值,即可调节图像偏绿、偏红或者偏蓝的情况,使视频画面最大程度的达到真实的效果。
图像经过AWB调节过后,颜色值要好很多,多次调整色温曲线的宽度值后,颜色基本接近正常。