在Aurora中,目前提供了对白平衡(Write Balance)、效果(Effect)、亮度(brightness)、反冲带(antibanding)、iso、夜间模式、旋转、luma、质量、帧速率等参数的默认支持。下面以白平衡为例进行介绍。
在进一步了解白平衡前,需要首先了解黑体和色温的概念。
根据基尔霍夫辐射定律,在热平衡状态的物体所辐射的能量与吸收的能量之比与物体本身物性无关,只与波长和温度有关。而辐射出去的能量在各个波段是不同的,具有一定的谱分布。这种谱分布与物体本身的特性及其温度有关,称之为热辐射。
如果入射的能量能全部被吸收,则既没有反射,也没有透射,这种理想物体就是黑体。
英国著名物理学家Kelvin认为,假定某一黑体物质,能够将落在其上的所有热量吸收,而没有损失,同时又能够将热量生成的能量全部以“光”的形式释放出来,它便会因受到热力的高低而变成不同的颜色。颜色成分与该黑体所受的热力温度是相对应的,该温度即色温。
当黑体受到的热力相当于500℃~550℃时,就会变成暗红色,达到1050℃~1150℃时,就变成黄色,温度继续升高会呈现蓝色。
由于人眼具有独特的适应性,使我们有的时候不能发现色温的变化。比如在钨丝灯下待久了,并不会觉得钨丝灯下的白纸偏红,如果突然把日光灯改为钨丝灯照明,就会有白纸的颜色偏红的感觉,但这种意识也只能够持续短暂的时间。
与人眼不同,数码相机所采用的感光材料不具备这种适应能力,如果摄像机的色彩调整同景物照明的色温不一致就会发生偏色。
白平衡就是针对不同色温条件,通过调整数码相机内部的色彩电路,使拍摄出来的影像抵消偏色,更接近人眼的视觉习惯。白平衡可以简单地理解为在任意色温条件下,数码相机所拍摄的标准白色经过电路的调整,使之成像后仍然为白色。
所谓自动白平衡,是指依赖数码相机里的测色温系统,测出红光和蓝光的相对比例。再依据此数据调整曝光,产生红、绿、蓝电信号的增益。自动白平衡大的优势是简单、快捷。
白平衡是图像处理领域的一个重要概念,主要用来解决色彩还原和色调处理的一系列问题。
在Aurora中,拍照参数的设置都是通过Camera驱动来进行的,Camera驱动的实现遵循Linux驱动的统一模型,为了设置参数,需要通过调用ioctl来进行。下面是Aurora中对白平衡参数的设置:
代码:白平衡参数的设置
void QualcommCameraHardware::setSensorWBLighting(int camfd, const char* lighting)
{
int ioctlRetVal=TRUE, lightingValue=1;
struct msm_ctrl_cmd_t ctrlCmd;
ctrlCmd.timeout_ms=5000; //超时时间
ctrlCmd.type =CAMERA_SET_PARM_WB; //参数类型
ctrlCmd.length=sizeof(uint32_t);
ctrlCmd.value=NULL;
for (int i=1; i< MAX_WBLIGHTING_EFFECTS; i++) {
if (! strcmp(wb_lighting[i], lighting)) {
LOGV("In setSensorWBLighting : Match : %s : %d ", lighting, i);
lightingValue=i;
ctrlCmd.value=(void *)&lightingValue; //白平衡值
break;
}
}
if(ctrlCmd.value!=NULL)
{
//向Camera驱动发送命令
if((ioctlRetVal=ioctl(camfd, MSM_CAM_IOCTL_CTRL_COMMAND, &ctrlCmd))<0) {
LOGV("setSensorWBLighting : ioctl failed. ioctl return value is %d \n", ioctlRetVal);
}
}
else
{
LOGV(" setSensorWBLighting : No match found for %s ", lighting);
}
}
其他Camera参数的设置和白平衡类似,相关的实现在QualcommCameraHardware.cpp文件中均可找到,这里就不再过多叙述了。