2015-04-23 26 views
5

Sto utilizzando il feed video della videocamera per l'elaborazione di alcune immagini e vorrei ottimizzare per la massima velocità dell'otturatore. So che è possibile impostare manualmente la durata dell'esposizione e ISO utilizzandoFotocamera iOS: durata esposizione manuale ma ISO auto?

setExposureModeCustomWithDuration:ISO:completionHandler: 

ma questo richiede uno per impostare entrambi i valori a mano. C'è un metodo o un trucco intelligente per permetterti di impostare manualmente la durata dell'esposizione, ma hai la stessa maniglia ISO per provare a esporre correttamente l'immagine?

risposta

5

Non sono sicuro che questa soluzione sia la migliore, visto che stavo lottando con questo come eri. Quello che ho fatto è ascoltare i cambiamenti nell'offset dell'esposizione e, da loro, regolare l'ISO fino a raggiungere un livello di esposizione accettabile. La maggior parte di questo codice è stata presa dal codice di esempio Apple

Quindi, prima di tutto, si ascoltano le modifiche su ExposureTargetOffset. Aggiungi nella tua dichiarazione di classe:

static void *ExposureTargetOffsetContext = &ExposureTargetOffsetContext;

Poi, una volta che avete fatto la configurazione del dispositivo correttamente:

[self addObserver:self forKeyPath:@"captureDevice.exposureTargetOffset" options:NSKeyValueObservingOptionNew context:ExposureTargetOffsetContext];

(Invece di captureDevice, utilizzare la vostra proprietà per il dispositivo) quindi implementare nella tua classe il callback per KVO:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 

if (context == ExposureTargetOffsetContext){ 
     float newExposureTargetOffset = [change[NSKeyValueChangeNewKey] floatValue]; 
     NSLog(@"Offset is : %f",newExposureTargetOffset); 

     if(!self.device) return; 

     CGFloat currentISO = self.device.ISO; 
     CGFloat biasISO = 0; 

     //Assume 0,3 as our limit to correct the ISO 
     if(newExposureTargetOffset > 0.3f) //decrease ISO 
      biasISO = -50; 
     else if(newExposureTargetOffset < -0.3f) //increase ISO 
      biasISO = 50; 

     if(biasISO){ 
      //Normalize ISO level for the current device 
      CGFloat newISO = currentISO+biasISO; 
      newISO = newISO > self.device.activeFormat.maxISO? self.device.activeFormat.maxISO : newISO; 
      newISO = newISO < self.device.activeFormat.minISO? self.device.activeFormat.minISO : newISO; 

      NSError *error = nil; 
      if ([self.device lockForConfiguration:&error]) { 
       [self.device setExposureModeCustomWithDuration:AVCaptureExposureDurationCurrent ISO:newISO completionHandler:^(CMTime syncTime) {}]; 
       [self.device unlockForConfiguration]; 
      } 
     } 
    } 
} 

Con questo codice, la velocità dell'otturatore rimarrà costante e l'ISO verrà regolato per lasciare l'immagine non troppo sotto o sovraesposta.

Non dimenticare di rimuovere l'osservatore ogni volta che è necessario. Spero che questo ti si addica.

Cheers!

+0

Grazie mille! Dovevo andare a conoscere KVO, ma probabilmente era il momento ben speso. Questo sembra funzionare bene per la maggior parte, anche se in alcune situazioni di illuminazione ho lampeggiare rapidamente avanti e indietro tra due ISO. Hai elaborato una serie di valori che funzionano senza problemi per te? – Joe

+0

Puoi commentare quale progetto di esempio della Apple hai usato? – isaac

+0

@isaac Scusa amico, avrei dovuto includerlo all'inizio. Grazie per la segnalazione. Per favore, controlla questo [link] (https://developer.apple.com/library/ios/samplecode/AVCamManual/Introduction/Intro.html#//apple_ref/doc/uid/TP40014578-Intro-DontLinkElementID_2) – khose