Catch up on highlights from Firebase at Google I/O 2023. Learn more

iOS এ ML কিট দিয়ে বারকোড স্ক্যান করুন

আপনি বারকোড চিনতে এবং ডিকোড করতে ML কিট ব্যবহার করতে পারেন।

তুমি শুরু করার আগে

  1. আপনি যদি ইতিমধ্যে আপনার অ্যাপে Firebase যোগ না করে থাকেন, তাহলে শুরু করার নির্দেশিকাতে দেওয়া ধাপগুলি অনুসরণ করে তা করুন৷
  2. আপনার পডফাইলে ML কিট লাইব্রেরিগুলি অন্তর্ভুক্ত করুন:
    pod 'Firebase/MLVision'
    pod 'Firebase/MLVisionBarcodeModel'
    
    আপনি আপনার প্রকল্পের পডগুলি ইনস্টল বা আপডেট করার পরে, এটির .xcworkspace ব্যবহার করে আপনার Xcode প্রকল্পটি খুলতে ভুলবেন না।
  3. আপনার অ্যাপে, Firebase আমদানি করুন:

    সুইফট

    import Firebase

    উদ্দেশ্য গ

    @import Firebase;

ইনপুট ইমেজ নির্দেশিকা

  • এমএল কিট সঠিকভাবে বারকোড পড়ার জন্য, ইনপুট চিত্রগুলিতে অবশ্যই বারকোড থাকতে হবে যা পর্যাপ্ত পিক্সেল ডেটা দ্বারা উপস্থাপিত হয়।

    নির্দিষ্ট পিক্সেল ডেটা প্রয়োজনীয়তা বারকোডের ধরন এবং এতে এনকোড করা ডেটার পরিমাণ উভয়ের উপর নির্ভর করে (যেহেতু বেশিরভাগ বারকোড একটি পরিবর্তনশীল দৈর্ঘ্যের পেলোড সমর্থন করে)। সাধারণভাবে, বারকোডের ক্ষুদ্রতম অর্থপূর্ণ এককটি কমপক্ষে 2 পিক্সেল চওড়া হওয়া উচিত (এবং 2-মাত্রিক কোডগুলির জন্য, 2 পিক্সেল লম্বা)।

    উদাহরণস্বরূপ, EAN-13 বারকোডগুলি 1, 2, 3, বা 4 ইউনিট প্রশস্ত বার এবং স্পেস দিয়ে তৈরি, তাই একটি EAN-13 বারকোড ছবিতে আদর্শভাবে বার এবং স্পেস রয়েছে যা কমপক্ষে 2, 4, 6, এবং 8 পিক্সেল চওড়া। যেহেতু একটি EAN-13 বারকোড মোট 95 ইউনিট চওড়া, বারকোডটি কমপক্ষে 190 পিক্সেল প্রশস্ত হওয়া উচিত।

    ঘন বিন্যাস, যেমন PDF417, ML Kit এর নির্ভরযোগ্যভাবে পড়ার জন্য তাদের পিক্সেল মাত্রার প্রয়োজন। উদাহরণস্বরূপ, একটি PDF417 কোডে একক সারিতে 34 17-ইউনিট চওড়া "শব্দ" থাকতে পারে, যা আদর্শভাবে কমপক্ষে 1156 পিক্সেল চওড়া হবে।

  • খারাপ ইমেজ ফোকাস স্ক্যানিং নির্ভুলতা ক্ষতি করতে পারে. আপনি যদি গ্রহণযোগ্য ফলাফল না পান, তাহলে ব্যবহারকারীকে ছবিটি পুনরায় ক্যাপচার করতে বলার চেষ্টা করুন।

  • সাধারণ অ্যাপ্লিকেশনগুলির জন্য, এটি একটি উচ্চ রেজোলিউশনের ছবি (যেমন 1280x720 বা 1920x1080) প্রদান করার সুপারিশ করা হয়, যা ক্যামেরা থেকে দূরে একটি বড় দূরত্ব থেকে বারকোড সনাক্তযোগ্য করে তোলে।

    যাইহোক, অ্যাপ্লিকেশানগুলিতে যেখানে লেটেন্সি গুরুত্বপূর্ণ, আপনি কম রেজোলিউশনে চিত্রগুলি ক্যাপচার করে কার্যক্ষমতা উন্নত করতে পারেন, তবে বারকোডটি ইনপুট চিত্রের বেশিরভাগ অংশ তৈরি করতে হবে৷ এছাড়াও রিয়েল-টাইম কর্মক্ষমতা উন্নত করার টিপস দেখুন।

