iOS'te ML Kit ile Barkod Tarama

Barkodları tanımak ve kodunu çözmek için ML Kit'i kullanabilirsiniz.

Başlamadan önce

  1. Firebase'i uygulamanıza henüz eklemediyseniz başlangıç kılavuzundaki adımlara bakın.
  2. ML Kit kitaplıklarını Podfile'ınıza ekleyin:
    pod 'Firebase/MLVision'
    pod 'Firebase/MLVisionBarcodeModel'
    
    Projenizin kapsüllerini yükledikten veya güncelledikten sonra Xcode .xcworkspace kullanarak projenize dahil olabilir.
  3. Uygulamanızda Firebase'i içe aktarın:

    Swift

    import Firebase

    Objective-C

    @import Firebase;

Giriş resmi kuralları

  • ML Kit'in barkodları doğru okuyabilmesi için giriş resimlerinde yeterli piksel verisiyle temsil edilen barkodlar.

    Belirli piksel verisi gereksinimleri hem ve kodlanan veri miktarıdır (çünkü çoğu barkod farklı uzunluklarda yükü desteklemeleri gerekir). Genellikle anlamlı olan en küçük barkodun birimi en az 2 piksel genişliğinde (ve 2 boyutlu kodlar, 2 piksel yüksekliğinde).

    Örneğin, EAN-13 barkodları çubuklar ile boşluklardan oluşur. Bu boşlukların sayısı 1, 2, 3 veya 4 birim genişliğinde olduğundan EAN-13 barkod görüntüsünde ideal olarak çubuklar ve en az 2, 4, 6 ve 8 piksel genişliğinde boşluklar. Çünkü EAN-13 barkod toplam 95 birim genişliğinde, barkod en az 190 olmalıdır piksel genişliğinde.

    PDF417 gibi daha yoğun biçimler için güvenli okumasını sağlayın. Örneğin, bir PDF417 kodunda en fazla 34 17 birim genişliğinde "kelimeler" bir satır olacak şekilde ekleyebilirsiniz. Bu, tercihen 1156 piksel genişliğinde.

  • Zayıf resim odağı, tarama doğruluğunu olumsuz etkileyebilir. Bu kabul edilebilir sonuçlar almak için kullanıcıdan resmi yeniden çekmesini istemeyi deneyin.

  • Tipik uygulamalarda, daha yüksek bir Barkod üreten çözünürlüklü resim (1280x720 veya 1920x1080 gibi) kameradan daha uzak bir mesafeden algılanabilir.

    Ancak gecikmenin kritik olduğu uygulamalarda daha iyi daha düşük çözünürlükte çekerek daha iyi performans giriş resminin büyük kısmını barkod oluşturur. Şunlara da bakabilirsiniz: Gerçek zamanlı performansı iyileştirmeye yönelik ipuçları.

1. Barkod dedektörünü yapılandırma

Hangi barkod biçimlerini okumayı beklediğinizi bilirseniz hızı artırabilirsiniz otomatik olarak devre dışı bırakabilirsiniz.

Örneğin, yalnızca Aztek kodunu ve QR kodlarını algılamak için bir Şu anki VisionBarcodeDetectorOptions nesnesi şu örneği inceleyin:

Swift

let format = VisionBarcodeFormat.all
let barcodeOptions = VisionBarcodeDetectorOptions(formats: format)

Aşağıdaki biçimler desteklenir:

  • Kod 128
  • Kod 39
  • Kod 93
  • CodaBar Dili
  • EAN13
  • EAN8
  • ITF
  • UPCA
  • UPCE
  • QR Kodu
  • PDF417
  • Aztek
  • Veri Matrisi

Objective-C

FIRVisionBarcodeDetectorOptions *options =
    [[FIRVisionBarcodeDetectorOptions alloc]
     initWithFormats: FIRVisionBarcodeFormatQRCode | FIRVisionBarcodeFormatAztec];

