我正试图在我的应用程序中以30秒的曝光时间捕获图像(我知道这可能是因为相机可以使用它)。
但是SENSOR_INFO_EXPOSURE_TIME_RANGE(它应该是以纳秒为单位)给出了我的范围:
13272 - 869661901
只需几秒钟即可
0.000013272 - 0.869661901
这显然不到一秒钟。
如何使用更长的曝光时间?
提前致谢!
答案 0 :(得分:18)
您的问题的答案:
你不能。您检查了正确的信息并正确解释了它。您为曝光时间设置的任何值都将被剪切为最大值。
您想要的答案:
但是,你可以通过假装来获得你想要的东西。你想要连续30秒'光子落在传感器上的价值,你无法得到。但是你可以通过累积30秒来获得(几乎)无法区分的东西。散布着微小缺失间隔的光子价值。
在较高级别,您需要做的是创建List
CaptureRequest
并将其传递给CameraCaptureSession.captureBurst(...)
。这将以尽可能短的间隙时间拍摄。当每帧图像数据可用时,将其传递到某处的某个新缓冲区并累积信息(简单的逐点加法)。使用Allocation
作为输出Surface
和一些RenderScript可能最合适。
有关数据格式的说明:
执行此操作的正确方法是使用RAW_SENSOR
输出格式(如果可以)。这样,累积输出实际上与整个30s内入射到传感器的光成正比。
如果你不能使用它,出于某种原因,我建议使用YUV_420_888
输出,并确保将色调映射曲线设置为线性(不幸的是你必须这样做通过创建具有两个点的曲线手动)。否则引入的非线性将破坏我们的方案。 (虽然我不确定简单的加法在线性YUV空间中是否完全正确,但它至少是第一种方法。)无论你使用这种方法还是RAW_SENSOR
,你都可能想要在积累后应用你自己的伽玛曲线/色调图,使它看起来正确。"
对于Pete的爱,不要使用JPEG
输出,原因很多,其中最重要的是,这很可能会在曝光之间增加很多间隙时间,从而毁掉我们在连续曝光时近似为30秒。
有关暴露等效的说明:
这几乎可以产生你想要的曝光,但并不完全。它有两种不同之处。
在这段曝光时间的中间会有少量的光子信息丢失期。但是在你谈论的时间尺度上(30s),在这里缺少几毫秒的亮光,而且很简单。
如果您拍摄的是30秒的真实单次曝光,图像会略微黯然失色。这是因为每次从实际传感器读出像素值时,都会在信息中添加一点电子噪声。因此,最终您将获得35倍于此加性噪声(从针对您的特定问题的35次曝光),就像单次曝光一样。对此没有办法,对不起,但它甚至可能都不会引人注意 - 相对于有意义的摄影信号,这通常相当小。这取决于相机传感器的质量(和ISO,但我想这个应用程序你需要高。)
(Bonus!)这种曝光实际上只有一种方式优越:在30s曝光下可能已经饱和(纯白)的区域仍将保留在这些更短的曝光中的定义,所以你基本上保证不会失去你的高端细节。 :-)
答案 1 :(得分:3)
截至2017年5月,您无法始终信任SENSOR_INFO_EXPOSURE_TIME_RANGE。请尝试手动增加时间,看看会发生什么。我知道我的Pixel实际拍摄时间为1.9秒,但SENSOR_INFO_EXPOSURE_TIME_RANGE的值在次秒范围内。