Как получить значение освещения от 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