2012-12-04 10 views
6

Używam kamery iPhone/iPad, aby uzyskać strumień wideo i rozpoznawanie w strumieniu, ale ze zmianami oświetlenia ma to negatywny wpływ na niezawodność. Przetestowałem różne ustawienia w różnych warunkach oświetleniowych i mogę je uruchomić, ale próbuję uzyskać ustawienia, które trzeba dostosować w czasie wykonywania, to jest to, czego potrzebuję.Czy istnieje sposób na uzyskanie poziomu jasności na iOS strumienia kamery?

Potrafię obliczyć proste sprawdzenie jasności na każdej klatce, ale kamera dostosowuje i wyrzuca moje wyniki. Mogę wtedy obserwować ostre zmiany i przeprowadzać kontrole, ale stopniowe zmiany również wyrzucą moje wyniki.

Idealnie chciałbym uzyskać dostęp do danych kamery/EXIF ​​dla strumienia i zobaczyć, co rejestruje niefiltrowaną jasność, czy jest na to sposób?

(pracuję dla urządzeń z systemem iOS 5 i powyżej)

Dziękuję

+0

Użyj [czujnika światła] (http://stackoverflow.com/questions/6408840/about-ambient-light-sensor-in-iphone), jeśli taki posiadasz. –

Odpowiedz

8

Dostępne w iOS 4.0 i wyżej. Możliwe jest uzyskanie informacji EXIF ​​z CMSampleBufferRef.

//Import ImageIO & include framework in your project. 
#import <ImageIO/CGImageProperties.h> 

W swojej próbki delegata bufor bezpłatnego mostków dostanie NSDictionary z wynikami CoreMedia za CMGetAttachment.

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { 
    NSDictionary* dict = (NSDictionary*)CMGetAttachment(sampleBuffer, kCGImagePropertyExifDictionary, NULL); 
1

Kompletny kod, stosowany we własnej aplikacji:

- (void)setupAVCapture { 

//-- Setup Capture Session. 
_session = [[AVCaptureSession alloc] init]; 
[_session beginConfiguration]; 

//-- Set preset session size. 
[_session setSessionPreset:AVCaptureSessionPreset1920x1080]; 

//-- Creata a video device and input from that Device. Add the input to the capture session. 
AVCaptureDevice * videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
if(videoDevice == nil) 
    assert(0); 

//-- Add the device to the session. 
NSError *error; 
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error]; 
if(error) 
    assert(0); 

[_session addInput:input]; 

//-- Create the output for the capture session. 
AVCaptureVideoDataOutput * dataOutput = [[AVCaptureVideoDataOutput alloc] init]; 
[dataOutput setAlwaysDiscardsLateVideoFrames:YES]; // Probably want to set this to NO when recording 

//-- Set to YUV420. 
[dataOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange] 
                 forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; // Necessary for manual preview 

// Set dispatch to be on the main thread so OpenGL can do things with the data 
[dataOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; 

[_session addOutput:dataOutput]; 
[_session commitConfiguration]; 

[_session startRunning]; 
} 

- (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]; 
    self.autoBrightness = [[exifMetadata 
         objectForKey:(NSString *)kCGImagePropertyExifBrightnessValue] floatValue]; 

    float oldMin = -4.639957; // dark 
    float oldMax = 4.639957; // light 
    if (self.autoBrightness > oldMax) oldMax = self.autoBrightness; // adjust oldMax if brighter than expected oldMax 

    self.lumaThreshold = ((self.autoBrightness - oldMin) * ((3.0 - 1.0)/(oldMax - oldMin))) + 1.0; 

    NSLog(@"brightnessValue %f", self.autoBrightness); 
    NSLog(@"lumaThreshold %f", self.lumaThreshold); 
} 

Zmienna lumaThreshold wysyłany jest jako zmienna jednolitego mojego fragment shader, który mnoży Y samplera tekstury do znalezienia idealnego jasność w oparciu na jasność otoczenia. W tej chwili używa tylnej kamery; Najprawdopodobniej przełączyłem się na przedni aparat, ponieważ zmieniam tylko "jasność" ekranu, aby dostosować do oglądania w pomieszczeniach/na zewnątrz, a oczy użytkownika znajdują się z przodu aparatu (a nie z tyłu).

Powiązane problemy