2016-12-27 75 views
1

enter image description hereAV基金会相机扫描框

我能够成功扫描全相机分辨率条形码内,但我想它应该只在特定的帧(盒被置于中心)扫描条形码。如果条码在于该框架之外不应该进行扫描。

var session   : AVCaptureSession = AVCaptureSession() 
    var previewLayer : AVCaptureVideoPreviewLayer! 
    var highlightView : UIView = UIView() 

func opencamera() 
    { 
     if session.running 
     { 

     } 
     else 
     { 
      session = AVCaptureSession() 

      // Set the captureDevice. 

      let videoCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 

      session.sessionPreset = AVCaptureSessionPresetInputPriority 
      // Create input object. 
      let videoInput: AVCaptureDeviceInput? 

      do { 
       videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice) 
      } catch { 
       return 
      } 

      // Add input to the session. 
      if (session.canAddInput(videoInput)) { 
       session.addInput(videoInput) 
      } else { 
       scanningNotPossible() 
      } 
      let metadataOutput = AVCaptureMetadataOutput() 

      // Add output to the session. 
      if (session.canAddOutput(metadataOutput)) { 
       session.addOutput(metadataOutput) 

       // Send captured data to the delegate object via a serial queue. 
       metadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue()) 

       // Set barcode type for which to scan: EAN-13. 
       //metadataOutput.metadataObjectTypes = metadataOutput.availableMetadataObjectTypes 
       metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeUPCECode, 
                 AVMetadataObjectTypeCode39Code, 
                 AVMetadataObjectTypeCode39Mod43Code, 
                 AVMetadataObjectTypeEAN13Code, 
                 AVMetadataObjectTypeEAN8Code, 
                 AVMetadataObjectTypeCode93Code, 
                 AVMetadataObjectTypeCode128Code, 
                 AVMetadataObjectTypePDF417Code, 

       ] 

      } else { 
       scanningNotPossible() 
      } 
      previewLayer = AVCaptureVideoPreviewLayer(session: session); 
      previewLayer.frame = self.view.frame 

      previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
      previewLayer?.position = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds)) 
          image.layer.addSublayer(previewLayer); 
          session.startRunning() 
     } 
    } 
    func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) { 

     //var highlightViewRect = CGRectZero 

     // var barCodeObject : AVMetadataObject! 

     var detectionString : String! 

     let barCodeTypes = [AVMetadataObjectTypeUPCECode, 
          AVMetadataObjectTypeCode39Code, 
          AVMetadataObjectTypeCode39Mod43Code, 
          AVMetadataObjectTypeEAN13Code, 
          AVMetadataObjectTypeEAN8Code, 
          AVMetadataObjectTypePDF417Code, 
          ] 


     // The scanner is capable of capturing multiple 2-dimensional barcodes in one scan. 
     for metadata in metadataObjects { 

      for barcodeType in barCodeTypes { 


       let decodedData: AVMetadataMachineReadableCodeObject = metadata as! AVMetadataMachineReadableCodeObject 
       if metadata.type == barcodeType { 

              detectionString = (metadata as! AVMetadataMachineReadableCodeObject).stringValue 
        if(metadata.type == AVMetadataObjectTypeEAN13Code){ 
         if (detectionString.hasPrefix("0") && detectionString.characters.count > 1){ 
          detectionString = String(detectionString.characters.dropFirst()) 
         } 

        } 
        AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate)) 
        self.session.stopRunning() 

        break 
       } 



      } 
     } 

     print(detectionString) 

     self.previewLayer.removeFromSuperlayer() 
     self.highlightView.removeFromSuperview() 

    } 

回答

0

尝试为您AVCaptureMetaDataOutput设置rectOfInterest

self.metadataOutput.rectOfInterest = [self.previewLayer metadataOutputRectOfInterestForRect:myRectOfInterest]; 

作为每documentation

rectOfInterest感兴趣用于限制搜索区域 视觉元数据的矩形。

该属性的值是一个CGRect值,该值确定每个视频帧的感兴趣对象的矩形框 。

矩形的原点是左上角,并且相对于提供元数据的设备的坐标空间 。

指定的感兴趣的矩形可以改善某些类型的元数据的检测性能 。元数据对象,它们的边界不相交 与rectOfInterest将不予退还。

该属性的缺省值是(0.0,0.0,1.0,1.0 )的矩形。

请注意,该值不是您的像素。看看SO回答herehere获取更多信息。