使用后置摄像头计算场景亮度

时间:2012-10-30 17:40:53

标签: android image-processing android-camera luminance

我正在使用三星Galaxy Tab 10.1在Android上构建应用程序。 我想使用设备的后置摄像头获取场景亮度的值。

不幸的是,我找不到直接从设备背面的光传感器访问读数的方法。因此,我目前通过计算每个灰度帧的平均值手动估算亮度。但是,由于帧曝光和白平衡的自动校正,这种方法是不准确的。例如,如果您将相机指向一个非常明亮的光源,相机会使整个图像变暗,并且灰度帧的平均值将太低(因为明亮光源外的区域现在将非常暗)。

我搜索的方法可以让我禁用我提到的自动更正,但没有找到任何内容。

是否有方法可以让我使用后置摄像头获取场景亮度值?

2 个答案:

答案 0 :(得分:2)

不幸的是,您确定目前无法从Android相机API获取此数据。

根据您的设备,您可以拍摄照片,然后从中读取EXIF数据。这可能会让您看到曝光(ISO和快门速度)。这是像Tiny Light Meter这样的应用使用的方法。问题是某些设备没有完全填充EXIF数据,所以这种方法是命中注定。

答案 1 :(得分:0)

在某些设备(仅限较新的机器人)中,支持点测光。您可以使用由AsyncTask等单独的计时器线程触发的JPEG回调,然后读取将计量到选择点的EXIF信息。要检查这是否可用,您可以使用:

//on Event Touch callback on your SurfaceView
x=event.getX();
y=event.getY();
params=camera.getParameters();
... //check for rotation, calculate focus point (x, y: -1000, 1000)
if(params.getMaxNumMeteringAreas() > 0){
    //draw a meter area, however big you want, 1000 is weight (0-1000)
    Camera.Area ca=new Area(new Rect(x-25, y-25, x+25, y+25), 1000);
    List<Camera.Area> areas=new ArrayList<Area>();
    areas.add(ca);
    params.setFocusAreas(areas);
    params.setMeteringAreas(areas);
    camera.setParameters(params);
}else{
    //process the Bitmap and do the below...
}

在较旧的设备上(如果你想要向后兼容),你仍然可以设置一个焦点(存储在你的代码中),然后对焦点周围的像素的平均值(我使用6%的宽度和高度)进行比较EXIF值(如果它更暗,降低曝光等)。为此,您可能希望使用按下按钮(因为较旧的设备在执行JPEG回调时会滞后)。

average=((r+g+b)/3-128)/256
myEV=myEV+myEV*average

使用这两种方法,只需确保您正在阅读的图像已正确旋转(您可以将其放入ImageView进行检查并将其与预览进行比较)。

从EV可以相对容易地转换为Lux或脚蜡烛(或者您喜欢的任何测量值)。