আপনি বারকোড চিনতে এবং ডিকোড করতে ML কিট ব্যবহার করতে পারেন।
আপনি শুরু করার আগে
- আপনি যদি ইতিমধ্যে আপনার অ্যাপে Firebase যোগ না করে থাকেন, তাহলে শুরু করার নির্দেশিকাতে দেওয়া ধাপগুলি অনুসরণ করে তা করুন৷
- আপনার পডফাইলে এমএল কিট লাইব্রেরি অন্তর্ভুক্ত করুন:
pod 'Firebase/MLVision' pod 'Firebase/MLVisionBarcodeModel'
আপনি আপনার প্রোজেক্টের পড ইনস্টল বা আপডেট করার পরে, আপনার Xcode প্রোজেক্ট এর.xcworkspace
ব্যবহার করে খুলতে ভুলবেন না। - আপনার অ্যাপে, Firebase আমদানি করুন:
সুইফট
import Firebase
উদ্দেশ্য-C
@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
- অ্যাজটেক
- ডেটাম্যাট্রিক্স
উদ্দেশ্য-C
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:)
পদ্ধতিতে পাস করুন:-
VisionBarcodeDetector
এর একটি উদাহরণ পান:সুইফট
lazy var vision = Vision.vision() let barcodeDetector = vision.barcodeDetector(options: barcodeOptions)
উদ্দেশ্য-C
FIRVision *vision = [FIRVision vision]; FIRVisionBarcodeDetector *barcodeDetector = [vision barcodeDetector]; // Or, to change the default settings: // FIRVisionBarcodeDetector *barcodeDetector = // [vision barcodeDetectorWithOptions:options];
একটি
UIImage
বা একটিCMSampleBufferRef
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন।একটি
UIImage
ব্যবহার করতে:- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
imageOrientation
বৈশিষ্ট্য.up
হয়। - সঠিকভাবে ঘোরানো
UIImage
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন। কোনো ঘূর্ণন মেটাডেটা নির্দিষ্ট করবেন না—ডিফল্ট মান,.topLeft
, ব্যবহার করতে হবে।সুইফট
let image = VisionImage(image: uiImage)
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
একটি
CMSampleBufferRef
ব্যবহার করতে:একটি
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 } }
উদ্দেশ্য-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; } }
তারপর, মেটাডেটা অবজেক্ট তৈরি করুন:
সুইফট
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
উদ্দেশ্য-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];
-
CMSampleBufferRef
অবজেক্ট এবং রোটেশন মেটাডেটা ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন:সুইফট
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
- তারপরে, চিত্রটিকে
detect(in:)
পদ্ধতিতে পাস করুন:সুইফট
barcodeDetector.detect(in: visionImage) { features, error in guard error == nil, let features = features, !features.isEmpty else { // ... return } // ... }
উদ্দেশ্য-C
[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 } }
উদ্দেশ্য-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
।যদি স্ক্যানিং গতি গুরুত্বপূর্ণ হয়, আপনি চিত্র ক্যাপচার রেজোলিউশন আরও কম করতে পারেন। যাইহোক, উপরে বর্ণিত ন্যূনতম বারকোড আকারের প্রয়োজনীয়তাগুলি মনে রাখবেন।
- থ্রটল ডিটেক্টর কল. ডিটেক্টর চলাকালীন একটি নতুন ভিডিও ফ্রেম উপলব্ধ হলে, ফ্রেমটি ফেলে দিন।
- আপনি যদি ইনপুট ইমেজে গ্রাফিক্স ওভারলে করার জন্য ডিটেক্টরের আউটপুট ব্যবহার করেন, তাহলে প্রথমে ML Kit থেকে ফলাফল পান, তারপর একটি একক ধাপে চিত্র এবং ওভারলে রেন্ডার করুন। এটি করার মাধ্যমে, আপনি প্রতিটি ইনপুট ফ্রেমের জন্য শুধুমাত্র একবার প্রদর্শন পৃষ্ঠে রেন্ডার করবেন। উদাহরণের জন্য শোকেস নমুনা অ্যাপে প্রিভিউওভারলেভিউ এবং FIRDetectionOverlayView ক্লাসগুলি দেখুন।
আপনি বারকোড চিনতে এবং ডিকোড করতে ML কিট ব্যবহার করতে পারেন।
আপনি শুরু করার আগে
- আপনি যদি ইতিমধ্যে আপনার অ্যাপে Firebase যোগ না করে থাকেন, তাহলে শুরু করার নির্দেশিকাতে দেওয়া ধাপগুলি অনুসরণ করে তা করুন৷
- আপনার পডফাইলে এমএল কিট লাইব্রেরি অন্তর্ভুক্ত করুন:
pod 'Firebase/MLVision' pod 'Firebase/MLVisionBarcodeModel'
আপনি আপনার প্রোজেক্টের পড ইনস্টল বা আপডেট করার পরে, আপনার Xcode প্রোজেক্ট এর.xcworkspace
ব্যবহার করে খুলতে ভুলবেন না। - আপনার অ্যাপে, Firebase আমদানি করুন:
সুইফট
import Firebase
উদ্দেশ্য-C
@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
- অ্যাজটেক
- ডেটাম্যাট্রিক্স
উদ্দেশ্য-C
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:)
পদ্ধতিতে পাস করুন:-
VisionBarcodeDetector
এর একটি উদাহরণ পান:সুইফট
lazy var vision = Vision.vision() let barcodeDetector = vision.barcodeDetector(options: barcodeOptions)
উদ্দেশ্য-C
FIRVision *vision = [FIRVision vision]; FIRVisionBarcodeDetector *barcodeDetector = [vision barcodeDetector]; // Or, to change the default settings: // FIRVisionBarcodeDetector *barcodeDetector = // [vision barcodeDetectorWithOptions:options];
একটি
UIImage
বা একটিCMSampleBufferRef
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন।একটি
UIImage
ব্যবহার করতে:- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
imageOrientation
বৈশিষ্ট্য.up
হয়। - সঠিকভাবে ঘোরানো
UIImage
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন। কোনো ঘূর্ণন মেটাডেটা নির্দিষ্ট করবেন না—ডিফল্ট মান,.topLeft
, ব্যবহার করতে হবে।সুইফট
let image = VisionImage(image: uiImage)
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
একটি
CMSampleBufferRef
ব্যবহার করতে:একটি
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 } }
উদ্দেশ্য-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; } }
তারপর, মেটাডেটা অবজেক্ট তৈরি করুন:
সুইফট
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
উদ্দেশ্য-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];
-
CMSampleBufferRef
অবজেক্ট এবং রোটেশন মেটাডেটা ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন:সুইফট
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
- তারপরে, চিত্রটিকে
detect(in:)
পদ্ধতিতে পাস করুন:সুইফট
barcodeDetector.detect(in: visionImage) { features, error in guard error == nil, let features = features, !features.isEmpty else { // ... return } // ... }
উদ্দেশ্য-C
[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 } }
উদ্দেশ্য-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
।যদি স্ক্যানিং গতি গুরুত্বপূর্ণ হয়, আপনি চিত্র ক্যাপচার রেজোলিউশন আরও কম করতে পারেন। যাইহোক, উপরে বর্ণিত ন্যূনতম বারকোড আকারের প্রয়োজনীয়তাগুলি মনে রাখবেন।
- থ্রটল ডিটেক্টর কল. ডিটেক্টর চলাকালীন একটি নতুন ভিডিও ফ্রেম উপলব্ধ হলে, ফ্রেমটি ফেলে দিন।
- আপনি যদি ইনপুট ইমেজে গ্রাফিক্স ওভারলে করার জন্য ডিটেক্টরের আউটপুট ব্যবহার করেন, তাহলে প্রথমে ML Kit থেকে ফলাফল পান, তারপর একটি একক ধাপে চিত্র এবং ওভারলে রেন্ডার করুন। এটি করার মাধ্যমে, আপনি প্রতিটি ইনপুট ফ্রেমের জন্য শুধুমাত্র একবার প্রদর্শন পৃষ্ঠে রেন্ডার করবেন। উদাহরণের জন্য শোকেস নমুনা অ্যাপে প্রিভিউওভারলেভিউ এবং FIRDetectionOverlayView ক্লাসগুলি দেখুন।
আপনি বারকোড চিনতে এবং ডিকোড করতে ML কিট ব্যবহার করতে পারেন।
আপনি শুরু করার আগে
- আপনি যদি ইতিমধ্যে আপনার অ্যাপে Firebase যোগ না করে থাকেন, তাহলে শুরু করার নির্দেশিকাতে দেওয়া ধাপগুলি অনুসরণ করে তা করুন৷
- আপনার পডফাইলে এমএল কিট লাইব্রেরি অন্তর্ভুক্ত করুন:
pod 'Firebase/MLVision' pod 'Firebase/MLVisionBarcodeModel'
আপনি আপনার প্রোজেক্টের পড ইনস্টল বা আপডেট করার পরে, আপনার Xcode প্রোজেক্ট এর.xcworkspace
ব্যবহার করে খুলতে ভুলবেন না। - আপনার অ্যাপে, Firebase আমদানি করুন:
সুইফট
import Firebase
উদ্দেশ্য-C
@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
- অ্যাজটেক
- ডেটাম্যাট্রিক্স
উদ্দেশ্য-C
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:)
পদ্ধতিতে পাস করুন:-
VisionBarcodeDetector
এর একটি উদাহরণ পান:সুইফট
lazy var vision = Vision.vision() let barcodeDetector = vision.barcodeDetector(options: barcodeOptions)
উদ্দেশ্য-C
FIRVision *vision = [FIRVision vision]; FIRVisionBarcodeDetector *barcodeDetector = [vision barcodeDetector]; // Or, to change the default settings: // FIRVisionBarcodeDetector *barcodeDetector = // [vision barcodeDetectorWithOptions:options];
একটি
UIImage
বা একটিCMSampleBufferRef
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন।একটি
UIImage
ব্যবহার করতে:- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
imageOrientation
বৈশিষ্ট্য.up
হয়। - সঠিকভাবে ঘোরানো
UIImage
ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন। কোনো ঘূর্ণন মেটাডেটা নির্দিষ্ট করবেন না—ডিফল্ট মান,.topLeft
, ব্যবহার করতে হবে।সুইফট
let image = VisionImage(image: uiImage)
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
একটি
CMSampleBufferRef
ব্যবহার করতে:একটি
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 } }
উদ্দেশ্য-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; } }
তারপর, মেটাডেটা অবজেক্ট তৈরি করুন:
সুইফট
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
উদ্দেশ্য-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];
-
CMSampleBufferRef
অবজেক্ট এবং রোটেশন মেটাডেটা ব্যবহার করে একটিVisionImage
অবজেক্ট তৈরি করুন:সুইফট
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
উদ্দেশ্য-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- প্রয়োজনে, চিত্রটিকে ঘোরান যাতে এটির
- তারপরে, চিত্রটিকে
detect(in:)
পদ্ধতিতে পাস করুন:সুইফট
barcodeDetector.detect(in: visionImage) { features, error in guard error == nil, let features = features, !features.isEmpty else { // ... return } // ... }
উদ্দেশ্য-C
[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 } }
উদ্দেশ্য-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
।যদি স্ক্যানিং গতি গুরুত্বপূর্ণ হয়, আপনি চিত্র ক্যাপচার রেজোলিউশন আরও কম করতে পারেন। যাইহোক, উপরে বর্ণিত ন্যূনতম বারকোড আকারের প্রয়োজনীয়তাগুলি মনে রাখবেন।
- থ্রটল ডিটেক্টর কল. ডিটেক্টর চলাকালীন একটি নতুন ভিডিও ফ্রেম উপলব্ধ হলে, ফ্রেমটি ফেলে দিন।
- আপনি যদি ইনপুট ইমেজে গ্রাফিক্স ওভারলে করার জন্য ডিটেক্টরের আউটপুট ব্যবহার করেন, তাহলে প্রথমে ML Kit থেকে ফলাফল পান, তারপর একটি একক ধাপে চিত্র এবং ওভারলে রেন্ডার করুন। এটি করার মাধ্যমে, আপনি প্রতিটি ইনপুট ফ্রেমের জন্য শুধুমাত্র একবার প্রদর্শন পৃষ্ঠে রেন্ডার করবেন। উদাহরণের জন্য শোকেস নমুনা অ্যাপে প্রিভিউওভারলেভিউ এবং FIRDetectionOverlayView ক্লাসগুলি দেখুন।