2016-05-24 7 views
1

Я использую кран для фокусировки и смущен тем, как использовать разные AVCaptureFocusModes. Делать это:Нажмите, чтобы сфокусироваться, сохраняя непрерывную автофокусировку.

[device setFocusPointOfInterest:focusPoint]; 
[device setFocusMode:AVCaptureFocusModeAutoFocus]; 

результаты успешной фокусировки, но так как я запирая фокусное расстояние, перемещая камеру будет терять фокус навсегда. Вместо этого, если я это сделать:

[device setFocusPointOfInterest:focusPoint]; 
[device setFocusMode:AVCaptureFocusModeContinousAutoFocus]; 

автофокусировка двигатель, кажется, освобождает свою точку интереса и просто сосредоточиться на том, что кажется, лучше. Приложение камеры успешно фокусируется на вашей точке интереса, одновременно сохраняя непрерывную автофокусировку при перемещении камеры, как это делается?

Это мой полный код, как сейчас:

- (void)setFocusPointOfInterest:(CGPoint)point 
{ 
    Class captureDeviceClass = NSClassFromString(@"AVCaptureDevice"); 
    if (captureDeviceClass != nil) { 
     AVCaptureDevice *device = [captureDeviceClass defaultDeviceWithMediaType:AVMediaTypeVideo]; 
     if([device isFocusPointOfInterestSupported] && 
      [device isFocusModeSupported:AVCaptureFocusModeAutoFocus]) { 
      CGRect screenRect = [[UIScreen mainScreen] bounds]; 
      double screenWidth = screenRect.size.width; 
      double screenHeight = screenRect.size.height; 
      double focus_x = point.x/screenWidth; 
      double focus_y = point.y/screenHeight; 
      CGPoint focusPoint = CGPointMake(focus_x,focus_y); 
      if([device lockForConfiguration:nil]) { 
       [device setFocusPointOfInterest:focusPoint]; 
       [device setFocusMode:AVCaptureFocusModeAutoFocus]; 
       [device setExposurePointOfInterest:focusPoint]; 
       if ([device isExposureModeSupported:AVCaptureExposureModeAutoExpose]){ 
        [device setExposureMode:AVCaptureExposureModeAutoExpose]; 
       } 
       [device unlockForConfiguration]; 
      } 
     } 
    } 
} 

ответ

1

Разрешить водопроводный сосредоточиться режимом фокусировки AVCaptureFocusModeAutoFocus и после камеры сделали фокусировки на точке, которую Вы установили. Попробуйте настроить режим фокусировки на AVCaptureFocusModeContinuousAutoFocus. Это немного сложно, так как фокусировка займет некоторое время. В приложении «Камера» вы увидите небольшой эффект предварительного просмотра, когда он фокусируется.

Ключевым моментом является то, что вы можете определить изменения фокусировки с соблюдением значения ключа, и как только вы узнаете, что фокус сделан с автоматической фокусировкой, вы можете сбросить его до непрерывной автоматической фокусировки.

При запуске сеанса камеры добавить ключевое значение наблюдателя AVCaptureDevice

[device addObserver:self forKeyPath:@"adjustingFocus" options:NSKeyValueObservingOptionNew context:nil]; 

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

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if([keyPath isEqualToString:@"adjustingFocus"]){ 
     BOOL adjustingFocus = [ [change objectForKey:NSKeyValueChangeNewKey] isEqualToNumber:[NSNumber numberWithInt:1]]; 
     if (!adjustingFocus) { 
       // Reset the focus mode to AVCaptureFocusModeContinuousAutoFocus here 
     } 
    } 
} 

сейчас он будет работать точно так же, как приложение для камеры. Я получил этот ответ от очень старого ответа SO, но не смог найти его здесь.

+0

Что делать, если вас установить его на непрерывную автофокусировку и оставить его там? Нужно ли постоянно меняться между нормальной и непрерывной АФ? –

+0

@ VaddadiKartick тогда, когда вы нажмете фокус, изменится – Bluewings

+0

Извините, я не понял. –

1

Сама система может обнаружить значительные изменения в изображении. Все, что вам нужно сделать, это сказать, что isSubjectAreaChangeMonitoringEnabled является true и затем зарегистрировать для AVCaptureDeviceSubjectAreaDidChangeNotification как это:

captureDevice.isSubjectAreaChangeMonitoringEnabled = true 
NotificationCenter.default.addObserver(self, 
             selector: #selector(subjectAreaDidChange), 
             name: NSNotification.Name.AVCaptureDeviceSubjectAreaDidChange, 
             object: nil) 

После того, как ваш метод вызывается - просто переключиться на .continuousAutoFocus так:

do { 
    try captureDevice.lockForConfiguration() 
} catch let error as NSError { 
    print("error: \(error.localizedDescription)") 
    return 
} 
captureDevice.focusMode = .continuousAutoFocus 
captureDevice.unlockForConfiguration() 
+0

Я обнаружил, что когда я впервые установил focusPointOfInterest, я решил настроить его на непрерывный AE/AF. В противном случае, когда сцена меняется, я иногда не получаю уведомления. Или получить его через 5 секунд, удерживая телефон в неподвижном состоянии. –

 Смежные вопросы

  • Нет связанных вопросов^_^