使用后置摄像头计算场景亮度
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 正常工作