iPhone后置摄像头无法正确对焦

iPhone back camera cannot focus correctly

我一直在制作一个 iOS 相机应用程序并试图解决这个问题两天(但无法解决)。

我现在正在做的是根据用户点击的位置自动更改焦点和曝光。有时它工作正常(总共可能大约 20%),但大多数情况下它会失败。尤其是当我尝试聚焦在远处的物体(如 5 米以上)或有两个物体并尝试将一个物体的焦点切换到另一个物体时。下图就是一个例子。

黄色方块位于用户点击的位置,即使我在第一张图片中点击了黑色杯子,相机仍然聚焦在红色杯子上。

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touchPoint = touches.first! as UITouch
        let focusPoint = touchPoint.location(in: lfView)
        print("focusPoint \(focusPoint)")
    
        showPointOfInterestViewAtPoint(point: focusPoint)
        setFocus(focusMode: .autoFocus, exposureMode: .autoExpose, atPoint: focusPoint, shouldMonitorSujectAreaChange: true)
    }

    func setFocus(focusMode: AVCaptureDevice.FocusMode, exposureMode: AVCaptureDevice.ExposureMode, atPoint devicePoint: CGPoint, shouldMonitorSujectAreaChange: Bool) {
    
        guard let captureDevice = captureDevice else { return }
    
        do {
            try captureDevice.lockForConfiguration()
        } catch let error as NSError { return }
    
        if captureDevice.isFocusPointOfInterestSupported, captureDevice.isFocusModeSupported(focusMode) {
            captureDevice.focusPointOfInterest = devicePoint
            captureDevice.focusMode = focusMode
            print("devicePoint: \(devicePoint)")
        
        }
    
        // other codes in here...
    
        captureDevice.isSubjectAreaChangeMonitoringEnabled = shouldMonitorSujectAreaChange
        captureDevice.unlockForConfiguration()
    }

我在 touchesBegan 函数中调用了 setFocus 函数,focusPoint 和 devicePoint 注释显示相同的坐标,例如 (297.5, 88.0)。

当我点击图片中的黑色杯子时,我可以看到 iPhone 相机正在一点点放大和缩小,就像我使用默认的 iPhone 相机应用程序和尝试专注于一个对象。所以我想我的相机应用程序正试图聚焦在黑色杯子上,但它失败了。

由于这不是错误,我不确定要更改哪个代码。是否知道这里发生了什么以及导致此问题的原因?

稍后添加此部分

我也看了this document,它说

This property’s CGPoint value uses a coordinate system where {0,0} is the top-left of the picture area and {1,1} is the bottom-right.

我之前写过,devicePoint的值给了我不止1,比如297.5,88.0。这会导致问题吗?

感谢@Artem,我得以解决问题。我需要做的就是将绝对坐标转换为 focusPointOfInterest 中使用的值(最小(0,0)到最大(1,1))。

谢谢你,阿尔乔姆!!