Aşağıdaki biçimler desteklenir:

  • Kod 128 (FIRVisionBarcodeFormatCode128)
  • Kod 39 (FIRVisionBarcodeFormatCode39)
  • Kod 93 (FIRVisionBarcodeFormatCode93)
  • Kodabar (FIRVisionBarcodeFormatCodaBar)
  • EAN-13 (FIRVisionBarcodeFormatEAN13)
  • EAN-8 (FIRVisionBarcodeFormatEAN8)
  • ITF (FIRVisionBarcodeFormatITF)
  • UPC-A (FIRVisionBarcodeFormatUPCA)
  • UPC-E (FIRVisionBarcodeFormatUPCE)
  • QR Kodu (FIRVisionBarcodeFormatQRCode)
  • PDF417 (FIRVisionBarcodeFormatPDF417)
  • Aztek (FIRVisionBarcodeFormatAztec)
  • Veri Matrisi (FIRVisionBarcodeFormatDataMatrix)

2. Barkod dedektörünü çalıştırın

Bir resimdeki barkodları taramak için resmi UIImage veya CMSampleBufferRef - VisionBarcodeDetector detect(in:) yöntem:

  1. VisionBarcodeDetector öğesinin bir örneğini alın:

    Swift

    lazy var vision = Vision.vision()
    
    let barcodeDetector = vision.barcodeDetector(options: barcodeOptions)

    Objective-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionBarcodeDetector *barcodeDetector = [vision barcodeDetector];
    // Or, to change the default settings:
    // FIRVisionBarcodeDetector *barcodeDetector =
    //     [vision barcodeDetectorWithOptions:options];
  2. Bir VisionImage nesnesi oluşturmak için UIImage veya CMSampleBufferRef.

    UIImage kullanmak için:

    1. Gerekirse resmi, imageOrientation özellik değeri .up.
    2. Doğru şekilde döndürülen öğeyi kullanarak bir VisionImage nesnesi oluşturun UIImage. Herhangi bir rotasyon meta verisi belirtme (varsayılan) değeri (.topLeft) kullanılmalıdır.

      Swift

      let image = VisionImage(image: uiImage)

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

    CMSampleBufferRef kullanmak için:

    1. Aşağıdakini belirten bir VisionImageMetadata nesnesi oluşturun: içerdiği resim verilerinin yönü CMSampleBufferRef arabellek.

      Resmin yönünü öğrenmek için:

      Swift

      func imageOrientation(
          deviceOrientation: UIDeviceOrientation,
          cameraPosition: AVCaptureDevice.Position
          ) -> VisionDetectorImageOrientation {
          switch deviceOrientation {
          case .portrait:
              return cameraPosition == .front ? .leftTop : .rightTop
          case .landscapeLeft:
              return cameraPosition == .front ? .bottomLeft : .topLeft
          case .portraitUpsideDown:
              return cameraPosition == .front ? .rightBottom : .leftBottom
          case .landscapeRight:
              return cameraPosition == .front ? .topRight : .bottomRight
          case .faceDown, .faceUp, .unknown:
              return .leftTop
          }
      }

      Objective-C

      - (FIRVisionDetectorImageOrientation)
          imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                                 cameraPosition:(AVCaptureDevicePosition)cameraPosition {
        switch (deviceOrientation) {
          case UIDeviceOrientationPortrait:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationLeftTop;
            } else {
              return FIRVisionDetectorImageOrientationRightTop;
            }
          case UIDeviceOrientationLandscapeLeft:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationBottomLeft;
            } else {
              return FIRVisionDetectorImageOrientationTopLeft;
            }
          case UIDeviceOrientationPortraitUpsideDown:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationRightBottom;
            } else {
              return FIRVisionDetectorImageOrientationLeftBottom;
            }
          case UIDeviceOrientationLandscapeRight:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationTopRight;
            } else {
              return FIRVisionDetectorImageOrientationBottomRight;
            }
          default:
            return FIRVisionDetectorImageOrientationTopLeft;
        }
      }

      Ardından meta veri nesnesini oluşturun:

      Swift

      let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
      let metadata = VisionImageMetadata()
      metadata.orientation = imageOrientation(
          deviceOrientation: UIDevice.current.orientation,
          cameraPosition: cameraPosition
      )

      Objective-C

      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      AVCaptureDevicePosition cameraPosition =
          AVCaptureDevicePositionBack;  // Set to the capture device you used.
      metadata.orientation =
          [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                       cameraPosition:cameraPosition];
    2. Şunu kullanarak bir VisionImage nesnesi oluşturun: CMSampleBufferRef nesnesi ve rotasyon meta verileri:

      Swift

      let image = VisionImage(buffer: sampleBuffer)
      image.metadata = metadata

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. Ardından resmi detect(in:) yöntemine iletin:

    Swift

    barcodeDetector.detect(in: visionImage) { features, error in
      guard error == nil, let features = features, !features.isEmpty else {
        // ...
        return
      }
    
      // ...
    }

    Objective-C

    [barcodeDetector detectInImage:image
                        completion:^(NSArray<FIRVisionBarcode *> *barcodes,
                                     NSError *error) {
      if (error != nil) {
        return;
      } else if (barcodes != nil) {
        // Recognized barcodes
        // ...
      }
    }];

