0

我实际上是在 Android 上做一个项目,我被冒犯到实时计算或估计后置摄像头的亮度(这意味着,从后置摄像头获取帧并在每次帧时都有一个亮度值改变)!不幸的是,我无法实时访问相机的参数,因此我无法真正知道相机在面对光线时使用其参数(ISO、快门时间或光圈!)

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

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

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

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

谢谢 :)

4

1 回答 1

1

这是相当简单的。您应该使用表面视图和相机预览。这样你就可以将每一帧作为一个字节数组。帧的默认格式是 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 有一些很好的函数来做这些计算。

于 2012-12-18T23:04:13.943 回答