2016-10-13 4 views
0

Я реализовал сканирование штрих-кода в соответствии со стандартами вокруг учебников. Но я думаю, что представление ужасно. Я могу указать свою камеру на штрих-код с перфорированным фокусом и без бликов, и все же код не обнаруживает штрих-код.Улучшение сканера штрих-кода в Swift

И я как бы ревную к приложению ScanLife - его удивительно быстро и обнаруживает коды, даже не находясь в фокусе.

Любые идеи по улучшению сканирования?

Вот отрывок из моего кода (часть обнаружения):.

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

ответ

0

Для Что его стоит, по-видимому, чтобы улучшить производительность, чтобы определить прямоугольник искать в Кроме того, как сказано в документации:

Задание rectOfInterest может улучшить эффективность обнаружения для определенных типов метаданных.

код может быть

metadataOutput.rectOfInterest = focusView.frame 

Где focusView вид отображается в верхней части предварительного просмотра слоя, чтобы сигнализировать