我正在开发适用于 IOS (13) 的相机应用程序。为此,我将 AVCaptureSession 与 AVCaptureVideoPreviewLayer 结合使用。到目前为止一切正常。
现在我想让用户从给定的典型快门速度值数组(以 1/3 曝光停止)中选择和设置自定义快门速度(曝光持续时间)作为 [Int32]:
let shutterSpeedValues: [Int32] = [1, 2, 3, 4, 5, 6, 8, 10, 13, 15, 20, 25, 30, 40, 50, 60, 80, 100, 125, 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 8000, 10000, 12800, 16000, 20000, 2400]
Run Code Online (Sandbox Code Playgroud)
我设置了所需的曝光 - 据我所知 - 唯一可能的方法是使用以下功能:
captureDevice?.setExposureModeCustom(duration: CMTimeMake(value: 1, timescale: shutterSpeedValues[index]), iso: AVCaptureDevice.currentISO, completionHandler: nil)
Run Code Online (Sandbox Code Playgroud)
检查 AVCaptureDevice 的 ExposureDuration 值表明,这为较慢的快门速度(高达 1/200 秒)提供了完全准确的结果。选择的曝光持续时间越快,差异越大。例如:
1/250th …Run Code Online (Sandbox Code Playgroud) 现在,在我的相机应用程序中,我可以让用户触摸任意位置来设置焦点和曝光,但是如何才能像苹果的相机应用程序那样获得两全其美的效果呢?
例如,用户可能希望触摸以聚焦在前景中的某物上,但是如果场景发生足够的变化,则应返回continuousAutoFocus。同样,如果用户将相机对准光源,则应更改曝光以使其正确显示,然后,当相机返回场景时,应再次固定曝光,使其不会太暗。但是,他们仍然可以选择使它更亮或更暗,具体取决于他们通过相机视图所触摸的物体。
现在,当视图出现时,我将默认设置设置为屏幕的中心:
func setDefaultFocusAndExposure() {
let focusPoint = CGPoint(x:0.5,y:0.5)
if let device = AVCaptureDevice.default(for:AVMediaType.video) {
do {
try device.lockForConfiguration()
if device.isFocusPointOfInterestSupported {
print(focusPoint)
device.focusPointOfInterest = focusPoint
device.focusMode = AVCaptureDevice.FocusMode.autoFocus
}
if device.isExposurePointOfInterestSupported {
device.exposurePointOfInterest = focusPoint
device.exposureMode = AVCaptureDevice.ExposureMode.autoExpose
}
device.unlockForConfiguration()
} catch {
// Handle errors here
print("There was an error focusing the device's camera")
}
}
}
Run Code Online (Sandbox Code Playgroud)
另外,我让用户根据他们触摸的位置设置焦点和曝光:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let bounds = UIScreen.main.bounds
let touchPoint = touches.first! as UITouch …Run Code Online (Sandbox Code Playgroud) 我们正在构建一个相机应用,我们想使用手动曝光。我们不希望曝光算法设置ISO和曝光时间;取而代之的是,我们希望它告诉我们我们设置的手动曝光与根据算法得出的正确曝光之间的区别。这样,我们可以在计算中考虑到这一点。
iOS具有这样的API ExposureTargetOffset。Android camera2是否有这样的API?
我尝试使用 YUV_420_888 图像格式(我的索尼 XA1 不支持原始数据)通过camera2 API 来近似原始传感器输出。我将所有内容都改为手动并停用了我能找到的所有纠正程序:
mBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_OFF);
mBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF);
mBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_OFF);
mBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_OFF);
mBuilder.set(CaptureRequest.TONEMAP_MODE, CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE);
mBuilder.set(CaptureRequest.TONEMAP_CURVE,
new TonemapCurve(
new float[]{0.0f,0.0f,1.0f,1.0f},
new float[]{0.0f,0.0f,1.0f,1.0f},
new float[]{0.0f,0.0f,1.0f,1.0f}
));
mBuilder.set(CaptureRequest.COLOR_CORRECTION_MODE, CameraMetadata.COLOR_CORRECTION_MODE_TRANSFORM_MATRIX);
mBuilder.set(CaptureRequest.COLOR_CORRECTION_TRANSFORM, new ColorSpaceTransform(new int[]{
1, 1, 0, 1, 0, 1,
0, 1, 1, 1, 0, 1,
0, 1, 0, 1, 1, 1
}));
mBuilder.set(CaptureRequest.COLOR_CORRECTION_GAINS, new RggbChannelVector(1.0f,1.0f,1.0f,1.0f));
mBuilder.set(CaptureRequest.SHADING_MODE, CameraMetadata.SHADING_MODE_OFF);
mBuilder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE, CameraMetadata.STATISTICS_LENS_SHADING_MAP_MODE_OFF);
mBuilder.set(CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE, CameraMetadata.COLOR_CORRECTION_ABERRATION_MODE_OFF);
mBuilder.set(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE, CameraMetadata.CONTROL_AE_ANTIBANDING_MODE_OFF);
mBuilder.set(CaptureRequest.CONTROL_EFFECT_MODE, CameraMetadata.CONTROL_EFFECT_MODE_OFF);
mBuilder.set(CaptureRequest.CONTROL_ENABLE_ZSL, false);
mBuilder.set(CaptureRequest.CONTROL_SCENE_MODE, CameraMetadata.CONTROL_SCENE_MODE_DISABLED);
mBuilder.set(CaptureRequest.EDGE_MODE, CameraMetadata.EDGE_MODE_OFF);
mBuilder.set(CaptureRequest.HOT_PIXEL_MODE, CameraMetadata.HOT_PIXEL_MODE_OFF);
mBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE, CameraMetadata.NOISE_REDUCTION_MODE_OFF);
Run Code Online (Sandbox Code Playgroud)
之后,我连拍了 10 张照片,曝光时间线性增加,ISO 为 40。我分析了 …