Чтение датчика освещенности iOS с помощью ARKit

Есть ли способ получить доступ к датчику внешней освещенности устройства iOS с помощью ARKit, вообще не используя AR?

https://developer.apple.com/documentation/arkit/arlightestimate/2878308-ambientintensity

Другими словами, могу ли я получить доступ к значению «ambientIntensity» без создания сцены дополненной реальности.


person Denis T    schedule 01.08.2017    source источник


Ответы (3)


См. документацию для ARLightEstimate.ambientIntensity:

Это значение основано на внутренней компенсации экспозиции камеры.

Другими словами, если вы хотите использовать камеру устройства для оценки местных условий освещения и не используете ARKit иным образом, вам может быть лучше использовать API камеры. (Во-первых, эти API-интерфейсы доступны на всех устройствах iOS 11 и нескольких более ранних версиях iOS, а не требуют высоких требований к ОС/оборудованию ARKit.)

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

  1. Настройте AVCaptureSession и выберите нужную камеру AVCaptureDevice. Вам может понадобиться или не понадобиться подключать выход для захвата видео/фото (который в вашем случае в основном не будет использоваться).
  2. Запустите сеанс захвата.
  3. Используйте KVO для контроля параметров экспозиции, температуры и/или баланса белого на AVCaptureDevice.

Вы можете найти (более старый, ObjC) код, охватывающий все это (и многое другое, поэтому вам нужно будет извлечь те части, которые имеют отношение к вам) в Apple пример кода AVCamManual.

person rickster    schedule 01.08.2017

Вам не нужен ARSCNView, но вам нужен работающий ARSession https://developer.apple.com/documentation/arkit/arsession

Как только вы настроите эту настройку, вы можете вызвать currentFrame, который даст вам ARFrame, у которого есть свойство lightEstimate, содержащее оценку ambientIntensity.

person Tristan Burnside    schedule 01.08.2017
comment
Спасибо, мне удалось заставить его работать (даже если значение немного странное). Я использовал self.arConfig = [ARWorldTrackingSessionConfiguration new]; self.arConfig.lightEstimationEnabled = YES; И выставил разрешение на использование камеры. - person Denis T; 01.08.2017
comment
К сожалению, кажется, что невозможно использовать его с фронтальной камерой, которая мне нужна. - person Denis T; 02.08.2017

Да, в функции 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")
        }
}
person Omar El Malak    schedule 15.10.2020