2016-05-24 1 views
1

Je suis en train de mettre en œuvre le tap pour me concentrer et je suis confus par la façon d'utiliser les différents AVCaptureFocusModes. Faire ceci:Appuyez pour effectuer la mise au point tout en gardant l'autofocus en continu

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

résultats dans un foyer avec succès, mais depuis que je suis verrouillage de la distance focale, le déplacement de la caméra va perdre le focus pour toujours. Au lieu de cela, si je fais ceci:

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

Le moteur de mise au point automatique semble rejeter mon point d'intérêt et de se concentrer uniquement sur ce qui semble le mieux. L'application de l'appareil photo se concentre avec succès sur votre point d'intérêt tout en gardant l'autofocus en continu lorsque vous déplacez l'appareil photo, comment cela se fait-il?

Ceci est mon code complet dès maintenant:

- (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]; 
      } 
     } 
    } 
} 

Répondre

1

Permet de se concentrer avec robinet en mode de mise au point AVCaptureFocusModeAutoFocus et une fois que la caméra fait en se concentrant sur le point que vous définissez. Essayez de régler le mode de mise au point sur AVCaptureFocusModeContinuousAutoFocus. C'est un peu délicat car la mise au point prendra du temps. Dans l'application de caméra, vous verrez un petit effet sur l'aperçu quand il se concentre. Le point clé est que vous pouvez comprendre que la mise au point change avec l'observation d'une valeur clé et une fois que vous savez que la mise au point est faite automatiquement, vous pouvez la réinitialiser à la mise au point automatique continue.

Lorsque vous démarrez la session de la caméra ajouter un observateur de valeur clé pour AVCaptureDevice

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

lorsque la valeur des changements clés à la nouvelle valeur, vous saurez appareil se concentre ou non. Quand ce n'est pas le cas, passez à la mise au point automatique continue.

- (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 
     } 
    } 
} 

maintenant il fonctionnera exactement comme application de caméra. J'ai obtenu cette réponse de très vieille réponse SO, mais je ne pouvais pas trouver pour se référer ici.

+0

Que faire si vous le mettre en AF continu, et le laisser là? Est-il nécessaire de continuer à changer entre une AF normale et continue? –

+0

@VaddadiKartick puis quand vous appuyez sur le focus va changer – Bluewings

+0

Désolé, je n'ai pas compris. –

1

Le système lui-même peut détecter des changements importants dans l'image. Tout ce que vous avez à faire est de dire que isSubjectAreaChangeMonitoringEnabled est true et inscrivez-vous pour la AVCaptureDeviceSubjectAreaDidChangeNotification comme ceci:

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

Une fois que votre méthode est appelée - tout simplement passer à .continuousAutoFocus comme ceci:

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

J'ai trouvé que lorsque j'ai réglé pour la première fois focusPointOfInterest, je dois le mettre en AE/AF continu. Sinon, lorsque la scène change, il m'arrive parfois de ne plus recevoir de notification. Ou obtenez-le après 5 secondes de tenir le téléphone stable. –