我正在尝试在我的应用程序中使用30秒的曝光时间获取图像(我知道这是可能的,因为原生相机允许这样做)。
但是SENSOR_INFO_EXPOSURE_TIME_RANGE(它应该是以纳秒为单位的)给出了这个范围:
13272 - 869661901
只需要几秒钟
0.000013272 - 0.869661901
显然这比一秒钟少。
我如何使用更长的曝光时间?
提前感谢!
我正在尝试在我的应用程序中使用30秒的曝光时间获取图像(我知道这是可能的,因为原生相机允许这样做)。
但是SENSOR_INFO_EXPOSURE_TIME_RANGE(它应该是以纳秒为单位的)给出了这个范围:
13272 - 869661901
只需要几秒钟
0.000013272 - 0.869661901
显然这比一秒钟少。
我如何使用更长的曝光时间?
提前感谢!
CaptureRequest
列表,并将其传递给CameraCaptureSession.captureBurst(...)
。这将尽可能少地拍摄快照。当每个图像数据帧可用时,将其传递到某个新的缓冲区中并累积信息(简单的逐点加法)。最好使用Allocation
作为输出Surface
以及一些RenderScript来完成此操作。
数据格式说明:
如果可能,正确的方法是使用RAW_SENSOR
输出格式。这样累积输出真正与整个30秒期间传感器上发生的光线直接成比例。
如果由于某种原因不能使用,我建议使用YUV_420_888
输出,并确保将色调映射曲线设置为线性(不幸的是,你必须手动创建具有两个点的曲线来完成此操作)。否则引入的非线性将破坏我们的方案。(尽管我不确定简单加法在线性YUV空间中是否完全正确,但至少是一种初步方法。)无论你使用这种方法还是RAW_SENSOR
,你可能会想要在累积之后应用自己的伽马曲线/色调映射以使其“看起来正确”。
亲爱的,请不要使用JPEG
输出,原因很多,其中之一是这样做很可能会在曝光之间增加很多插入时间,从而破坏我们对连续曝光的30秒的近似。
曝光等效性说明:
这将几乎完全产生您想要的曝光,但不完全相同。它有两个不同之处。
在这段曝光时间中间会有少量缺失的光子信息。但在您所谈论的时间尺度(30秒)内,偶尔会错过几毫秒的光线并不重要。
与单次30秒曝光拍摄相比,图像会略微嘈杂。这是因为每次从实际传感器读取像素值时,都会添加一些电子噪声到信息中。因此最终你会拥有35倍于单次曝光的这种添加噪声(针对你特定问题的35次拍摄),没有任何办法可以避免这种情况,但可能甚至不会引起注意-这通常与有意义的照片信号相比相对较小。这取决于相机传感器质量(以及ISO,但我想对于这个应用程序,您需要将其设置得很高)。
(额外奖励!)这种曝光实际上在某种程度上会更好:在30秒曝光中可能已经饱和(纯白色)的区域仍然会在这些远远较短的曝光中保留定义,因此您基本上不会失去高端细节。 :-)
截至2017年5月,您不能总是信任SENSOR_INFO_EXPOSURE_TIME_RANGE。尝试手动增加时间并观察结果。我知道我的Pixel实际上可以拍摄1.9秒的照片,但SENSOR_INFO_EXPOSURE_TIME_RANGE的值在亚秒范围内。