3. Barkodlardan bilgi al

Barkod tanıma işlemi başarılı olursa algılayıcı, VisionBarcode nesne algılandı. Her VisionBarcode nesnesi bir barkodu kullanabilirsiniz. Her barkod için giriş görüntüsündeki sınırlayıcı koordinatların yanı sıra barkodu görürsünüz. Ayrıca, barkod dedektörü veri türünü tarafından kodlanırsa ayrıştırılmış veri içeren bir nesne alabilirsiniz.

Örneğin:

Swift

for barcode in barcodes {
  let corners = barcode.cornerPoints

  let displayValue = barcode.displayValue
  let rawValue = barcode.rawValue

  let valueType = barcode.valueType
  switch valueType {
  case .wiFi:
    let ssid = barcode.wifi!.ssid
    let password = barcode.wifi!.password
    let encryptionType = barcode.wifi!.type
  case .URL:
    let title = barcode.url!.title
    let url = barcode.url!.url
  default:
    // See API reference for all supported value types
  }
}

Objective-C

 for (FIRVisionBarcode *barcode in barcodes) {
   NSArray *corners = barcode.cornerPoints;

   NSString *displayValue = barcode.displayValue;
   NSString *rawValue = barcode.rawValue;

   FIRVisionBarcodeValueType valueType = barcode.valueType;
   switch (valueType) {
     case FIRVisionBarcodeValueTypeWiFi:
       // ssid = barcode.wifi.ssid;
       // password = barcode.wifi.password;
       // encryptionType = barcode.wifi.type;
       break;
     case FIRVisionBarcodeValueTypeURL:
       // url = barcode.URL.url;
       // title = barcode.URL.title;
       break;
     // ...
     default:
       break;
   }
 }

Gerçek zamanlı performansı iyileştirmeye yönelik ipuçları

Barkodları gerçek zamanlı bir uygulamada taramak istiyorsanız aşağıdaki talimatları uygulayın:

  • Girişleri kameranın orijinal çözünürlüğünde yakalamayın. Bazı cihazlarda yerel çözünürlükte giriş yakalamak çok büyük (10+ megapiksel) resimler, hiçbir yararı olmadan çok düşük gecikme emin olun. Bunun yerine, kameradan yalnızca gerekli boyutu isteyin izin verilen ses seviyesidir: Genellikle 2 megapikselden fazla değildir.

    Adlandırılmış yakalama oturumu hazır ayarları: AVCaptureSessionPresetDefault, AVCaptureSessionPresetLow AVCaptureSessionPresetMedium, gibi) kullanılması önerilmez. Bunun nedeni, bazı cihazlarda uygun olmayan çözünürlükler sunar. Bunun yerine, kullandığınız hazır ayarları kullanarak AVCaptureSessionPreset1280x720 gibi.

    Tarama hızı önemliyse yakalanan görüntüyü daha da düşürebilirsiniz belirler. Ancak barkodla ilgili minimum boyut gereksinimlerini de göz önünde bulundurun. kontrol edin.

  • Algılayıcıya yapılan çağrıları hızlandırın. Yeni bir video karesi kullanılabilir durumdaysa çerçeveyi bırakın.
  • Algılayıcının çıkışını üzerine grafik yerleştirmek için kullanıyorsanız giriş görüntüsünü kullanın, önce ML Kit'ten sonucu alın ve ardından görüntüyü oluşturun tek bir adımda yapabilirsiniz. Bu şekilde, öğeleri ekran yüzeyinde her giriş karesi için yalnızca bir kez. Bkz. previewOverlayView ve FIRDetectionOverlayView sınıfları inceleyelim.