如何从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中转换这段代码

提前致谢!

下面的代码实现在Swift 3.x中

可以使用相机的EXIF数据获得近似的光度值(以单位勒克斯测量)。 请参阅以下链接。 使用照相机作为勒克斯米

这里sampleBuffercaptureOutput方法的sampleBuffer值用于从相机帧中提取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数据。

  • 从样本缓冲区获取图像数据。

让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字典键来获取所需的值。 钥匙列表可以在这里find。 在你的情况下,你需要kCGImagePropertyExifBrightnessValue