iOS पर ML Kit की मदद से बारकोड स्कैन करें

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

इसे आज़माएं

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

  1. अपनी Podfile में, नीचे दिए गए ML Kit पॉड शामिल करें:
    pod 'GoogleMLKit/BarcodeScanning', '3.2.0'
    
  2. अपने प्रोजेक्ट के Pods को इंस्टॉल या अपडेट करने के बाद, इसके .xcworkspace. ML Kit, Xcode के 12.4 या इसके बाद के वर्शन पर काम करता है.

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

  • 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 कोड और क्यूआर कोड स्कैन करने के लिए, BarcodeScannerOptions ऑब्जेक्ट ऐसा है नीचे दिया गया उदाहरण:

Swift

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

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

  • code128
  • code39
  • code93
  • codaBar
  • dataMatrix
  • EAN13
  • EAN8
  • ITF
  • qrCode
  • UPCA
  • UPCE
  • PDF417
  • Aztec

Objective-C

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

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

  • कोड-128 (MLKBarcodeFormatCode128)
  • कोड-39 (MLKBarcodeFormatCode39)
  • कोड-93 (MLKBarcodeFormatCode93)
  • कोडाबार (MLKBarcodeFormatCodaBar)
  • डेटा मैट्रिक्स (MLKBarcodeFormatDataMatrix)
  • EAN-13 (MLKBarcodeFormatEAN13)
  • EAN-8 (MLKBarcodeFormatEAN8)
  • आईटीएफ़ (MLKBarcodeFormatITF)
  • क्यूआर कोड (MLKBarcodeFormatQRCode)
  • यूपीसी-ए (MLKBarcodeFormatUPCA)
  • यूपीसी-ई (MLKBarcodeFormatUPCE)
  • PDF-417 (MLKBarcodeFormatPDF417)
  • Aztec कोड (MLKBarcodeFormatAztec)

2. इनपुट इमेज तैयार करें

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

एक VisionImage ऑब्जेक्ट को UIImage या CMSampleBuffer.

अगर UIImage का इस्तेमाल किया जाता है, तो यह तरीका अपनाएं:

  • UIImage के साथ एक VisionImage ऑब्जेक्ट बनाएं. पक्का करें कि आपने सही .orientation तय किया हो.

    Swift

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

    Objective-C

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

अगर CMSampleBuffer का इस्तेमाल किया जाता है, तो यह तरीका अपनाएं:

  • इसमें शामिल इमेज डेटा का ओरिएंटेशन तय करें CMSampleBuffer.

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

    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;
      }
    }
          
  • इसका इस्तेमाल करके एक VisionImage ऑब्जेक्ट बनाएं CMSampleBuffer ऑब्जेक्ट और ओरिएंटेशन:

    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 का इंस्टेंस पाएं

BarcodeScanner का इंस्टेंस पाएं:

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. इमेज प्रोसेस करें

इसके बाद, process() तरीके से इमेज पास करें:

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

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

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

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

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

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

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

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

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

    अगर आपको स्ट्रीमिंग के किसी क्रम के बारकोड की पहचान करने की कोशिश करनी है वीडियो फ़्रेम सेट अप करने के लिए, आइडेंटिफ़ायर फ़्रेम से लेकर फ़्रेम. आपको तब तक इंतज़ार करना चाहिए, जब तक आपको एक ही सीरीज़ की लगातार एक सीरीज़ न मिले ताकि यह भरोसा रहे कि आप अच्छा परिणाम वापस दे रहे हैं.

    चेकसम अंक, ITF और CODE-39 के लिए समर्थित नहीं है.

  • वीडियो फ़्रेम प्रोसेस करने के लिए, डिटेक्टर के results(in:) सिंक्रोनस एपीआई का इस्तेमाल करें. कॉल करें AVCaptureVideoDataOutputSampleBufferDelegate का captureOutput(_, didOutput:from:) फ़ंक्शन का इस्तेमाल, दिए गए वीडियो से सिंक्रोनस रूप से नतीजे पाने के लिए किया जाता है फ़्रेम. रखें AVCaptureVideoDataOutput का डिटेक्टर को कॉल थ्रॉटल करने के लिए, alwaysDiscardsLateVideoFrames को true के तौर पर सबमिट किया है. अगर नए डिटेक्टर के चलने के दौरान वीडियो फ़्रेम उपलब्ध हो जाता है. उसे छोड़ दिया जाएगा.
  • अगर ग्राफ़िक ओवरले करने के लिए डिटेक्टर के आउटपुट का इस्तेमाल किया जाता है, तो इनपुट इमेज को चुनने के बाद, पहले एमएल किट से नतीजा पाएं. इसके बाद, इमेज को रेंडर करें और ओवरले को एक ही चरण में पूरा करें. ऐसा करके, डिसप्ले सरफ़ेस पर रेंडर हो जाता है प्रोसेस किए गए हर इनपुट फ़्रेम के लिए, सिर्फ़ एक बार. updatePreviewOverlayViewWithLastFrame देखें उदाहरण के लिए, एमएल किट क्विकस्टार्ट सैंपल में.