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 秒的光子和散布的微小缺失间隔来获得(实际上)无法区分的东西。
在高层次上,您需要做的是创建CaptureRequest
s 的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 - 如何设置长曝光时间的主要内容,如果未能解决你的问题,请参考以下文章
Android camera2 曝光问题。在使用 YUV ImageReader 的情况下预览过度曝光