Задняя камера iPhone не может правильно сфокусироваться

Я делаю приложение для камеры 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()
    }

Я вызвал функцию setFocus в функции touchesBegan, и комментарии focusPoint и devicePoint показывают одну и ту же координату, например (297,5, 88,0).

Когда я коснулся черной чашки на картинке, я увидел, что камера iPhone немного приближается и отдаляется, как когда я использую стандартное приложение камеры iPhone и пытаюсь сфокусироваться на объекте. Итак, я предполагаю, что мое приложение камеры пытается сфокусироваться на черной чашке, но это не удается.

Поскольку это не ошибка, я не уверен, какой код изменить. Есть ли какая-нибудь подсказка, что здесь происходит и что вызывает эту проблему?

ДОБАВИТЬ ЭТУ ЧАСТЬ ПОЗЖЕ

Я также прочитал этот документ, и в нем говорится

Значение CGPoint этого свойства использует систему координат, где {0,0} – это левый верхний угол области изображения, а {1,1} – правый нижний.

Как я уже писал ранее, значение devicePoint дает мне больше 1, например 297,5, 88,0. Это вызывает проблему?


person zzzzou    schedule 09.04.2021    source источник
comment
Последняя часть буквально является ответом на ваш вопрос — все, что вам нужно сделать, это преобразовать вашу абсолютную координату в ту, которую ожидает AVCaptureDevice. Имейте в виду, что вы также должны учитывать физическую ориентацию устройства, на странице по ссылке в более поздней части это упоминается в мельчайших подробностях.   -  person Artem Garmash    schedule 09.04.2021
comment
Спасибо большое, Артем!   -  person zzzzou    schedule 09.04.2021


Ответы (1)


Благодаря @Artem я смог решить проблему. Все, что мне нужно было сделать, это преобразовать абсолютную координату в значение, используемое в focusPointOfInterest (от мин (0,0) до макс (1,1)).

Спасибо, Артем!!

person zzzzou    schedule 09.04.2021