आईओएस पर एमएल किट के साथ बारकोड को स्कैन करें

आप बारकोड को पहचानने और डिकोड करने के लिए एमएल किट का उपयोग कर सकते हैं।

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

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

    तीव्र

    import Firebase

    उद्देश्य सी

    @import Firebase;

इनपुट छवि दिशानिर्देश

  • बारकोड को सटीक रूप से पढ़ने के लिए एमएल किट के लिए, इनपुट छवियों में ऐसे बारकोड होने चाहिए जो पर्याप्त पिक्सेल डेटा द्वारा दर्शाए गए हों।

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

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

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

  • खराब छवि फोकस स्कैनिंग सटीकता को नुकसान पहुंचा सकता है। यदि आपको स्वीकार्य परिणाम नहीं मिल रहे हैं, तो उपयोगकर्ता से छवि पुनः प्राप्त करने के लिए कहें।

  • विशिष्ट अनुप्रयोगों के लिए, उच्च रिज़ॉल्यूशन वाली छवि (जैसे 1280x720 या 1920x1080) प्रदान करने की अनुशंसा की जाती है, जो बारकोड को कैमरे से बड़ी दूरी से पता लगाने योग्य बनाती है।

    हालाँकि, उन अनुप्रयोगों में जहां विलंबता महत्वपूर्ण है, आप कम रिज़ॉल्यूशन पर छवियों को कैप्चर करके प्रदर्शन में सुधार कर सकते हैं, लेकिन इसके लिए आवश्यक है कि बारकोड इनपुट छवि का अधिकांश हिस्सा बनाये। वास्तविक समय के प्रदर्शन को बेहतर बनाने के लिए युक्तियाँ भी देखें।

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

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

उदाहरण के लिए, केवल एज़्टेक कोड और क्यूआर कोड का पता लगाने के लिए, निम्नलिखित उदाहरण के अनुसार एक VisionBarcodeDetectorOptions ऑब्जेक्ट बनाएं:

तीव्र

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

निम्नलिखित प्रारूप समर्थित हैं:

  • कोड 128
  • कोड39
  • कोड93
  • कोडाबार
  • EAN13
  • EAN8
  • आईटीएफ
  • यूपीसीए
  • यूपीसीई
  • क्यू आर संहिता
  • पीडीएफ417
  • एज़्टेक
  • डेटा मैट्रिक्स

उद्देश्य सी

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

निम्नलिखित प्रारूप समर्थित हैं:

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

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

किसी छवि में बारकोड को स्कैन करने के लिए, छवि को UIImage या CMSampleBufferRef के रूप में VisionBarcodeDetector के detect(in:) विधि में पास करें:

  1. VisionBarcodeDetector का एक उदाहरण प्राप्त करें:

    तीव्र

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

    उद्देश्य सी

    FIRVision *vision = [FIRVision vision];
    FIRVisionBarcodeDetector *barcodeDetector = [vision barcodeDetector];
    // Or, to change the default settings:
    // FIRVisionBarcodeDetector *barcodeDetector =
    //     [vision barcodeDetectorWithOptions:options];
    
  2. UIImage या CMSampleBufferRef उपयोग करके एक VisionImage ऑब्जेक्ट बनाएं।

    UIImage उपयोग करने के लिए:

    1. यदि आवश्यक हो, तो छवि को घुमाएँ ताकि उसकी imageOrientation गुण .up हो।
    2. सही ढंग से घुमाए गए UIImage उपयोग करके एक VisionImage ऑब्जेक्ट बनाएं। कोई रोटेशन मेटाडेटा निर्दिष्ट न करें—डिफ़ॉल्ट मान, .topLeft , का उपयोग किया जाना चाहिए।

      तीव्र

      let image = VisionImage(image: uiImage)

      उद्देश्य सी

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

    CMSampleBufferRef का उपयोग करने के लिए:

    1. एक VisionImageMetadata ऑब्जेक्ट बनाएं जो CMSampleBufferRef बफर में मौजूद छवि डेटा के ओरिएंटेशन को निर्दिष्ट करता है।

      छवि अभिविन्यास प्राप्त करने के लिए:

      तीव्र

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

      उद्देश्य सी

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

      फिर, मेटाडेटा ऑब्जेक्ट बनाएं:

      तीव्र

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

      उद्देश्य सी

      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. CMSampleBufferRef ऑब्जेक्ट और रोटेशन मेटाडेटा का उपयोग करके एक VisionImage ऑब्जेक्ट बनाएं:

      तीव्र

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

      उद्देश्य सी

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. फिर, छवि को detect(in:) विधि में पास करें:

    तीव्र

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

    उद्देश्य सी

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

3. बारकोड से जानकारी प्राप्त करें

यदि बारकोड पहचान ऑपरेशन सफल होता है, तो डिटेक्टर VisionBarcode ऑब्जेक्ट की एक सरणी लौटाता है। प्रत्येक VisionBarcode ऑब्जेक्ट एक बारकोड का प्रतिनिधित्व करता है जो छवि में पाया गया था। प्रत्येक बारकोड के लिए, आप इनपुट छवि में इसके बाउंडिंग निर्देशांक, साथ ही बारकोड द्वारा एन्कोड किया गया कच्चा डेटा प्राप्त कर सकते हैं। साथ ही, यदि बारकोड डिटेक्टर बारकोड द्वारा एन्कोड किए गए डेटा के प्रकार को निर्धारित करने में सक्षम था, तो आप पार्स किए गए डेटा वाला ऑब्जेक्ट प्राप्त कर सकते हैं।

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

तीव्र

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

उद्देश्य सी

 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 जैसे विशिष्ट प्रीसेट का उपयोग करें।

    यदि स्कैनिंग गति महत्वपूर्ण है, तो आप छवि कैप्चर रिज़ॉल्यूशन को और कम कर सकते हैं। हालाँकि, ऊपर उल्लिखित न्यूनतम बारकोड आकार आवश्यकताओं को ध्यान में रखें।

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