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

时间:2015-09-30 00:34:44

标签: android android-camera android-5.0-lollipop camera2

我正试图在我的应用程序中以30秒的曝光时间捕获图像(我知道这可能是因为相机可以使用它)。

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

13272 - 869661901

只需几秒钟即可

0.000013272 - 0.869661901

这显然不到一秒钟。

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

提前致谢!

2 个答案:

答案 0 :(得分:18)

您的问题的答案

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

您想要的答案

但是,你可以通过假装来获得你想要的东西。你想要连续30秒'光子落在传感器上的价值,你无法得到。但是你可以通过累积30秒来获得(几乎)无法区分的东西。散布着微小缺失间隔的光子价值。

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

有关数据格式的说明

  • 执行此操作的正确方法是使用RAW_SENSOR输出格式(如果可以)。这样,累积输出实际上与整个30s内入射到传感器的光成正比。

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

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

有关暴露等效的说明

这几乎可以产生你想要的曝光,但并不完全。它有两种不同之处。

  1. 在这段曝光时间的中间会有少量的光子信息丢失期。但是在你谈论的时间尺度上(30s),在这里缺少几毫秒的亮光,而且很简单。

  2. 如果您拍摄的是30秒的真实单次曝光,图像会略微黯然失色。这是因为每次从实际传感器读出像素值时,都会在信息中添加一点电子噪声。因此,最终您将获得35倍于此加性噪声(从针对您的特定问题的35次曝光),就像单次曝光一样。对此没有办法,对不起,但它甚至可能都不会引人注意 - 相对于有意义的摄影信号,这通常相当小。这取决于相机传感器的质量(和ISO,但我想这个应用程序你需要高。)

  3. (Bonus!)这种曝光实际上只有一种方式优越:在30s曝光下可能已经饱和(纯白)的区域仍将保留在这些更短的曝光中的定义,所以你基本上保证不会失去你的高端细节。 :-)

答案 1 :(得分:3)

截至2017年5月,您无法始终信任SENSOR_INFO_EXPOSURE_TIME_RANGE。请尝试手动增加时间,看看会发生什么。我知道我的Pixel实际拍摄时间为1.9秒,但SENSOR_INFO_EXPOSURE_TIME_RANGE的值在次秒范围内。