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

Kil*_*sh9 9 android android-camera android-5.0-lollipop camera2

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

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

13272 - 869661901
Run Code Online (Sandbox Code Playgroud)

它会在几秒钟内完成

0.000013272 - 0.869661901
Run Code Online (Sandbox Code Playgroud)

这显然不到一秒钟.

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

提前致谢!.

rcs*_*ner 20

你的问题的答案:

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

你想要的答案:

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

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

数据格式说明:

  • 正确的做到这一点的方法是使用的RAW_SENSOR,如果你能输出格式.这样,累积输出实际上与整个30s内入射到传感器的光成正比.

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

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

关于暴露等效的注意事项:

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

  1. 在这一段曝光时间的中间会有少量的光子信息丢失期.但是在你所谈论的时间尺度上(30s),在这里缺少几毫秒的光线,这是微不足道的.

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

  3. (额外奖励!)这种曝光在某种程度上实际上是优越的:在30秒曝光下可能已经饱和(纯白色)的区域仍将保留在这些更短的曝光中的清晰度,因此基本上保证不会失去你的高端细节.:-)