Датчик света для чтения iOS с ARKit
Есть ли способ получить доступ к датчику внешней освещенности устройства iOS, используя ARKit, вообще не используя AR?
https://developer.apple.com/documentation/arkit/arlightestimate/2878308-ambientintensity
Другими словами, могу ли я получить доступ к значению "ambientIntensity" без создания сцены AR.
2 ответа
Смотрите документы для ARLightEstimate.ambientIntensity
:
Это значение основано на внутренней компенсации экспозиции устройства камеры
Другими словами, если вы хотите использовать камеру устройства для оценки локальных условий освещения и не используете ARKit, вам лучше использовать API-интерфейсы камеры. (Во-первых, эти API-интерфейсы доступны на всех устройствах iOS 11 и нескольких более ранних версиях iOS, не требуя высоких требований ARKit к ОС / оборудованию.)
Краткий обзор того, что вам нужно сделать там:
- Настроить
AVCaptureSession
и выберите камеруAVCaptureDevice
что ты хочешь. Вам может понадобиться или не подключить выход для захвата видео / фото (который в вашем случае в основном не используется). - Начните сеанс захвата.
- Используйте KVO для контроля воздействия, температуры и / или свойств баланса белого на
AVCaptureDevice
,
Вы можете найти (более старый, ObjC) код, охватывающий все это (и многое другое, поэтому вам нужно будет извлечь части, которые имеют отношение к вам) в образце кода Apple AVCamManual.
Вам не нужно ARSCNView
но вам нужно иметь бег ARSession
https://developer.apple.com/documentation/arkit/arsession
Как только вы это настроите, вы можете позвонить currentFrame
который даст вам ARFrame
который имеет lightEstimate
свойство, которое содержит ambientIntensity
оценить.
Да, в функции captureOutput для переопределения при адаптации протокола AVCaptureVideoDataOutputSampleBufferDelegate
override func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
//Retrieving EXIF data of camara frame buffer
let rawMetadata = CMCopyDictionaryOfAttachments(allocator: nil, target: sampleBuffer, attachmentMode: kCMAttachmentMode_ShouldPropagate)
let metadata = CFDictionaryCreateMutableCopy(nil, 0, rawMetadata) as NSMutableDictionary
let exifData = metadata.value(forKey: "{Exif}") as? NSMutableDictionary
if let light = exifData?[kCGImagePropertyExifBrightnessValue] as? NSNumber {
print("Light \(light.floatValue)")
} else {
print("problem with light")
}
}