android - Android Camera2:如何实现半自动快门速度优先模式
问题描述
目标
- 使用连接到移动车辆的 Android 智能手机拍摄图像
- 频率:1赫兹
- 参考型号:谷歌 Pixel 3a
- 感兴趣的对象:车辆前方的道路/方式
- 图片用途:作为机器学习(如 RNN)的输入,以识别道路/路面上的损坏
- 拍摄环境:室外,仅限阴天
当前状态
- 捕获作品(由于数据大小,目前使用 JPEG 而不是 RAW)
- 自动曝光有效
- 静态焦距有效
挑战
- 图片中的道路/道路的表面通常是模糊的
- 运动模糊的来源主要来自摇晃的车辆/固定电话
- 为了减少运动模糊,我们要使用“快门速度优先模式”
- 即最小化快门速度=>增加ISO(接受增加噪点)
- 只有一个光圈 (f/1.8) 可用
- Camera2 API 中没有可用的“快门速度优先模式”(简称:Tv/S-Mode)
- CameraX API (还)没有提供我们需要的东西(静态焦点、Tv/S 模式)
脚步
- 将快门速度设置为支持的最快曝光(简单)
- 自动调整 ISO 设置以进行自动曝光(例如这个公式)
- 要计算 ISO,唯一缺少的部分是光照水平 (EV)
问题
- 如何在拍摄期间连续估计 EV 以在使用固定快门速度时自动调整 ISO?
到目前为止的想法:
- 如果我可以在没有实际启用的情况下从 Camera2 自动曝光 (AE) 例程中读出“建议”,
AE_MODE_ON
那么我可以轻松计算 EV。但是,到目前为止,我还没有找到用于此的 API。我想如果没有路由设备是不可能的。 - 如果环境光传感器能够提供自动曝光(计算 EV)所需的所有信息,这也将非常容易。但是,据我了解,它只测量入射光而不是反射光,因此测量没有考虑图片中的实际物体(它们的表面如何反射光)
- 如果我可以从最后一次捕获的像素中获取信息,这也是可行的(如果计算时间适合两次捕获之间的时间)。但是,据我所知,像素“亮度”在很大程度上取决于捕获的对象,即如果捕获的对象的亮度发生变化(路边的许多“黑马”或“白熊”)我会计算EV值不好。
- 在实际捕获之间捕获自动曝光的图像,并根据实际捕获的中间捕获中使用的自动选择设置计算光照水平。根据我的理解,这将是一种相对“好”的方式,但在资源端相当困难——我不确定两次捕获之间的可用时间是否足够。
也许我没有看到更简单的解决方案。有没有人做过这样的事情?
解决方案
是的,您需要实现自己的自动曝光算法。所有“真正的”AE 必须通过传感器捕获的图像,所以理论上你可以构建一些同样擅长猜测正确光照水平的东西。
在实践中,你不可能匹配它,因为你有一个更长的反馈循环(AE 算法可以在同步要求上作弊,并且比应用程序更快地更新传感器设置),并且因为 AE 算法可以使用硬件统计单元(收集整个场景的直方图和平均值),这使它更有效。
但是一个简单的自动曝光算法是对整个场景(或场景的一部分,或场景的每十分之一像素等)进行平均,如果该平均值低于最大值的一半,则增加 ISO,如果它是以上,减少。换句话说,一个基本的反馈控制回路。所有关于稳定性、收敛性等的问题都适用。所以一点控制理论的理解在这里会很有帮助。我建议将低分辨率 YUV 输出(可能是 640x480?)从相机输出到 ImageReader 以用作源数据,然后只查看 Y 通道。在这种情况下,没有大量数据需要处理。
或者正如 hb0 所提到的,如果您的户外条件非常有限,您可以尝试为每个条件硬编码值。但是室外亮度的范围可能非常大,因此这需要进行大量测试以确保它能够正常工作,并且每次都需要手动选择正确的值。
推荐阅读
- office-js - Office js EmailAddressDetails undefined recipientType for Mac
- c# - 尝试对 ASN.1 模式对象执行“__set__”操作
- c++ - 我的代码在构建时没有出现任何错误,但无法正常工作
- google-workspace - 如何使用 PHP 脚本在 gsuite 上为教育创建自定义域电子邮件地址
- c++ - C++:`enable_if` 来限制支持特定算术运算的类型
- python - 使用烧瓶的聊天室
- json - JSON序列化是确定性的吗?
- r - 如何将两列连接到 R 中的一列向量/列表中?
- r - 如何使轴 x 垂直,以便在图中可以理解国家的长名称
- javascript - 如何强制二进制分类为多项分类