iOS पर ML किट से बारकोड स्कैन करें

बारकोड को पहचानने और उसे डिकोड करने के लिए, ML Kit का इस्तेमाल किया जा सकता है.

शुरू करने से पहले

  1. अगर आपने पहले से अपने ऐप्लिकेशन में Firebase नहीं जोड़ा है, तो ऐसा करने के लिए शुरुआती निर्देश में दिए गए चरणों को पूरा करें.
  2. अपनी Podfile में ML Kit लाइब्रेरी शामिल करें:
    pod 'Firebase/MLVision'
    pod 'Firebase/MLVisionBarcodeModel'
    
    प्रोजेक्ट के Pods को इंस्टॉल या अपडेट करने के बाद, अपना Xcode ज़रूर खोलें प्रोजेक्ट को .xcworkspace का इस्तेमाल करके बनाया गया है.
  3. अपने ऐप्लिकेशन में Firebase इंपोर्ट करें:

    Swift

    import Firebase

    Objective-C

    @import Firebase;

इनपुट इमेज के लिए दिशा-निर्देश

  • ML Kit में बारकोड को सही तरीके से पढ़ने के लिए, इनपुट इमेज में बारकोड, जिन्हें काफ़ी पिक्सल डेटा से दिखाया जाता है.

    पिक्सल के लिए डेटा की ज़रूरी शर्तें, दोनों टाइप पर निर्भर करती हैं बारकोड और उसमें एन्कोड किए गए डेटा की मात्रा (ज़्यादातर बारकोड के बाद से) वाली अलग-अलग लंबाई के पेलोड के लिए उपलब्ध है). आम तौर पर, सबसे छोटा बारकोड की यूनिट कम से कम 2 पिक्सल चौड़ी (और दो डाइमेंशन वाले कोड, दो पिक्सल लंबे).

    उदाहरण के लिए, EAN-13 बारकोड बार और स्पेस से बना होता है. इसमें 1, 2, 3 या 4 यूनिट चौड़ी हो, इसलिए EAN-13 बारकोड इमेज में बार और ऐसी जगहें जो कम से कम 2, 4, 6, और 8 पिक्सल चौड़ी हों. क्योंकि एक EAN-13 बारकोड कुल 95 यूनिट चौड़ा है. बारकोड कम से कम 190 का होना चाहिए पिक्सल चौड़ा.

    PDF417 जैसे डेंसर फ़ॉर्मैट का इस्तेमाल करने के लिए, पिक्सल डाइमेंशन की ज़रूरत ज़्यादा होती है एमएल किट का इस्तेमाल करके, उन्हें भरोसेमंद तरीके से पढ़ा जा सकता है. उदाहरण के लिए, PDF417 कोड में 34, 17-यूनिट चौड़े "शब्द" जो आम तौर पर कम से कम एक पंक्ति में होती हैं. 1156 पिक्सल चौड़ा.

  • इमेज पर फ़ोकस खराब होने से, स्कैन करने के तरीके पर बुरा असर पड़ सकता है. अगर आपको यह नहीं मिल रहा है स्वीकार किए जाते हैं, तो उपयोगकर्ता को इमेज दोबारा कैप्चर करने के लिए कहें.

  • आम तौर पर इस्तेमाल किए जाने वाले ऐप्लिकेशन के लिए, हमारा सुझाव है कि ज़्यादा रिज़ॉल्यूशन वाली इमेज (जैसे कि 1280x720 या 1920x1080), जो बारकोड बनाती है जिनका पता कैमरे से ज़्यादा दूरी से लगाया जा सकता है.

    हालांकि, जिन ऐप्लिकेशन में इंतज़ार का समय बहुत ज़रूरी है उनमें सुधार करने के लिए से कम रिज़ॉल्यूशन में इमेज कैप्चर की जाती हैं, लेकिन यह ज़रूरी है कि इनपुट इमेज का ज़्यादातर हिस्सा बारकोड से होता है. यह भी देखें रीयल-टाइम में परफ़ॉर्मेंस को बेहतर बनाने के लिए सलाह.

1. बारकोड डिटेक्टर को कॉन्फ़िगर करें

अगर आपको पता है कि आपको किस बारकोड फ़ॉर्मैट में पढ़ने की उम्मीद है, तो इसकी स्पीड बढ़ाई जा सकती है सुविधा को इस्तेमाल करने के लिए, उसे सिर्फ़ उन फ़ॉर्मैट की पहचान करने के लिए कॉन्फ़िगर किया जाता है.

उदाहरण के लिए, केवल Aztec कोड और क्यूआर कोड का पता लगाने के लिए, VisionBarcodeDetectorOptions ऑब्जेक्ट ऐसा है नीचे दिया गया उदाहरण:

Swift

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

ये फ़ॉर्मैट इस्तेमाल किए जा सकते हैं:

  • कोड128
  • कोड39
  • कोड93
  • कोडाबार
  • ईएएन13
  • ईएएन8
  • ITF
  • UPCA
  • UPCE
  • क्यूआर कोड
  • PDF417
  • एज़्टेक
  • डेटामैट्रिक्स

Objective-C

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

ये फ़ॉर्मैट इस्तेमाल किए जा सकते हैं:

  • कोड 128 (FIRVisionBarcodeFormatCode128)
  • कोड 39 (FIRVisionBarcodeFormatCode39)
  • कोड 93 (FIRVisionBarcodeFormatCode93)
  • कोडाबार (FIRVisionBarcodeFormatCodaBar)
  • EAN-13 (FIRVisionBarcodeFormatEAN13)
  • EAN-8 (FIRVisionBarcodeFormatEAN8)
  • आईटीएफ़ (FIRVisionBarcodeFormatITF)
  • यूपीसी-ए (FIRVisionBarcodeFormatUPCA)
  • यूपीसी-ई (FIRVisionBarcodeFormatUPCE)
  • क्यूआर कोड (FIRVisionBarcodeFormatQRCode)
  • PDF417 (FIRVisionBarcodeFormatPDF417)
  • ऐज़टेक (FIRVisionBarcodeFormatAztec)
  • डेटा मैट्रिक्स (FIRVisionBarcodeFormatDataMatrix)

