相机2 API - 如何设置长时间曝光时间

15

我正在尝试在我的应用程序中使用30秒的曝光时间获取图像(我知道这是可能的,因为原生相机允许这样做)。

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


13272 - 869661901

只需要几秒钟

0.000013272 - 0.869661901

显然这比一秒钟少。

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

提前感谢!

2个回答

30
你的问题的答案
你做得没错。你已经检查了正确的信息并且正确地解释了它。任何超过最大曝光时间的值都将被截断为该最大值。 你想要的答案
但是,你仍然可以通过伪造来实现你想要的效果。你需要连续30秒钟的光子在传感器上积累,这是不可能的。但你可以通过积累30秒钟的光子,并插入微小的缺失间隔来获得几乎相同的效果。
在高层次上,你需要创建一个CaptureRequest列表,并将其传递给CameraCaptureSession.captureBurst(...)。这将尽可能少地拍摄快照。当每个图像数据帧可用时,将其传递到某个新的缓冲区中并累积信息(简单的逐点加法)。最好使用Allocation作为输出Surface以及一些RenderScript来完成此操作。 数据格式说明
  • 如果可能,正确的方法是使用RAW_SENSOR输出格式。这样累积输出真正与整个30秒期间传感器上发生的光线直接成比例。

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

  • 亲爱的,请不要使用JPEG输出,原因很多,其中之一是这样做很可能会在曝光之间增加很多插入时间,从而破坏我们对连续曝光的30秒的近似。

  • 曝光等效性说明:

    这将几乎完全产生您想要的曝光,但不完全相同。它有两个不同之处。

    1. 在这段曝光时间中间会有少量缺失的光子信息。但在您所谈论的时间尺度(30秒)内,偶尔会错过几毫秒的光线并不重要。

    2. 与单次30秒曝光拍摄相比,图像会略微嘈杂。这是因为每次从实际传感器读取像素值时,都会添加一些电子噪声到信息中。因此最终你会拥有35倍于单次曝光的这种添加噪声(针对你特定问题的35次拍摄),没有任何办法可以避免这种情况,但可能甚至不会引起注意-这通常与有意义的照片信号相比相对较小。这取决于相机传感器质量(以及ISO,但我想对于这个应用程序,您需要将其设置得很高)。

    3. (额外奖励!)这种曝光实际上在某种程度上会更好:在30秒曝光中可能已经饱和(纯白色)的区域仍然会在这些远远较短的曝光中保留定义,因此您基本上不会失去高端细节。 :-)


    非常感谢!你的解释真的很清晰! - KillDash9
    非常好的答案!谢谢! - Jonas Jongejan
    @rcsumner,你能告诉我如何创建新的缓冲区并累积信息吗?我不知道这个操作可能最好使用分配作为输出表面和一些RenderScript来完成。 - helloyako
    @rcsumner,感谢您的出色回答,但我在实现YUV解决方案时遇到了困难。目前,我能够获取不同的字节缓冲区并将它们加在一起。但我不知道如何使其线性/如何实现线性色调映射。即使经过了相当多的研究,我仍然不明白色调映射真正的作用。如果您能更详细地解释一下,那就太好了。 - Felix Hegg
    @helloyako 可能最好的方法是使用混合内置函数: https://developer.android.com/reference/android/renderscript/ScriptIntrinsicBlend - undefined
    @FelixHegg 你好!我也在尝试使用"RenderScript Intrinsics Replacement Toolkit" (https://github.com/android/renderscript-intrinsics-replacement-toolkit) 中的YUV解决方案。首先我将YUV转换为位图(Toolkit.yuvToRgbBitmap),然后使用加法或乘法混合模式(Toolkit.blend)混合位图图像。问题是当我尝试拍摄夜空照片并将它们混合在一起时,结果是一个暗色/黑色的位图.... 有什么想法吗? - undefined

    4

    截至2017年5月,您不能总是信任SENSOR_INFO_EXPOSURE_TIME_RANGE。尝试手动增加时间并观察结果。我知道我的Pixel实际上可以拍摄1.9秒的照片,但SENSOR_INFO_EXPOSURE_TIME_RANGE的值在亚秒范围内。


    3
    您的Pixel仅在某些输出配置中才能拍摄1.9秒照片。并非所有情况都是如此,这就是为什么最大值较低(必须适用于所有情况)的原因。目前,API不允许向用户报告会话特定限制的方法,因此必须提供最坏情况。 - Eddy Talvala

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接