【问题标题】:AVCaptureDevice's exposurePointOfInterest does not workAVCaptureDevice 的 exposurePointOfInterest 不起作用
【发布时间】:2021-08-03 20:25:31
【问题描述】:

我正在尝试根据图像的某个点更改我的相机应用中的曝光。

我正在使用用户点击屏幕时触发的以下代码。现在我只是尝试暴露在中心。

@IBAction func didTap()
{
    if captureDevice.isExposurePointOfInterestSupported
    {
        try! captureDevice.lockForConfiguration()

        captureDevice.exposurePointOfInterest = CGPoint(x: 0.5, y: 0.5)
        captureDevice.exposureMode = .continuousAutoExposure

        captureDevice.unlockForConfiguration()
    }
}

但是什么也没发生。

captureDevice.isExposurePointOfInterestSupported 是真的。 captureDevice 目前是.builtInDualCamera

此代码位于基于示例代码的简单相机测试应用程序中。它在屏幕上显示实时摄像头图像。

有没有人得到exposurePointOfInterest 在 iOS 14.4 上工作? 我可能会错过什么?

【问题讨论】:

    标签: ios swift avcapturedevice


    【解决方案1】:

    我昨天确实遇到了这个问题。事实证明,完全使用(0.5, 0.5) 存在问题。当我使用(0.51, 0.51) 时,它每次都有效?

    extension AVCaptureDevice {
        func change(_ block: (AVCaptureDevice) -> ()) {
            try! self.lockForConfiguration()
            block(self)
            self.unlockForConfiguration()
        }
    }
    
    @objc func handleTap() {
        device.change {
            $0.exposurePointOfInterest = CGPoint(x: 0.51, y: 0.51)
            $0.exposureMode = .autoExpose
        }
    }
    

    更新

    还可能值得注意的是,虽然它是指定曝光的点,但该点周围的区域仍然必须足够大才能触发曝光调整。我们称之为触发区域。

    从我的测试中了解到,(0.5, 0.5) 点对触发区域的大小有特殊影响。每当将此点作为exposurePointOfInterest时,无论exposureMode.continuousAutoExpose还是.autoExpose,触发区域都比较大。

    您可以使用以下代码了解该区域的大小,将手机指向明亮的区域(如灯),然后查看在轻按调整曝光之前您必须靠近多远。您会发现曝光确实会调整,但您必须非常接近。

    @objc func handleTap() {
        device.change {
            $0.exposurePointOfInterest = CGPoint(x: 0.5, y: 0.5)
            $0.exposureMode = .autoExpose
        }
    }
    

    或者,您不能使用水龙头,而只需将属性exposureModeexposurePointOfInterest 保留为默认值.continuousAutoExpose(0.5, 0.5)。或者您可以使用本机相机应用程序并查看它何时自动调整曝光。结果是一样的。

    现在,如果您将exposurePointOfInterest 设置为接近但不等于中点的值,例如(0.51, 0.51),您会发现触发区域变得非常非常小。

    您也可以使用.continuousAutoExpose 并只调用一次,您会发现自动曝光调整要灵敏得多,因为触发区域要小得多:

    func viewDidLoad() {
        super.viewDidLoad()
        device.change {
            $0.exposurePointOfInterest = CGPoint(x: 0.51, y: 0.51)
            $0.exposureMode = .continuousAutoExpose
        }
    }
    

    要了解这个较小区域的大小,请打开本机相机应用并点按某处以在该点对焦/曝光。你会看到一个小的边界框。这差不多就是触发区域的大小。

    假设你有这样的水龙头:

    @objc func handleTap() {
        device.change {
            $0.exposurePointOfInterest = CGPoint(x: 0.51, y: 0.51)
            $0.exposureMode = .autoExpose
        }
    }
    

    如果没有任何反应,则该区域不够大,当您尝试在该点点按曝光时,您应该能够在原生相机应用中重现相同的无效果。

    旁注

    你的 didTap() 方法是设置默认值,所以它基本上没用。

    如果您想通过点击调整曝光,如果点始终相同,请使用.autoExpose。不要使用.continuousAutoExpose,因为它会一直调整曝光,而不仅仅是点击。只有当点击会改变点时,这样做才有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多