2017-11-28 9 views
0

Ich entwickle scan Barcode-Anwendung mit swift4.iOS: Barcode sehr langsam scannen

ich versucht habe 2 beliebte Open-Source verwenden, die sind MTBarcode (mit AVFoundation) und iOS Vision (GoogleVision Framework), aber Scangeschwindigkeit ist nicht schnell, wie ich erwarte, dass es etwa 2 oder 3 Sekunden dauert reale Barcode zu erfassen.

Einige Leute schlagen vor, dass ich sessionPreset zu AVCaptureSessionPresetMedium ändere, aber es ist nicht effektiv.

Jeder kann mir vorschlagen, wie man die Scangeschwindigkeit verbessert. Sollten wir eine andere Kamerakonfiguration aktualisieren oder eine andere Open Source verwenden?

+0

Welche Arten von Barcodes Sie Scannen zu überprüfen? Ich habe den integrierten AVMetadataOutput für EAN-8 und EAN-13 verwendet und festgestellt, dass er extrem zuverlässig und schnell ist. – Gereon

+0

Nicht sicher, ob einige von denen es bereits tun, aber das Erzwingen des Fokus kann viel helfen, da oft viel Zeit verloren geht, wenn versucht wird, Fokus statt der eigentlichen Barcode-Identifikation zu erhalten. Darüber hinaus müssen Sie viel mehr Details angeben, einschließlich der Art des Barcodes, seine Größe, Entfernung, die Art des Materials, ob Sie einen guten Kontrast haben, etc. Das tatsächliche Telefon kann auch helfen. Und natürlich nehmen wir an, Sie benutzen die Rückkamera. – jcaron

+0

@jcaron: Barcode, den ich scannen möchte, ist Code 128 Typ. Größe ist ungefähr 1cm x 4cm. Ich habe versucht mit iPhone 6, 6s und 5. Ich glaube, ich habe versucht, Kamera-Kontrast anzupassen, aber Scanning-Geschwindigkeit ist nicht schneller. Können Sie mir zeigen, wie Sie den Fokus direkt auf den Barcode setzen können? – ThangBM

Antwort

0

ich hatte QRCode und Barcodescanner ich werde das Snippet unten

import AVFoundation 

add Delegat

class YOUR_VIEW_CONTROLLER: UIViewController,AVCaptureMetadataOutputObjectsDelegate 

initialize erforderlichen Variablen

var captureSession:AVCaptureSession? 
    var videoPreviewLayer:AVCaptureVideoPreviewLayer? 
    var qrCodeFrameView:UIView? 
    var qrCodeDelegate:QRCodeScannerVCDelegate? 

    let supportedCodeTypes = [AVMetadataObjectTypeUPCECode, 
           AVMetadataObjectTypeCode39Code, 
           AVMetadataObjectTypeCode39Mod43Code, 
           AVMetadataObjectTypeCode93Code, 
           AVMetadataObjectTypeCode128Code, 
           AVMetadataObjectTypeEAN8Code, 
           AVMetadataObjectTypeEAN13Code, 
           AVMetadataObjectTypeAztecCode, 
           AVMetadataObjectTypePDF417Code, 
           AVMetadataObjectTypeQRCode] 

hinzufügen unten Funktion in Ihrem Viewcontroller teilen

func startVideoCapture(){ 
     // Get an instance of the AVCaptureDevice class to initialize a device object and provide the video as the media type parameter. 
     let captureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 

     do { 
      // Get an instance of the AVCaptureDeviceInput class using the previous device object. 
      let input = try AVCaptureDeviceInput(device: captureDevice) 

      // Initialize the captureSession object. 
      captureSession = AVCaptureSession() 

      // Set the input device on the capture session. 
      captureSession?.addInput(input) 

      // Initialize a AVCaptureMetadataOutput object and set it as the output device to the capture session. 
      let captureMetadataOutput = AVCaptureMetadataOutput() 
      captureSession?.addOutput(captureMetadataOutput) 

      // Set delegate and use the default dispatch queue to execute the call back 
      captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 
      captureMetadataOutput.metadataObjectTypes = supportedCodeTypes 

      // Initialize the video preview layer and add it as a sublayer to the viewPreview view's layer. 
      videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
      videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill 
      videoPreviewLayer?.frame = self.qrCodeView.bounds 
      self.qrCodeView.layer.addSublayer(videoPreviewLayer!) 
      self.qrCodeView.clipsToBounds = true 
      // Start video capture. 
      captureSession?.startRunning() 
      qrCodeFrameView = UIView() 

//   if let qrCodeFrameView = qrCodeFrameView { 
//    qrCodeFrameView.layer.borderColor = UIColor.green.cgColor 
//    qrCodeFrameView.layer.borderWidth = 2 
//    self.qrCodeView.addSubview(qrCodeFrameView) 
//    self.qrCodeView.bringSubview(toFront: qrCodeFrameView) 
//   } 

     } catch { 
      // If any error occurs, simply print it out and don't continue any more. 
      print(error) 
      return 
     } 
    } 

    // MARK: - AVCaptureMetadataOutputObjectsDelegate Methods 

    func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) { 

     // Check if the metadataObjects array is not nil and it contains at least one object. 
     if metadataObjects == nil || metadataObjects.count == 0 { 
      qrCodeFrameView?.frame = CGRect.zero 
      print("No QR/barcode is detected") 
      return 
     } 

     // Get the metadata object. 
     let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject 

     if supportedCodeTypes.contains(metadataObj.type) { 
      // If the found metadata is equal to the QR code metadata then update the status label's text and set the bounds 
      let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj) 
      if barCodeObject != nil{ 
       qrCodeFrameView?.frame = barCodeObject!.bounds 
      } 

      if metadataObj.stringValue != nil { 
       print("\(metadataObj.stringValue)") 

      } 
     } 
    } 

und in Ihrem viewWillAppear

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(true) 
    self.startVideoCapture() 
} 

und vergessen Sie nicht, die Kamera um Erlaubnis, bevor Anruf startViewCapture

Hope this helfen Ihnen

+0

Haben Sie einen Vorschlag für den Fokus-Modus, ich muss die Kamera bewegen, um Fokus zu erhalten, Barcode immer verloren Fokus – ThangBM

+0

Sie meine Overlay oder Autofokus? –

+0

Ich meine, ich möchte Kamera Autofokus Barcode schnell. In einigen Scanning-Barcode-Anwendungen konzentriert sich Barcode sehr schnell. – ThangBM