बारकोड को पहचानने और उसे डिकोड करने के लिए, ML Kit का इस्तेमाल किया जा सकता है.
इसे आज़माएं
- सैंपल वाले ऐप्लिकेशन को इस्तेमाल करके देखें, इस एपीआई के इस्तेमाल का एक उदाहरण देखें.
शुरू करने से पहले
- अपनी Podfile में, नीचे दिए गए ML Kit पॉड शामिल करें:
pod 'GoogleMLKit/BarcodeScanning', '3.2.0'
- अपने प्रोजेक्ट के 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 देखें उदाहरण के लिए, एमएल किट क्विकस्टार्ट सैंपल में.