Barkodları iOS'te ML Kit ile tarayın

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

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

Başlamadan önce

  1. Aşağıdaki ML Kit kapsüllerini Podfile'ınıza dahil edin:
    pod 'GoogleMLKit/BarcodeScanning', '3.2.0'
    
  2. Projenizin Pod'larını yükledikten veya güncelledikten sonra Xcode projenizi .xcworkspace kullanarak açın. ML Kit, Xcode'un 12.4 veya sonraki sürümlerinde desteklenir.

Giriş resmi yönergeleri

  • ML Kit'in barkodları doğru şekilde okuyabilmesi için giriş resimleri yeterli piksel verileriyle temsil edilen barkodlar içermelidir.

    Birçok piksel kodu değişken boyut yükünü desteklediği için belirli piksel verisi gereksinimleri hem barkod türüne hem de kodlanan veri miktarına bağlıdır. Genel olarak, barkodun en küçük anlamlı birimi en az 2 piksel genişliğinde ve 2 boyutlu kodlar için 2 piksel yüksekliğinde olmalıdır.

    Örneğin, EAN-13 barkodları 1, 2, 3 veya 4 birim genişliğindeki çubuklardan ve boşluklardan oluşur. Bu nedenle, EAN-13 barkod resmi en az 2, 4, 6 ve 8 piksel genişliğindeki çubuklara ve boşluklara sahip olmalıdır. EAN-13 barkodlarının toplam boyutu 95 birim olduğundan, barkod en az 190 piksel genişliğinde olmalıdır.

    PDF417 gibi yoğun biçimler, ML Kit'in güvenilir şekilde okuyabilmesi için daha büyük piksel boyutlarına ihtiyaç duyar. Örneğin, bir PDF417 kodunda, en az 1156 piksel genişliğinde olacak şekilde tek bir satırda en fazla 34 adet 17 birim genişliğinde "kelime" bulunabilir.

  • Resim odağının düşük olması tarama doğruluğunu etkileyebilir. Uygulamanız kabul edilebilir sonuçlar almıyorsa kullanıcıdan resmi yeniden yakalamasını isteyin.

  • Tipik uygulamalar için, barkodları kameradan daha uzak bir yerden taranabilen 1280x720 veya 1920x1080 gibi daha yüksek çözünürlüklü bir resim sağlamanız önerilir.

    Bununla birlikte, gecikmenin kritik olduğu uygulamalarda resimleri daha düşük çözünürlükte yakalayarak performansı artırabilirsiniz ancak giriş resminin büyük çoğunluğunun barkoddan oluşması gerekir. Ayrıca, gerçek zamanlı performansı artırmaya yönelik ipuçları konusuna bakın.

1. Barkod tarayıcıyı yapılandırma

Okumayı beklediğiniz barkod biçimlerini biliyorsanız barkod tarayıcıyı yalnızca bu biçimleri tarayacak şekilde yapılandırarak hızı artırabilirsiniz.

Örneğin, yalnızca Aztek ve QR kodlarını taramak için aşağıdaki örnekte olduğu gibi bir BarcodeScannerOptions nesnesi oluşturun:

Swift

let format = .all
let barcodeOptions = BarcodeScannerOptions(formats: format)
  

Aşağıdaki biçimler desteklenir:

  • kod128
  • kod39
  • kod93
  • CodaBar
  • verimatrisi
  • EAN13
  • EAN8
  • BTF
  • qrCode
  • UPCA
  • UPC
  • PDF417
  • Aztec

Objective-C

MLKBarcodeScannerOptions *options =
  [[MLKBarcodeScannerOptions alloc]
   initWithFormats: MLKBarcodeFormatQRCode | MLKBarcodeFormatAztec];

Aşağıdaki biçimler desteklenir:

  • Kod 128 (MLKBarcodeFormatCode128)
  • Kod 39 (MLKBarcodeFormatCode39)
  • Kod 93 (MLKBarcodeFormatCode93)
  • Codabar (MLKBarcodeFormatCodaBar)
  • Veri Matrisi (MLKBarcodeFormatDataMatrix)
  • EAN-13 (MLKBarcodeFormatEAN13)
  • EAN-8 (MLKBarcodeFormatEAN8)
  • BTF (MLKBarcodeFormatITF)
  • QR Kodu (MLKBarcodeFormatQRCode)
  • UPC-A (MLKBarcodeFormatUPCA)
  • UPC-E (MLKBarcodeFormatUPCE)
  • PDF-417 (MLKBarcodeFormatPDF417)
  • Aztek Kodu (MLKBarcodeFormatAztec)

