2016-10-13 3 views
0

J'ai implémenté la numérisation de codes à barres en suivant les «standards» autour des tutoriels. Mais je pense que la performance est un peu terrible. Je peux pointer mon appareil photo contre un code-barres avec une mise au point parfaite et sans éblouissement et toujours le code ne détecte pas le code à barres.Amélioration du scanner de codes à barres dans Swift

Et je suis un peu jaloux de l'application ScanLife - ses codes étonnamment rapides et détectent sans même être au point.

Des idées pour améliorer la numérisation?

Voici un extrait de mon code (la partie de détection).

var captureSession: AVCaptureSession! 
    var previewLayer: AVCaptureVideoPreviewLayer! 
    let videoCaptureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 

    captureSession = AVCaptureSession() 

    let videoInput: AVCaptureDeviceInput 

    do { 
     videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice) 

     if captureSession.canAddInput(videoInput) { 
      captureSession.addInput(videoInput) 

      let metadataOutput = AVCaptureMetadataOutput() 

      if captureSession.canAddOutput(metadataOutput) { 
       captureSession.addOutput(metadataOutput) 

       metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 
       metadataOutput.metadataObjectTypes = metadataOutput.availableMetadataObjectTypes // Use all metadata object types by default. 
       metadataOutput.rectOfInterest = CGRect.zero 

      } else { 
       failed() 
       return 
      } 

      if (videoCaptureDevice?.isFocusModeSupported(.continuousAutoFocus))! { 
       do { 
        if(try videoCaptureDevice?.lockForConfiguration()) != nil { 
         videoCaptureDevice?.exposureMode = .continuousAutoExposure 
         videoCaptureDevice?.focusMode = .continuousAutoFocus 
         videoCaptureDevice?.unlockForConfiguration() 
        } 
       } catch { 

       } 
      } 

      videoCaptureDevice?.addObserver(self, forKeyPath: "adjustingFocus", options: NSKeyValueObservingOptions.new, context: nil) 
      let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ScannerViewController.focus(_:))) 
      mainView.addGestureRecognizer(tapGesture) 

      previewLayer = AVCaptureVideoPreviewLayer(session: captureSession); 
      previewLayer.frame = view.layer.bounds; 
      previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
      mainView.layer.addSublayer(previewLayer); 

      /* 
      // Initialize code Frame to highlight the code 
      codeFrameView.layer.borderColor = UIColor.green.cgColor 
      codeFrameView.layer.borderWidth = 2 
      view.addSubview(codeFrameView) 
      view.bringSubview(toFront: codeFrameView) 
      */ 

      captureSession.startRunning() 

     } else { 
      failed() 
     } 
    } catch { 
     failed() 
    } 

Répondre

0

Pour ce qui est sa valeur, il semble améliorer les performances de définir un rect à rechercher dans également que la documentation dit:

La spécification d'un rectOfInterest peut améliorer les performances de détection pour certains types de métadonnées.

Code pourrait être

metadataOutput.rectOfInterest = focusView.frame 

Où FocusView est une vue affichée sur le dessus de la couche de prévisualisation, pour signaler