Как получить значение освещения от AVFoundation?

Я работаю со Swift 3 и использую камеру AVFoundation

Кто знает, есть ли способ узнать способность света?

Я знаю, что одним из подходов является использование датчика внешней освещенности, но это не поощряет, и в конечном итоге приложения не выпускаются на рынок.

Я нашел вопрос очень близко к тому, что мне нужно

обнаружение, если iPhone находится в темной комнате

И этот парень объясняет, что я могу использовать ImageIO framework, read the metadata that's coming in with each frame of the video feed

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
  CFDictionaryRef metadataDict = CMCopyDictionaryOfAttachments(NULL, sampleBuffer, kCMAttachmentMode_ShouldPropagate);
  NSDictionary *metadata = [[NSMutableDictionary alloc] initWithDictionary:(__bridge NSDictionary*)metadataDict];
  CFRelease(metadataDict);
  NSDictionary *exifMetadata = [[metadata objectForKey:(NSString *)kCGImagePropertyExifDictionary] mutableCopy];
  float brightnessValue = [[exifMetadata objectForKey:(NSString *)kCGImagePropertyExifBrightnessValue]  floatValue];
}

Но я новичок в iOS и не знаю, как конвертировать этот код в Swift

Заранее спасибо!

2 ответа

Следующая реализация кода в Swift 3.x

Можно получить приблизительное значение яркости (измеренное в единицах люкс), используя данные EXIF ​​камеры. Пожалуйста, обратитесь к следующей ссылке. Использование камеры в качестве люксметра

Здесь sampleBuffer ценность captureOutput Метод AVFoundation используется для извлечения данных EXIF ​​из кадров камеры.

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {

    //Retrieving EXIF data of camara frame buffer
    let rawMetadata = CMCopyDictionaryOfAttachments(nil, sampleBuffer, CMAttachmentMode(kCMAttachmentMode_ShouldPropagate))
    let metadata = CFDictionaryCreateMutableCopy(nil, 0, rawMetadata) as NSMutableDictionary
    let exifData = metadata.value(forKey: "{Exif}") as? NSMutableDictionary

    let FNumber : Double = exifData?["FNumber"] as! Double
    let ExposureTime : Double = exifData?["ExposureTime"] as! Double
    let ISOSpeedRatingsArray = exifData!["ISOSpeedRatings"] as? NSArray
    let ISOSpeedRatings : Double = ISOSpeedRatingsArray![0] as! Double
    let CalibrationConstant : Double = 50 

    //Calculating the luminosity
    let luminosity : Double = (CalibrationConstant * FNumber * FNumber ) / ( ExposureTime * ISOSpeedRatings )  

    print(luminosity)}

Обратите внимание, что значение CalibrationConstant может быть откалиброван в соответствии с приложением, как описано в ссылке.

Выполните следующие действия, чтобы получить данные EXIF ​​из захваченного изображения.

  • Получить данные изображения из буфера образцов.

let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation (sampleBuffer)

  • используйте вспомогательную функцию ниже, чтобы получить данные EXIF ​​вашей потребности
func getEXIFFromImage(image:NSData) -> NSDictionary {
    let imageSourceRef = CGImageSourceCreateWithData(image, nil);
    let currentProperties = CGImageSourceCopyPropertiesAtIndex(imageSourceRef!, 0, nil)
    let mutableDict = NSMutableDictionary(dictionary: currentProperties!)
    return mutableDict
}
  • Вы можете использовать словарные ключи EXIF, чтобы получить желаемое значение. Список ключей можно найти здесь. В вашем случае вам нужно kCGImagePropertyExifBrightnessValue
Другие вопросы по тегам