2

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

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

我搜索了允许我禁用我提到的自动更正的方法,但没有找到任何东西。

有没有一种方法可以让我使用后置摄像头获取场景亮度的值?

4

2 回答 2

2

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

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

于 2012-10-31T02:41:12.157 回答
0

在某些设备(仅限较新的 Android)中,支持点测光。您可以使用由单独的计时器线程(如 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...
}

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

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

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

从 EV,您可以相对容易地转换为 Lux 或 Foot Candles(或任何您喜欢的测量值)。

于 2013-05-09T04:57:09.767 回答