आप बारकोड को पहचानने और डिकोड करने के लिए एमएल किट का उपयोग कर सकते हैं।
शुरू करने से पहले
- यदि आपने पहले से ही अपने ऐप में फायरबेस नहीं जोड़ा है, तो आरंभ करने की मार्गदर्शिका में दिए गए चरणों का पालन करके ऐसा करें।
- अपने पॉडफाइल में एमएल किट लाइब्रेरी शामिल करें:
pod 'Firebase/MLVision' pod 'Firebase/MLVisionBarcodeModel'
अपने प्रोजेक्ट के पॉड इंस्टॉल या अपडेट करने के बाद, अपने Xcode प्रोजेक्ट को इसके.xcworkspace
का उपयोग करके खोलना सुनिश्चित करें। - अपने ऐप में, फ़ायरबेस आयात करें:
तीव्र
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:)
विधि में पास करें:-
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];
UIImage
याCMSampleBufferRef
उपयोग करके एकVisionImage
ऑब्जेक्ट बनाएं।UIImage
उपयोग करने के लिए:- यदि आवश्यक हो, तो छवि को घुमाएँ ताकि उसकी
imageOrientation
गुण.up
हो। - सही ढंग से घुमाए गए
UIImage
उपयोग करके एकVisionImage
ऑब्जेक्ट बनाएं। कोई रोटेशन मेटाडेटा निर्दिष्ट न करें—डिफ़ॉल्ट मान,.topLeft
, का उपयोग किया जाना चाहिए।तीव्र
let image = VisionImage(image: uiImage)
उद्देश्य सी
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 } }
उद्देश्य सी
- (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];
-
CMSampleBufferRef
ऑब्जेक्ट और रोटेशन मेटाडेटा का उपयोग करके एकVisionImage
ऑब्जेक्ट बनाएं:तीव्र
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
उद्देश्य सी
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 } // ... }
उद्देश्य सी
[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
जैसे विशिष्ट प्रीसेट का उपयोग करें।यदि स्कैनिंग गति महत्वपूर्ण है, तो आप छवि कैप्चर रिज़ॉल्यूशन को और कम कर सकते हैं। हालाँकि, ऊपर उल्लिखित न्यूनतम बारकोड आकार आवश्यकताओं को ध्यान में रखें।
- थ्रॉटल डिटेक्टर को कॉल करता है। यदि डिटेक्टर के चलने के दौरान कोई नया वीडियो फ़्रेम उपलब्ध हो जाता है, तो फ़्रेम को छोड़ दें।
- यदि आप इनपुट छवि पर ग्राफिक्स को ओवरले करने के लिए डिटेक्टर के आउटपुट का उपयोग कर रहे हैं, तो पहले एमएल किट से परिणाम प्राप्त करें, फिर छवि को प्रस्तुत करें और एक ही चरण में ओवरले करें। ऐसा करने से, आप प्रत्येक इनपुट फ़्रेम के लिए केवल एक बार डिस्प्ले सतह पर रेंडर करते हैं। उदाहरण के लिए शोकेस नमूना ऐप में पूर्वावलोकनओवरलेव्यू और एफआईआरडिटेक्शनओवरलेव्यू कक्षाएं देखें।