2. Giriş resmini hazırlama

Bir resimdeki barkodları taramak için resmi BarcodeScanner's process() veya results(in:) yöntemine UIImage veya CMSampleBufferRef olarak iletin:

UIImage veya CMSampleBuffer kullanarak bir VisionImage nesnesi oluşturun.

UIImage kullanıyorsanız şu adımları uygulayın:

  • UIImage ile bir VisionImage nesnesi oluşturun. Doğru .orientation değerini belirttiğinizden emin olun.

    Swift

    let image = VisionImage(image: UIImage)
    visionImage.orientation = image.imageOrientation

    Objective-C

    MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image];
    visionImage.orientation = image.imageOrientation;

CMSampleBuffer kullanıyorsanız şu adımları uygulayın:

  • CMSampleBuffer öğesinde bulunan resim verilerinin yönünü belirtin.

    Resmin yönünü görmek için:

    Swift

    func imageOrientation(
      deviceOrientation: UIDeviceOrientation,
      cameraPosition: AVCaptureDevice.Position
    ) -> UIImage.Orientation {
      switch deviceOrientation {
      case .portrait:
        return cameraPosition == .front ? .leftMirrored : .right
      case .landscapeLeft:
        return cameraPosition == .front ? .downMirrored : .up
      case .portraitUpsideDown:
        return cameraPosition == .front ? .rightMirrored : .left
      case .landscapeRight:
        return cameraPosition == .front ? .upMirrored : .down
      case .faceDown, .faceUp, .unknown:
        return .up
      }
    }
          

    Objective-C

    - (UIImageOrientation)
      imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                             cameraPosition:(AVCaptureDevicePosition)cameraPosition {
      switch (deviceOrientation) {
        case UIDeviceOrientationPortrait:
          return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationLeftMirrored
                                                                : UIImageOrientationRight;
    
        case UIDeviceOrientationLandscapeLeft:
          return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationDownMirrored
                                                                : UIImageOrientationUp;
        case UIDeviceOrientationPortraitUpsideDown:
          return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationRightMirrored
                                                                : UIImageOrientationLeft;
        case UIDeviceOrientationLandscapeRight:
          return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationUpMirrored
                                                                : UIImageOrientationDown;
        case UIDeviceOrientationUnknown:
        case UIDeviceOrientationFaceUp:
        case UIDeviceOrientationFaceDown:
          return UIImageOrientationUp;
      }
    }
          
  • CMSampleBuffer nesnesini ve yönü kullanarak bir VisionImage nesnesi oluşturun:

    Swift

    let image = VisionImage(buffer: sampleBuffer)
    image.orientation = imageOrientation(
      deviceOrientation: UIDevice.current.orientation,
      cameraPosition: cameraPosition)

    Objective-C

     MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer];
     image.orientation =
       [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                    cameraPosition:cameraPosition];

3. BarcodeScanner örneğini alın

Bir BarcodeScanner örneği alın:

Swift

let barcodeScanner = BarcodeScanner.barcodeScanner()
// Or, to change the default settings:
// let barcodeScanner = BarcodeScanner.barcodeScanner(options: barcodeOptions)

Objective-C

MLKBarcodeScanner *barcodeScanner = [MLKBarcodeScanner barcodeScanner];
// Or, to change the default settings:
// MLKBarcodeScanner *barcodeScanner =
//     [MLKBarcodeScanner barcodeScannerWithOptions:options];

4. Resmi işleyin

Ardından, resmi process() yöntemine geçirin:

Swift

barcodeScanner.process(visionImage) { features, error in
  guard error == nil, let features = features, !features.isEmpty else {
    // Error handling
    return
  }
  // Recognized barcodes
}

Objective-C

