如何从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数据获得近似的光度值(以单位勒克斯测量)。 请参阅以下链接。 使用照相机作为勒克斯米
这里sampleBuffer
中captureOutput
方法的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