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

Posted

技术标签:

【中文标题】使用后置摄像头计算场景亮度【英文标题】:Calculate scene luminance using the back camera 【发布时间】:2012-10-20 03:04:36 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

很遗憾,您说得对,目前无法从 Android 相机 API 获取此数据。

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

【讨论】:

【参考方案2】:

在某些设备(仅限较新的 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...

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

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

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

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

【讨论】:

以上是关于使用后置摄像头计算场景亮度的主要内容,如果未能解决你的问题,请参考以下文章

如何限制插件在android / cordova中切换后置/后置摄像头

检测缺少后置摄像头

使用后置摄像头的人脸检测无法使用 camera2 API 正常工作

OpenCV+python实现摄像头简单手势识别--进度条控制亮度

是否可以在Android中同时使用前置和后置摄像头[重复]

使用 iPad 3 的后置摄像头作为放大镜 [关闭]