2015-04-23 6 views
5

Я использую видеосигнал камеры для обработки некоторых изображений и хотел бы оптимизировать для максимальной скорости затвора. Я знаю, что вы можете вручную установить продолжительность воздействия и ISO, используяКамера iOS: продолжительность ручной экспозиции, но авто ISO?

setExposureModeCustomWithDuration:ISO:completionHandler: 

, но для этого необходимо установить оба значения вручную. Есть ли способ или умный трюк, чтобы вы могли вручную установить длительность экспозиции, но сами ли обработчик ISO, чтобы попытаться правильно выставить изображение?

ответ

5

Я не уверен, что это решение является лучшим, поскольку я боролся с этим, как и вы. Я сделал это, чтобы прослушать изменения смещения экспозиции и от них настроить ISO до тех пор, пока вы не достигнете приемлемого уровня экспозиции. Большая часть этого кода взята из примера кода Apple

Итак, прежде всего, вы слушаете изменения в ExposureTargetOffset. Добавить в вашем объявлении класса:

static void *ExposureTargetOffsetContext = &ExposureTargetOffsetContext;

Затем, после того как вы сделали свою установку устройства правильно:

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

(вместо captureDevice, используйте свойство для устройства) Затем осуществить в вашем классе обратный вызов для 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]; 
      } 
     } 
    } 
} 

С этот код, выдержка затвора останется постоянной, и ISO будет настроен так, чтобы изображение не было слишком переэкспонировано или переэкспонировано.

Не забудьте удалить наблюдателя всякий раз, когда это необходимо. Надеюсь, это тебе подходит.

Cheers!

+0

Большое спасибо! Я должен был пойти и узнать о КВО, но это, вероятно, было потрачено хорошо. Похоже, что это работает хорошо по большей части, хотя я в некоторых ситуациях освещения быстро размахиваю между двумя ISO. Вы разработали набор ценностей, которые работают плавно для вас? – Joe

+0

Не могли бы вы прокомментировать, какой образец проекта из Apple вы использовали? – isaac

+0

@isaac Извините, я должен был включить его сначала. Спасибо что подметил это. Пожалуйста, проверьте это [link] (https://developer.apple.com/library/ios/samplecode/AVCamManual/Introduction/Intro.html#//apple_ref/doc/uid/TP40014578-Intro-DontLinkElementID_2) – khose