IOS: увеличьте поток для ARKit и Vision - PullRequest
3 голосов
/ 06 марта 2020

В настоящее время я работаю над функцией моего приложения, которая распознает лица в потоке камеры. Я читаю ориентиры, такие как рот и c. Все работает нормально, когда освещения достаточно. Но в темноте у ARKit и Vision возникают проблемы. Есть ли способ автоматически адаптировать поток brightnen к освещению фона, чтобы сохранить функциональность?

Исследования показывают, что время экспозиции занимает центральное место в яркости изображения. Таким образом, я попробовал функцию, которая адаптирует время экспозиции. Если лицо не распознано и изображение слишком темное, время экспозиции увеличится на 0,01. Что-то вроде функций из этой статьи . Но либо это не сработало, либо это было слишком ярко, поэтому нельзя было распознать лицо. Из-за этого я попробовал автоматическую версию captureDevice.focusMode = .continuousAutoFocus, но я не заметил значительного улучшения.

Вот мой код:

Vision API

        let devices = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaType.video, position: .front).devices

        //2:  Select a capture device
        do {
            if let captureDevice = devices.first {
                let captureDeviceInput = try AVCaptureDeviceInput(device: captureDevice)



                if(captureDevice.isLowLightBoostSupported){
                try captureDevice.lockForConfiguration()
                captureDevice.automaticallyEnablesLowLightBoostWhenAvailable = true
                captureDevice.unlockForConfiguration()
                }

                if(captureDevice.isExposureModeSupported(.continuousAutoExposure)){
                try captureDevice.lockForConfiguration()
                captureDevice.exposureMode = .continuousAutoExposure
                captureDevice.unlockForConfiguration()
                }


                if(captureDevice.isFocusModeSupported(.continuousAutoFocus)) {
                    try! captureDevice.lockForConfiguration()
                    captureDevice.focusMode = .continuousAutoFocus
                }

                try! captureDevice.lockForConfiguration()
                captureDevice.automaticallyAdjustsVideoHDREnabled = true
                captureDevice.unlockForConfiguration()


                avSession.addInput(captureDeviceInput)
            }

        } catch {
            print(error.localizedDescription)
        }

        let captureOutput = AVCaptureVideoDataOutput()
        captureOutput.setSampleBufferDelegate(self as AVCaptureVideoDataOutputSampleBufferDelegate, queue: DispatchQueue(label: "videoQueue"))
        avSession.addOutput(captureOutput)

ARKit

func renderer(
        _ renderer: SCNSceneRenderer,
        didUpdate node: SCNNode,
        for anchor: ARAnchor) {
        guard let faceAnchor = anchor as? ARFaceAnchor,
            let faceGeometry = node.geometry as? ARSCNFaceGeometry else {
                return
        }



        node.camera?.bloomThreshold = 1


        node.camera?.wantsHDR = true
        node.camera?.wantsExposureAdaptation = true
        node.camera?.exposureAdaptationBrighteningSpeedFactor = 0.2

        node.focusBehavior = .focusable
        faceGeometry.update(from: faceAnchor.geometry)
        expression(anchor: faceAnchor)

...
}
...