2015-04-23 23 views
5

Tôi đang sử dụng nguồn cấp dữ liệu video của máy ảnh để xử lý một số hình ảnh và muốn tối ưu hóa tốc độ cửa trập nhanh nhất. Tôi biết bạn có thể đặt thời lượng phơi sáng và ISO theo cách thủ công bằng cách sử dụngMáy ảnh iOS: thời lượng phơi sáng thủ công nhưng tự động ISO?

setExposureModeCustomWithDuration:ISO:completionHandler: 

nhưng điều này yêu cầu phải đặt cả giá trị bằng tay. Có một phương pháp hay thủ thuật thông minh để cho phép bạn thiết lập độ phơi sáng theo cách thủ công nhưng phải tự xử lý ISO để cố gắng phơi sáng chính xác hình ảnh?

Trả lời

5

Tôi không chắc chắn nếu giải pháp này là giải pháp tốt nhất, vì tôi đã đấu tranh với điều này như bạn. Những gì tôi đã làm là lắng nghe những thay đổi trong bù trừ phơi sáng và, từ chúng, điều chỉnh ISO cho đến khi bạn đạt đến mức phơi sáng có thể chấp nhận được. Hầu hết mã này đã được lấy từ mã mẫu của Apple

Vì vậy, trước hết, bạn lắng nghe những thay đổi trên ExposureTargetOffset. Thêm vào khai lớp học của bạn:

static void *ExposureTargetOffsetContext = &ExposureTargetOffsetContext;

Sau đó, một khi bạn đã thực hiện cài đặt thiết bị của bạn đúng cách:

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

(Thay vì captureDevice, sử dụng tài sản của mình cho các thiết bị) Sau đó thực hiện trong lớp của bạn gọi lại cho 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]; 
      } 
     } 
    } 
} 

Với mã này, tốc độ màn trập sẽ vẫn không đổi và ISO sẽ được điều chỉnh để rời khỏi hình ảnh không quá dưới hoặc quá sáng.

Đừng quên xóa người quan sát bất cứ khi nào cần. Hy vọng điều này phù hợp với bạn.

Chúc mừng!

+0

Cảm ơn bạn rất nhiều! Tôi phải đi và tìm hiểu về KVO nhưng đó có lẽ là thời gian tốt. Điều này có vẻ là làm việc tốt cho hầu hết các phần, mặc dù tôi trong một số tình huống ánh sáng tôi nhận được nhanh chóng nhấp nháy qua lại giữa hai ISO. Bạn đã làm việc ra một tập hợp các giá trị hoạt động trơn tru cho bạn? – Joe

+0

Bạn có thể nhận xét dự án mẫu nào từ Apple bạn đã sử dụng không? – isaac

+0

@isaac Xin lỗi, tôi nên đưa nó vào lúc đầu. Cảm ơn bạn đã chỉ ra điều đó. Vui lòng kiểm tra [link] này (https://developer.apple.com/library/ios/samplecode/AVCamManual/Introduction/Intro.html#//apple_ref/doc/uid/TP40014578-Intro-DontLinkElementID_2) – khose

Các vấn đề liên quan