2. बारकोड डिटेक्टर चलाएं

किसी इमेज में बारकोड स्कैन करने के लिए, इमेज को UIImage या CMSampleBufferRef से VisionBarcodeDetector के detect(in:) के लिए तरीका:

  1. VisionBarcodeDetector का इंस्टेंस पाएं:

    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. एक VisionImage ऑब्जेक्ट को UIImage या CMSampleBufferRef.

    UIImage का इस्तेमाल करने के लिए:

    1. अगर ज़रूरी हो, तो इमेज को घुमाएं, ताकि इसकी imageOrientation प्रॉपर्टी .up है.
    2. स्क्रीन की दिशा को सही तरीके से घुमाने के लिए, VisionImage ऑब्जेक्ट बनाएं UIImage. कोई भी रोटेशन मेटाडेटा तय न करें—डिफ़ॉल्ट .topLeft वैल्यू का इस्तेमाल करना ज़रूरी है.

      Swift

      let image = VisionImage(image: uiImage)

      Objective-C

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

    CMSampleBufferRef का इस्तेमाल करने के लिए:

    1. एक VisionImageMetadata ऑब्जेक्ट बनाएं, जो में शामिल इमेज डेटा का ओरिएंटेशन CMSampleBufferRef बफ़र.

      इमेज का ओरिएंटेशन पाने के लिए:

      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;
        }
      }

      इसके बाद, मेटाडेटा ऑब्जेक्ट बनाएं:

      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. VisionImage ऑब्जेक्ट बनाने के लिए, CMSampleBufferRef ऑब्जेक्ट और रोटेशन मेटाडेटा:

      Swift

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

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. इसके बाद, detect(in:) तरीके से इमेज पास करें:

    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. बारकोड से जानकारी पाएं

अगर बारकोड की पहचान करने वाली कार्रवाई सफल होती है, तो डिटेक्टर VisionBarcode ऑब्जेक्ट. हर VisionBarcode ऑब्जेक्ट बारकोड जो इमेज में मिला था. प्रत्येक बारकोड के लिए, आप उसे इनपुट इमेज में बाउंडिंग कोऑर्डिनेट हैं, और साथ ही रॉ डेटा को बारकोड. साथ ही, अगर बारकोड डिटेक्टर यह पता लगा पाए कि डेटा किस तरह का है बारकोड से कोड में बदलने पर, आपको पार्स किया गया डेटा वाला ऑब्जेक्ट मिल सकता है.

उदाहरण के लिए:

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;
   }
 }

रीयल-टाइम परफ़ॉर्मेंस को बेहतर बनाने के लिए सलाह

अगर आपको रीयल-टाइम ऐप्लिकेशन में बारकोड स्कैन करना है, तो इन निर्देशों का पालन करें सबसे सही फ़्रेमरेट हासिल करने के लिए दिशा-निर्देश:

  • कैमरे के मूल रिज़ॉल्यूशन पर इनपुट कैप्चर न करें. कुछ डिवाइसों पर, स्थानीय रिज़ॉल्यूशन में इनपुट कैप्चर करने से बहुत बड़ी (10+ मेगापिक्सल) इमेज शामिल होती हैं, जिनके कारण इंतज़ार का समय बहुत खराब हो जाता है. साथ ही, इससे कोई फ़ायदा नहीं होता कितना सटीक है. इसके बजाय, कैमरे से सिर्फ़ उस साइज़ का अनुरोध करें जो ज़रूरी है बारकोड का पता लगाने के लिए: आम तौर पर 2 मेगापिक्सल से ज़्यादा नहीं.

    नाम कैप्चर करने वाले सेशन के प्रीसेट—AVCaptureSessionPresetDefault, AVCaptureSessionPresetLow, AVCaptureSessionPresetMedium, —हालांकि, उनका सुझाव नहीं दिया जाता, क्योंकि वे मैप कर सकते हैं कुछ डिवाइसों पर गलत रिज़ॉल्यूशन. इसके बजाय, खास प्रीसेट का इस्तेमाल करें जैसे कि AVCaptureSessionPreset1280x720.

    अगर स्कैन करने की स्पीड ज़रूरी है, तो इमेज कैप्चर करने की प्रोसेस को और कम किया जा सकता है का रिज़ॉल्यूशन. हालांकि, बारकोड के लिए कम से कम साइज़ की शर्तों का ध्यान रखें ऊपर बताया गया है.

  • डिटेक्टर को कॉल थ्रॉटल करें. अगर कोई नया वीडियो फ़्रेम डिटेक्टर के चलने के दौरान उपलब्ध होने पर, फ़्रेम छोड़ें.
  • अगर ग्राफ़िक को ओवरले करने के लिए, डिटेक्टर के आउटपुट का इस्तेमाल किया जा रहा है इनपुट इमेज को चुनने के बाद, पहले एमएल किट से नतीजा पाएं. इसके बाद, इमेज को रेंडर करें और ओवरले को एक ही चरण में पूरा करें. ऐसा करके, डिसप्ले सरफ़ेस पर रेंडर हो जाता है हर इनपुट फ़्रेम के लिए सिर्फ़ एक बार. previewOverlayView देखें और FIRDetectionOverlayView उदाहरण के लिए शोकेस सैंपल ऐप्लिकेशन में क्लास.