[barcodeScanner processImage:image
                  completion:^(NSArray<MLKBarcode *> *_Nullable barcodes,
                               NSError *_Nullable error) {
  if (error != nil) {
    // Error handling
    return;
  }
  if (barcodes.count > 0) {
    // Recognized barcodes
  }
}];

5. Barkodlardan bilgi alma

Barkod tarama işlemi başarılı olursa tarayıcı bir dizi Barcode nesnesi döndürür. Her Barcode nesnesi, resimde algılanan bir barkodu temsil eder. Her barkod için giriş resminde sınırlayıcı koordinatlarını ve barkod tarafından kodlanan ham verileri alabilirsiniz. Ayrıca, barkod tarayıcı barkod tarafından kodlanan veri türünü belirleyebildiyse ayrıştırılan verileri içeren bir nesne alabilirsiniz.

Örnek:

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 (MLKBarcode *barcode in barcodes) {
   NSArray *corners = barcode.cornerPoints;

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

   MLKBarcodeValueType valueType = barcode.valueType;
   switch (valueType) {
     case MLKBarcodeValueTypeWiFi:
       ssid = barcode.wifi.ssid;
       password = barcode.wifi.password;
       encryptionType = barcode.wifi.type;
       break;
     case MLKBarcodeValueTypeURL:
       url = barcode.URL.url;
       title = barcode.URL.title;
       break;
     // ...
     default:
       break;
   }
 }

Gerçek zamanlı performansı artırmak için ipuçları

Barkodları gerçek zamanlı bir uygulamada taramak istiyorsanız en iyi kare hızlarına ulaşmak için aşağıdaki yönergeleri izleyin:

  • Girişi kameranın yerel çözünürlüğünde yakalamayın. Bazı cihazlarda, yerel çözünürlükte giriş yakalama, çok büyük (10+ megapiksel) görüntüler oluşturur. Bu da doğruluk açısından avantaj sağlamayarak çok düşük gecikmeyle sonuçlanır. Bunun yerine, yalnızca barkod tarama için gereken (genellikle en fazla 2 megapiksel) kamera boyutunu isteyin.

    Ancak bazı cihazlarda uygun olmayan çözünürlüklerle eşlenebileceğinden, adlandırılmış yakalama oturumu hazır ayarları (AVCaptureSessionPresetDefault, AVCaptureSessionPresetLow, AVCaptureSessionPresetMedium vb.) önerilmez. Bunun yerine, AVCaptureSessionPreset1280x720 gibi belirli hazır ayarları kullanın.

    Tarama hızı önemliyse görüntü yakalama çözünürlüğünü daha da düşürebilirsiniz. Ancak, yukarıda belirtilen minimum barkod boyutu şartlarını göz önünde bulundurun.

    Bir dizi akış video karesinden barkodları ayırt etmeye çalışıyorsanız tanıyıcı, kareden çerçeveye farklı sonuçlar üretebilir. İyi bir sonuç döndürdüğünüzden emin olmak için aynı değerden oluşan seri bir diziyi alana kadar beklemeniz gerekir.

    Sağlama hanesi ITF ve CODE-39 için desteklenmez.

  • Video çerçevelerini işlemek için algılayıcının results(in:) eşzamanlı API'sını kullanın. Belirtilen video çerçevesinden eşzamanlı olarak sonuç almak için bu yöntemi AVCaptureVideoDataOutputSampleBufferDelegate& captureOutput(_, didOutput:from:) işlevinden çağırın. Algılayıcının çağrılarını kısmak için AVCaptureVideoDataOutput alwaysDiscardsLateVideoFrames true olarak bırak. Algılayıcı çalışırken yeni bir video çerçevesi kullanılabilir hale gelirse atlanır.
  • Algılayıcının çıkışını giriş resmine bindirmek için kullanırsanız önce ML Kit'ten sonucu alın, ardından resmi ve yer paylaşımını tek adımda oluşturun. Bunu yaptığınızda, işlenen her bir giriş çerçevesi için görüntüleme yüzeyini yalnızca bir kez oluşturursunuz. Örnek için ML Kit hızlı başlangıç örneğindeki updatepreviewLayoutViewWithLastFrame bölümüne bakın.