Датчик света для чтения 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 к ОС / оборудованию.)

Краткий обзор того, что вам нужно сделать там:

  1. Настроить AVCaptureSession и выберите камеру AVCaptureDevice что ты хочешь. Вам может понадобиться или не подключить выход для захвата видео / фото (который в вашем случае в основном не используется).
  2. Начните сеанс захвата.
  3. Используйте 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")
        }
}
Другие вопросы по тегам