1. বারকোড ডিটেক্টর কনফিগার করুন

আপনি যদি জানেন যে কোন বারকোড বিন্যাসগুলি আপনি পড়তে আশা করেন, আপনি বারকোড ডিটেক্টরের গতি উন্নত করতে পারেন শুধুমাত্র সেই বিন্যাসগুলি সনাক্ত করার জন্য কনফিগার করে।

উদাহরণস্বরূপ, শুধুমাত্র Aztec কোড এবং QR কোড সনাক্ত করতে, নিম্নলিখিত উদাহরণের মত একটি VisionBarcodeDetectorOptions অবজেক্ট তৈরি করুন:

সুইফট

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

নিম্নলিখিত বিন্যাস সমর্থিত:

  • কোড 128
  • কোড39
  • কোড93
  • কোডাবার
  • EAN13
  • EAN8
  • আইটিএফ
  • ইউপিসিএ
  • ইউপিসিই
  • কিউআরকোড
  • PDF417
  • অ্যাজটেক
  • ডেটাম্যাট্রিক্স

উদ্দেশ্য গ

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

নিম্নলিখিত বিন্যাস সমর্থিত:

  • কোড 128 ( FIRVisionBarcodeFormatCode128 )
  • কোড 39 ( FIRVisionBarcodeFormatCode39 )
  • কোড 93 ( FIRVisionBarcodeFormatCode93 )
  • কোডবার ( FIRVisionBarcodeFormatCodaBar )
  • EAN-13 ( FIRVisionBarcodeFormatEAN13 )
  • EAN-8 ( FIRVisionBarcodeFormatEAN8 )
  • ITF ( FIRVisionBarcodeFormatITF )
  • UPC-A ( FIRVisionBarcodeFormatUPCA )
  • UPC-E ( FIRVisionBarcodeFormatUPCE )
  • QR কোড ( FIRVisionBarcodeFormatQRCode )
  • PDF417 ( FIRVisionBarcodeFormatPDF417 )
  • Aztec ( 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. প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির চিত্র .up বৈশিষ্ট্য imageOrientation হয়।
    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

    যদি স্ক্যানিং গতি গুরুত্বপূর্ণ হয়, আপনি চিত্র ক্যাপচার রেজোলিউশন আরও কম করতে পারেন। যাইহোক, উপরে বর্ণিত ন্যূনতম বারকোড আকারের প্রয়োজনীয়তাগুলি মনে রাখবেন।

  • থ্রটল ডিটেক্টর কল. ডিটেক্টর চলাকালীন একটি নতুন ভিডিও ফ্রেম উপলব্ধ হলে, ফ্রেমটি ফেলে দিন।
  • আপনি যদি ইনপুট ইমেজে গ্রাফিক্স ওভারলে করার জন্য ডিটেক্টরের আউটপুট ব্যবহার করেন, তাহলে প্রথমে ML Kit থেকে ফলাফল পান, তারপর একটি একক ধাপে চিত্র এবং ওভারলে রেন্ডার করুন। এটি করার মাধ্যমে, আপনি প্রতিটি ইনপুট ফ্রেমের জন্য শুধুমাত্র একবার প্রদর্শন পৃষ্ঠে রেন্ডার করবেন। উদাহরণের জন্য শোকেস নমুনা অ্যাপে প্রিভিউওভারলেভিউ এবং FIRDetectionOverlayView ক্লাসগুলি দেখুন।