Camera2 API - 如何设置长曝光时间

Posted

技术标签:

【中文标题】Camera2 API - 如何设置长曝光时间【英文标题】:Camera2 API - How to set long exposure times 【发布时间】:2015-12-27 15:20:25 【问题描述】:

我正在尝试在我的应用中以 30 秒的曝光时间拍摄图像(我知道这是可能的,因为库存相机允许这样做)。

但是 SENSOR_INFO_EXPOSURE_TIME_RANGE(它应该以纳秒为单位)给了我范围:

13272 - 869661901

几秒钟后就可以了

0.000013272 - 0.869661901

显然不到一秒。

如何使用更长的曝光时间?

提前致谢!

【问题讨论】:

【参考方案1】:

您的问题的答案

你不能。您检查了正确的信息并正确解释了它。您为曝光时间设置的任何值都将被剪裁到该最大值。

你想要的答案

你仍然可以通过伪装得到你想要的东西。您想要 30 秒的连续光子落在传感器上,这是您无法获得的。但是你可以通过累积 30 秒的光子和散布的微小缺失间隔来获得(实际上)无法区分的东西。

在高层次上,您需要做的是创建CaptureRequests 的List 并将其传递给CameraCaptureSession.captureBurst(...)。这将以尽可能少的间隙时间进行拍摄。当每一帧图像数据可用时,将其传递到某个新缓冲区并累积信息(简单的逐点加法)。这可能最适合使用 Allocation 作为输出 Surface 和一些 RenderScript 来完成。

数据格式说明

正确的方法是尽可能使用RAW_SENSOR 输出格式。这样,累积输出实际上与整个 30 秒内入射到传感器的光成正比。

如果由于某种原因你不能使用它,我建议使用YUV_420_888 输出,并确保将色调映射曲线设置为线性(不幸的是,你必须手动创建两点曲线)。否则引入的非线性会破坏我们的方案。 (虽然我不确定简单的加法在线性 YUV 空间中是否完全正确,但它至少是第一种方法。)无论您使用这种方法还是 RAW_SENSOR,您都可能想要应用自己的伽马曲线/色调积累后的地图,使其“看起来正确”。

出于对 Pete 的喜爱,不要使用 JPEG 输出,原因有很多,其中最重要的是这很可能会在曝光之间增加很多间隙时间,从而破坏我们对 30 秒的近似连续曝光。

关于曝光等效性的说明

这将产生几乎完全是您想要的曝光,但并不完全。它在两个方面有所不同。

    在这段曝光时间的中间会有少量的光子信息丢失。但在你所说的时间尺度上(30 秒),这里少了几毫秒的光,那是微不足道的。

    与真正单次曝光 30 秒相比,图像会稍微嘈杂一些。这是因为每次您从实际传感器读取像素值时,都会在信息中添加一点电子噪声。因此,最终您将获得 35 倍于单次曝光的附加噪声(来自针对您的特定问题的 35 次曝光)。抱歉,没有办法解决这个问题,但它甚至可能不明显——相对于有意义的摄影信号,这通常是相当小的。这取决于相机传感器的质量(和 ISO,但我想对于这个应用程序,你需要它很高。)

    (奖励!)这种曝光实际上在某一方面优越:在 30 秒曝光中可能已经饱和(纯白色)的区域在这些更短的曝光中仍将保留清晰度,所以你基本上可以保证不会丢失你的高端细节。 :-)

【讨论】:

非常感谢!你的解释真的很清楚! 很好的答案!谢谢! @rcsumner 你能告诉我如何制作新的缓冲区并积累信息吗?我不知道This is probably most properly done with an Allocation as the output Surface and some RenderScript @rcsumner 感谢您的出色回答,但我正在努力实施 YUV 解决方案。目前我能够获得不同的字节缓冲区并将它们添加在一起。但我不知道如何使其成为线性/如何实现线性色调映射。即使经过相当多的研究,我仍然不明白色调映射的真正作用。如果您能更详细地解释一下,那就太好了。【参考方案2】:

自 2017 年 5 月起,您不能总是信任 SENSOR_INFO_EXPOSURE_TIME_RANGE。尝试手动增加时间,看看会发生什么。我知道我的 Pixel 实际上会拍摄 1.9 秒,但 SENSOR_INFO_EXPOSURE_TIME_RANGE 的值在亚秒范围内。

【讨论】:

您的 Pixel 仅在某些输出配置下拍摄 1.9 秒。不是全部,这就是最大值较低的原因(它必须在所有情况下都有效)。目前,API 不允许向用户报告特定于会话的限制,因此必须提供最坏的情况。

以上是关于Camera2 API - 如何设置长曝光时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在camerax中锁定曝光?

Android Camera2 开启自动曝光

Android camera2 曝光问题。在使用 YUV ImageReader 的情况下预览过度曝光

Camera2 API 设置自定义白平衡和温度颜色

如何使用Android中的Camera2 API在不预览的情况下拍摄多张照片?

Android Camera2 API 设置自定义亮度、对比度、伽玛