首页 > 解决方案 > Android Camera2:如何实现半自动快门速度优先模式

问题描述

目标

当前状态

挑战

脚步

问题

到目前为止的想法:

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

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

标签: androidandroid-camera2exposure

解决方案


是的,您需要实现自己的自动曝光算法。所有“真正的”AE 必须通过传感器捕获的图像,所以理论上你可以构建一些同样擅长猜测正确光照水平的东西。

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

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

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


推荐阅读