即使相机正在进行自动校正,也可以使用像素值计算(或估算)亮度值?

时间:2012-12-18 22:43:18

标签: android image-processing android-camera light luminance

我实际上正在Android上做一个项目,我冒昧地实时计算或估计来自后置摄像头的亮度(这意味着从后置摄像头拍摄帧并且每个都有一个亮度值)时间框架改变)! 不幸的是,我无法实时访问摄像机的参数,所以当面对光线(ISO,快门时间或光圈!)时,我无法真正知道相机在其参数下的作用。

基本上,相机会根据进入它的光线强度改变其参数,所以在计算灰度图像的平均值时,例如,在某些情况下我们有假值! (例如,当面对点光源时,由于相机的自动校正,一切都会变成黑暗)

所以,我问自己是否有方法使用帧的像素值来检测相机捕获的帧的亮度值:滤波器,计算方法,算法或类似的东西,可以在不知道相机参数的情况下将像素值映射到照明值!!

我的意思是,检测光线(具有定量值),即使相机通过更改其参数(当前Android API无法访问)从像素值(因为,在我的身上)进行自动校正意见是我们可以操纵的唯一信息,以获得有关亮度的信息!)。

这将真正帮助我实现我的项目!如果有什么不清楚,请告诉我;)

谢谢:)

1 个答案:

答案 0 :(得分:1)

这非常简单。您应该使用surfaceview和相机预览。这样你就可以将每个帧作为字节数组。帧的默认格式是YUV,即Y(亮度)和UV,它们是色度。您可以使用Y计算图像中的平均亮度。如果您正在使用BGR,则可以使用以下公式计算亮度:Y = 0.2126 R + 0.7152 G + 0.0722 B

class Preview extends ViewGroup implements SurfaceHolder.Callback {

SurfaceView mSurfaceView;
SurfaceHolder mHolder;

Preview(Context context) {
    super(context);

    mSurfaceView = new SurfaceView(context);
    addView(mSurfaceView);

    // Install a SurfaceHolder.Callback so we get notified when the
    // underlying surface is created and destroyed.
    mHolder = mSurfaceView.getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

... }

将回调添加到您的类中,意味着调用此方法的每一帧:

onPreviewFrame(byte [] frame, Camera cam){
   //do some processing
}

OpenCV有一些很好的功能来完成这些计算。