В настоящее время я работаю над функцией моего приложения, которая распознает лица в потоке камеры. Я читаю ориентиры, такие как рот и 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)
...
}