Android Camera2:如何实现半自动快门速度优先模式

Android Camera2: How to implement an semi-automatic Shutter Speed Priority Mode

目标

当前状态

挑战

步骤

问题

目前的想法:

  1. 如果我可以从 Camera2 自动曝光 (AE) 例程中读出 "recommendations" 而无需实际启用 AE_MODE_ON,那么我可以轻松计算出 EV。但是,到目前为止我还没有找到 API。我想没有路由设备是不可能的。
  2. 如果环境光传感器能够提供自动曝光(计算 EV)所需的所有信息,这也将非常容易。然而,根据我的理解,它只测量入射光而不测量反射光,所以测量没有考虑图片中的实际物体(它们的表面如何反射光)
  3. 如果我能从最后一次捕获的像素中获取信息,这也是可行的(如果计算时间适合两次捕获之间的时间)。然而,根据我的理解,像素 "bightness" 在很大程度上取决于捕获的对象,即如果捕获的对象的亮度发生变化(许多 "black horses" 或 "white bears" 在 road/way) 我会计算错误的 EV 值。
  4. 在实际拍摄之间拍摄自动曝光的图像,并根据实际拍摄的中间拍摄中使用的自动选择设置计算光照水平。根据我的理解,这将是一种相对 "good" 的方式,但它在资源方面非常困难 - 我不确定两次捕获之间的可用时间是否足够。

也许我没有看到更简单的解决方案。有人做过这样的事吗?

当仅在特定光线条件下拍摄照片时 "outdoor, cloudy":

Tabulated values 可用于曝光值 (EV) 而不是使用光测量。

例子

  • 室外阴天 (OC) 的 EV100 (iso100) = 13
  • OC 的 EV(动态 iso)= EV100 + log2(iso/100)

将此公式与 those formulas 一起使用,我们可以从以下公式计算 iso:

  • 光圈(固定)
  • 快门速度(手动选择)

此外,我们可以添加 UI 选项来选择 "light situation",例如:

  • 室外,多云
  • 室外,晴天
  • 等等

这可能不是最准确的方法,但目前是继续制作原型的第一种简单方法。

是的,您需要实现自己的自动曝光算法。 所有 'real' AE 都必须通过传感器捕获的图像,因此从理论上讲,您可以构建同样擅长猜测正确光照水平的东西。

在实践中,你不太可能匹配它,这既是因为你有一个更长的反馈循环(AE 算法可以在同步要求和更新传感器设置方面比应用程序更快地作弊),也因为 AE 算法可以使用硬件统计单元(收集整个场景的直方图和平均值),从而提高效率。

但一个简单的自动曝光算法是对整个场景(或场景的一部分,或场景的十分之一像素等)进行平均,如果该平均值低于最大值的一半,则增加ISO,如果高于,则降低。换句话说,一个基本的反馈控制回路。所有关于稳定性、收敛性等的问题都适用。因此,了解一些控制理论在这里会很有帮助。我建议将低分辨率的 YUV 输出(可能是 640x480?)从相机的 ImageReader 用作源数据,然后只查看 Y 通道。在那种情况下,不需要处理大量数据。

或者如 hb0 所述,如果您的室外条件非常有限,您可以尝试为每个条件硬编码值。但是室外亮度的范围可能非常大,因此这需要进行一些适当的测试以确保它能够正常工作,并且每次都需要手动选择正确的值。