Android Camera2:如何实现半自动快门速度优先模式
Android Camera2: How to implement an semi-automatic Shutter Speed Priority Mode
目标
- 使用 Android smartphone 连接到移动车辆
拍摄图像
- 频率:1赫兹
- 参考型号:GooglePixel 3a
- 感兴趣的物体:车辆road/way前方
- 图片用途:作为机器学习(如 RNN)的输入以识别 road/way 表面上的损伤
- 拍摄环境:室外,仅限阴天
当前状态
- 正在拍摄作品(由于数据大小,目前使用 JPEG 而不是 RAW)
- 自动曝光有效
- 静态焦距有效
挑战
- 图片中ways/roads的表面经常比较模糊
- 运动模糊的来源主要是抖动vehicle/fixedphone
- 为了减少运动模糊,我们想使用 "Shutter Speed Priority Mode"
- 即最小化快门速度 => 增加 ISO(接受增加噪音)
- 只有一个光圈(f/1.8)可用
- Camera2API
中没有"Shutter Speed Priority Mode"(简称:Tv/S-Mode)
- CameraX API 不(还)提供我们需要的东西(静态对焦,Tv/S 模式)
步骤
- 将快门速度设置为支持的最快曝光(简单)
- 为自动曝光自动调整 ISO 设置(例如这个formular)
- 要计算 ISO,唯一缺少的部分是光照水平 (EV)
问题
- 如何在使用固定快门速度的情况下,在拍摄过程中连续估算EV以自动调整ISO?
目前的想法:
- 如果我可以从 Camera2 自动曝光 (AE) 例程中读出 "recommendations" 而无需实际启用
AE_MODE_ON
,那么我可以轻松计算出 EV。但是,到目前为止我还没有找到 API。我想没有路由设备是不可能的。
- 如果环境光传感器能够提供自动曝光(计算 EV)所需的所有信息,这也将非常容易。然而,根据我的理解,它只测量入射光而不测量反射光,所以测量没有考虑图片中的实际物体(它们的表面如何反射光)
- 如果我能从最后一次捕获的像素中获取信息,这也是可行的(如果计算时间适合两次捕获之间的时间)。然而,根据我的理解,像素 "bightness" 在很大程度上取决于捕获的对象,即如果捕获的对象的亮度发生变化(许多 "black horses" 或 "white bears" 在 road/way) 我会计算错误的 EV 值。
- 在实际拍摄之间拍摄自动曝光的图像,并根据实际拍摄的中间拍摄中使用的自动选择设置计算光照水平。根据我的理解,这将是一种相对 "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 所述,如果您的室外条件非常有限,您可以尝试为每个条件硬编码值。但是室外亮度的范围可能非常大,因此这需要进行一些适当的测试以确保它能够正常工作,并且每次都需要手动选择正确的值。
目标
- 使用 Android smartphone 连接到移动车辆 拍摄图像
- 频率:1赫兹
- 参考型号:GooglePixel 3a
- 感兴趣的物体:车辆road/way前方
- 图片用途:作为机器学习(如 RNN)的输入以识别 road/way 表面上的损伤
- 拍摄环境:室外,仅限阴天
当前状态
- 正在拍摄作品(由于数据大小,目前使用 JPEG 而不是 RAW)
- 自动曝光有效
- 静态焦距有效
挑战
- 图片中ways/roads的表面经常比较模糊
- 运动模糊的来源主要是抖动vehicle/fixedphone
- 为了减少运动模糊,我们想使用 "Shutter Speed Priority Mode"
- 即最小化快门速度 => 增加 ISO(接受增加噪音)
- 只有一个光圈(f/1.8)可用
- Camera2API 中没有"Shutter Speed Priority Mode"(简称:Tv/S-Mode)
- CameraX API 不(还)提供我们需要的东西(静态对焦,Tv/S 模式)
步骤
- 将快门速度设置为支持的最快曝光(简单)
- 为自动曝光自动调整 ISO 设置(例如这个formular)
- 要计算 ISO,唯一缺少的部分是光照水平 (EV)
问题
- 如何在使用固定快门速度的情况下,在拍摄过程中连续估算EV以自动调整ISO?
目前的想法:
- 如果我可以从 Camera2 自动曝光 (AE) 例程中读出 "recommendations" 而无需实际启用
AE_MODE_ON
,那么我可以轻松计算出 EV。但是,到目前为止我还没有找到 API。我想没有路由设备是不可能的。 - 如果环境光传感器能够提供自动曝光(计算 EV)所需的所有信息,这也将非常容易。然而,根据我的理解,它只测量入射光而不测量反射光,所以测量没有考虑图片中的实际物体(它们的表面如何反射光)
- 如果我能从最后一次捕获的像素中获取信息,这也是可行的(如果计算时间适合两次捕获之间的时间)。然而,根据我的理解,像素 "bightness" 在很大程度上取决于捕获的对象,即如果捕获的对象的亮度发生变化(许多 "black horses" 或 "white bears" 在 road/way) 我会计算错误的 EV 值。
- 在实际拍摄之间拍摄自动曝光的图像,并根据实际拍摄的中间拍摄中使用的自动选择设置计算光照水平。根据我的理解,这将是一种相对 "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 所述,如果您的室外条件非常有限,您可以尝试为每个条件硬编码值。但是室外亮度的范围可能非常大,因此这需要进行一些适当的测试以确保它能够正常工作,并且每次都需要手动选择正确的值。