बारकोड को पहचानने और उसे डिकोड करने के लिए, ML Kit का इस्तेमाल किया जा सकता है.
शुरू करने से पहले
- अगर आपने पहले से अपने ऐप्लिकेशन में Firebase नहीं जोड़ा है, तो ऐसा करने के लिए शुरुआती निर्देश में दिए गए चरणों को पूरा करें.
- अपनी Podfile में ML Kit लाइब्रेरी शामिल करें:
प्रोजेक्ट के Pods को इंस्टॉल या अपडेट करने के बाद, अपना Xcode ज़रूर खोलें प्रोजेक्ट कोpod 'Firebase/MLVision' pod 'Firebase/MLVisionBarcodeModel'
.xcworkspace
का इस्तेमाल करके बनाया गया है. - अपने ऐप्लिकेशन में 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:)
के लिए
तरीका:
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];
-
एक
VisionImage
ऑब्जेक्ट कोUIImage
याCMSampleBufferRef
.UIImage
का इस्तेमाल करने के लिए:- अगर ज़रूरी हो, तो इमेज को घुमाएं, ताकि इसकी
imageOrientation
प्रॉपर्टी.up
है. - स्क्रीन की दिशा को सही तरीके से घुमाने के लिए,
VisionImage
ऑब्जेक्ट बनाएंUIImage
. कोई भी रोटेशन मेटाडेटा तय न करें—डिफ़ॉल्ट.topLeft
वैल्यू का इस्तेमाल करना ज़रूरी है.Swift
let image = VisionImage(image: uiImage)
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
CMSampleBufferRef
का इस्तेमाल करने के लिए:-
एक
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];
VisionImage
ऑब्जेक्ट बनाने के लिए,CMSampleBufferRef
ऑब्जेक्ट और रोटेशन मेटाडेटा:Swift
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- अगर ज़रूरी हो, तो इमेज को घुमाएं, ताकि इसकी
-
इसके बाद,
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 उदाहरण के लिए शोकेस सैंपल ऐप्लिकेशन में क्लास.