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

问题描述 投票:1回答:2

目标

  • 使用附着在行驶中的车辆上的Android智能手机捕获图像
  • 频率:1 Hz
  • 参考模型:Google Pixel 3a
  • 感兴趣的对象:车辆前方的道路/道路
  • 图片用法:作为机器学习(如RNN)的输入,以识别道路/道路表面的损坏
  • 捕获环境:室外,仅在阴天

当前状态

  • 捕获有效(由于数据大小,当前使用JPEG而不是RAW)
  • 自动曝光工作
  • 静态焦距工作

挑战

  • 图片中的道路/道路表面经常模糊
  • 运动模糊的来源主要来自震动的车辆/固定电话
  • 为了减少运动模糊,我们想使用“快门速度优先模式”
    • 即最小化快门速度=>增加ISO(接受增加的噪点)
    • 只有一个光圈(f / 1.8)可用
    • Camera2 API中没有“快门速度优先模式”(简称:Tv / S模式)
    • CameraX API尚未(尚未)提供我们所需要的(静态焦点,电视/ S模式)

步骤

  • 将快门速度设置为支持的最快曝光(轻松)
  • 自动调整ISO设置以进行自动曝光(例如此formular
  • 要计算ISO,唯一缺少的部分是亮度(EV)

问题

  • 如何在拍摄过程中连续估计EV以在使用固定快门速度的同时自动调整ISO?

到目前为止的想法:

  1. [如果我无需实际启用AE_MODE_ON就可以从Camera2自动曝光(AE)程序中读出“建议”,则可以轻松计算出EV。但是,到目前为止,我还没有找到用于此的API。我想如果不对设备进行路由是不可能的。
  2. 如果环境光传感器将提供自动曝光(计算EV)所需的所有信息,这也将非常容易。但是,据我了解,它仅测量入射光而不是反射光,因此该测量未考虑图片中的实际对象(它们的表面如何反射光)]
  3. 如果我可以从最后一次捕获的像素中获取信息,这也是可行的(如果计算时间适合两次捕获之间的时间)。但是,根据我的不了解,像素“亮度”在很大程度上取决于所捕获的对象,即,如果所捕获对象的亮度发生了变化(道路/道路旁的许多“黑马”或“白熊”),我会计算出EV值错误。
  4. 在实际拍摄之间拍摄自动曝光的图像,并根据实际拍摄之间的拍摄中使用的自动选择设置来计算亮度。根据我的理解,这将是一个相对“好的”方式,但是在资源端却相当困难-我不确定两次捕获之间的可用时间是否足以满足此要求。

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

android android-camera2 exposure
2个回答
0
投票

当图片仅在特定的光照条件下拍摄,例如“室外,阴天”:

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

示例

  • 室外多云(OC)的EV100(iso100)= 14
  • OC的EV(动态iso)= EV100 + log2(iso / 100)

those formulas一起使用该公式,我们可以根据以下公式计算iso:

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

另外,我们可以添加一个UI选项来选择“轻情况”,例如:

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

这可能不是最准确的方法,但就目前而言,这是继续进行原型制作的第一种简便方法。


0
投票

是,您需要实现自己的自动曝光算法。所有“真实” AE都必须经过传感器捕获的图像,因此,从理论上讲,您可以构建出能够猜测正确的光照水平的东西。

在实践中,您不可能匹配它,这是因为您有一个更长的反馈循环(AE算法可能比同步应用欺骗一些,并且比应用程序可以更快地更新传感器设置),并且因为AE算法可以使用硬件统计单位(收集整个场景的直方图和平均值),从而使其效率更高。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.