菜鸟教程小白 发表于 2022-12-11 18:25:15

ios - AV Foundation 相机扫描箱内


                                            <p><p> <a href="/image/LrFHJ.png" rel="noreferrer noopener nofollow"><img src="/image/LrFHJ.png" alt="enter image description here"/></a> </p>

<p>我能够成功扫描具有完整相机分辨率的条形码,但我希望它只能扫描特定框架内的条形码(位于中心的框)。如果条形码位于该框架之外,则不应扫描。 </p>

<pre><code>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: !, 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(&#34;0&#34;) &amp;&amp; detectionString.characters.count &gt; 1){
                            detectionString = String(detectionString.characters.dropFirst())
                        }

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

                  break
                }



            }
      }

      print(detectionString)

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

    }
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>尝试为您的 <code>AVCaptureMetaDataOutput</code> 设置 <code>rectOfInterest</code>。</p>

<pre><code>self.metadataOutput.rectOfInterest = ;
</code></pre>

<p>根据 <a href="https://developer.apple.com/reference/avfoundation/avcapturemetadataoutput/1616291-rectofinterest" rel="noreferrer noopener nofollow">documentation</a> </p>

<blockquote>
<p>rectOfInterest A rectangle of interest for limiting the search area
for visual metadata.</p>

<p>The value of this property is a CGRect value that determines the
object’s rectangle of interest for each frame of video.</p>

<p>The rectangle&#39;s origin is top left and is relative to the coordinate
space of the device providing the metadata.</p>

<p>Specifying a rectangle of interest may improve detection performance
for certain types of metadata. Metadata objects whose bounds do not
intersect with the rectOfInterest will not be returned.</p>

<p>The default value of this property is a rectangle of (0.0, 0.0, 1.0,
1.0).</p>
</blockquote>

<p>请注意,该值不是您的像素。看看 SO 答案 <a href="https://stackoverflow.com/questions/32401364/how-do-i-use-the-metadataoutputrectofinterestforrect-method-and-rectofinterest-p" rel="noreferrer noopener nofollow">here</a>和 <a href="https://stackoverflow.com/questions/26634036/xcode-avcapturesession-scan-barcode-in-specific-frame-rectofinterest-is-not-wor" rel="noreferrer noopener nofollow">here</a>了解更多信息。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - AV Foundation 相机扫描箱内,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/41340123/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/41340123/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - AV Foundation 相机扫描箱内