Barkodları tanımak ve kodunu çözmek için ML Kit'i kullanabilirsiniz.
Başlamadan önce
- Firebase'i uygulamanıza henüz eklemediyseniz başlangıç kılavuzundaki adımlara bakın.
- ML Kit kitaplıklarını Podfile'ınıza ekleyin:
Projenizin kapsüllerini yükledikten veya güncelledikten sonra Xcodepod 'Firebase/MLVision' pod 'Firebase/MLVisionBarcodeModel'
.xcworkspace
kullanarak projenize dahil olabilir. - Uygulamanızda Firebase'i içe aktarın:
Swift
import Firebase
Objective-C
@import Firebase;
Giriş resmi kuralları
-
ML Kit'in barkodları doğru okuyabilmesi için giriş resimlerinde yeterli piksel verisiyle temsil edilen barkodlar.
Belirli piksel verisi gereksinimleri hem ve kodlanan veri miktarıdır (çünkü çoğu barkod farklı uzunluklarda yükü desteklemeleri gerekir). Genellikle anlamlı olan en küçük barkodun birimi en az 2 piksel genişliğinde (ve 2 boyutlu kodlar, 2 piksel yüksekliğinde).
Örneğin, EAN-13 barkodları çubuklar ile boşluklardan oluşur. Bu boşlukların sayısı 1, 2, 3 veya 4 birim genişliğinde olduğundan EAN-13 barkod görüntüsünde ideal olarak çubuklar ve en az 2, 4, 6 ve 8 piksel genişliğinde boşluklar. Çünkü EAN-13 barkod toplam 95 birim genişliğinde, barkod en az 190 olmalıdır piksel genişliğinde.
PDF417 gibi daha yoğun biçimler için güvenli okumasını sağlayın. Örneğin, bir PDF417 kodunda en fazla 34 17 birim genişliğinde "kelimeler" bir satır olacak şekilde ekleyebilirsiniz. Bu, tercihen 1156 piksel genişliğinde.
-
Zayıf resim odağı, tarama doğruluğunu olumsuz etkileyebilir. Bu kabul edilebilir sonuçlar almak için kullanıcıdan resmi yeniden çekmesini istemeyi deneyin.
-
Tipik uygulamalarda, daha yüksek bir Barkod üreten çözünürlüklü resim (1280x720 veya 1920x1080 gibi) kameradan daha uzak bir mesafeden algılanabilir.
Ancak gecikmenin kritik olduğu uygulamalarda daha iyi daha düşük çözünürlükte çekerek daha iyi performans giriş resminin büyük kısmını barkod oluşturur. Şunlara da bakabilirsiniz: Gerçek zamanlı performansı iyileştirmeye yönelik ipuçları.
1. Barkod dedektörünü yapılandırma
Hangi barkod biçimlerini okumayı beklediğinizi bilirseniz hızı artırabilirsiniz otomatik olarak devre dışı bırakabilirsiniz.Örneğin, yalnızca Aztek kodunu ve QR kodlarını algılamak için bir
Şu anki VisionBarcodeDetectorOptions
nesnesi
şu örneği inceleyin:
Swift
let format = VisionBarcodeFormat.all let barcodeOptions = VisionBarcodeDetectorOptions(formats: format)
Aşağıdaki biçimler desteklenir:
- Kod 128
- Kod 39
- Kod 93
- CodaBar Dili
- EAN13
- EAN8
- ITF
- UPCA
- UPCE
- QR Kodu
- PDF417
- Aztek
- Veri Matrisi
Objective-C
FIRVisionBarcodeDetectorOptions *options = [[FIRVisionBarcodeDetectorOptions alloc] initWithFormats: FIRVisionBarcodeFormatQRCode | FIRVisionBarcodeFormatAztec];
Aşağıdaki biçimler desteklenir:
- Kod 128 (
FIRVisionBarcodeFormatCode128
) - Kod 39 (
FIRVisionBarcodeFormatCode39
) - Kod 93 (
FIRVisionBarcodeFormatCode93
) - Kodabar (
FIRVisionBarcodeFormatCodaBar
) - EAN-13 (
FIRVisionBarcodeFormatEAN13
) - EAN-8 (
FIRVisionBarcodeFormatEAN8
) - ITF (
FIRVisionBarcodeFormatITF
) - UPC-A (
FIRVisionBarcodeFormatUPCA
) - UPC-E (
FIRVisionBarcodeFormatUPCE
) - QR Kodu (
FIRVisionBarcodeFormatQRCode
) - PDF417 (
FIRVisionBarcodeFormatPDF417
) - Aztek (
FIRVisionBarcodeFormatAztec
) - Veri Matrisi (
FIRVisionBarcodeFormatDataMatrix
)
2. Barkod dedektörünü çalıştırın
Bir resimdeki barkodları taramak için resmiUIImage
veya
CMSampleBufferRef
- VisionBarcodeDetector
detect(in:)
yöntem:
VisionBarcodeDetector
öğesinin bir örneğini alın: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];
-
Bir
VisionImage
nesnesi oluşturmak içinUIImage
veyaCMSampleBufferRef
.UIImage
kullanmak için:- Gerekirse resmi,
imageOrientation
özellik değeri.up
. - Doğru şekilde döndürülen öğeyi kullanarak bir
VisionImage
nesnesi oluşturunUIImage
. Herhangi bir rotasyon meta verisi belirtme (varsayılan) değeri (.topLeft
) kullanılmalıdır.Swift
let image = VisionImage(image: uiImage)
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
CMSampleBufferRef
kullanmak için:-
Aşağıdakini belirten bir
VisionImageMetadata
nesnesi oluşturun: içerdiği resim verilerinin yönüCMSampleBufferRef
arabellek.Resmin yönünü öğrenmek için:
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; } }
Ardından meta veri nesnesini oluşturun:
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];
- Şunu kullanarak bir
VisionImage
nesnesi oluşturun:CMSampleBufferRef
nesnesi ve rotasyon meta verileri:Swift
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- Gerekirse resmi,
-
Ardından resmi
detect(in:)
yöntemine iletin: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. Barkodlardan bilgi al
Barkod tanıma işlemi başarılı olursa algılayıcı,VisionBarcode
nesne algılandı. Her VisionBarcode
nesnesi bir
barkodu kullanabilirsiniz. Her barkod için
giriş görüntüsündeki sınırlayıcı koordinatların yanı sıra
barkodu görürsünüz. Ayrıca, barkod dedektörü veri türünü
tarafından kodlanırsa ayrıştırılmış veri içeren bir nesne alabilirsiniz.
Örneğin:
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; } }
Gerçek zamanlı performansı iyileştirmeye yönelik ipuçları
Barkodları gerçek zamanlı bir uygulamada taramak istiyorsanız aşağıdaki talimatları uygulayın:
-
Girişleri kameranın orijinal çözünürlüğünde yakalamayın. Bazı cihazlarda yerel çözünürlükte giriş yakalamak çok büyük (10+ megapiksel) resimler, hiçbir yararı olmadan çok düşük gecikme emin olun. Bunun yerine, kameradan yalnızca gerekli boyutu isteyin izin verilen ses seviyesidir: Genellikle 2 megapikselden fazla değildir.
Adlandırılmış yakalama oturumu hazır ayarları:
AVCaptureSessionPresetDefault
,AVCaptureSessionPresetLow
AVCaptureSessionPresetMedium
, gibi) kullanılması önerilmez. Bunun nedeni, bazı cihazlarda uygun olmayan çözünürlükler sunar. Bunun yerine, kullandığınız hazır ayarları kullanarakAVCaptureSessionPreset1280x720
gibi.Tarama hızı önemliyse yakalanan görüntüyü daha da düşürebilirsiniz belirler. Ancak barkodla ilgili minimum boyut gereksinimlerini de göz önünde bulundurun. kontrol edin.
- Algılayıcıya yapılan çağrıları hızlandırın. Yeni bir video karesi kullanılabilir durumdaysa çerçeveyi bırakın.
- Algılayıcının çıkışını üzerine grafik yerleştirmek için kullanıyorsanız giriş görüntüsünü kullanın, önce ML Kit'ten sonucu alın ve ardından görüntüyü oluşturun tek bir adımda yapabilirsiniz. Bu şekilde, öğeleri ekran yüzeyinde her giriş karesi için yalnızca bir kez. Bkz. previewOverlayView ve FIRDetectionOverlayView sınıfları inceleyelim.