我实际上正在Android上做一个项目,我冒昧地实时计算或估计来自后置摄像头的亮度(这意味着从后置摄像头拍摄帧并且每个都有一个亮度值)时间框架改变)! 不幸的是,我无法实时访问摄像机的参数,所以当面对光线(ISO,快门时间或光圈!)时,我无法真正知道相机在其参数下的作用。
基本上,相机会根据进入它的光线强度改变其参数,所以在计算灰度图像的平均值时,例如,在某些情况下我们有假值! (例如,当面对点光源时,由于相机的自动校正,一切都会变成黑暗)
所以,我问自己是否有方法使用帧的像素值来检测相机捕获的帧的亮度值:滤波器,计算方法,算法或类似的东西,可以在不知道相机参数的情况下将像素值映射到照明值!!
我的意思是,检测光线(具有定量值),即使相机通过更改其参数(当前Android API无法访问)从像素值(因为,在我的身上)进行自动校正意见是我们可以操纵的唯一信息,以获得有关亮度的信息!)。
这将真正帮助我实现我的项目!如果有什么不清楚,请告诉我;)
谢谢:)
答案 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有一些很好的功能来完成这些计算。