Resimlerdeki veya videolardaki (örneğin, sokak işaretinin metni) metinleri tanımak için ML Kit'i kullanabilirsiniz. Bu özelliğin ana özellikleri şunlardır:
Metin Tanıma API'sı | |
---|---|
Açıklama | Resimlerdeki veya videolardaki Latin alfabesi metnini kullanın. |
SDK adı | GoogleMLKit/TextRecognition (version 2.2.0) |
Uygulama | Öğeler, oluşturma sırasında uygulamanıza statik olarak bağlanır. |
Uygulama boyutu etkisi | Yaklaşık 20 MB |
Performans | Çoğu cihazda gerçek zamanlıdır. |
Deneyin
- Bu API'nin örnek kullanımını görmek için örnek uygulamayla denemeler yapın.
- Kodu codelab ile kendiniz deneyin.
Başlamadan önce
- Aşağıdaki ML Kit kapsüllerini Podfile dosyanıza ekleyin:
pod 'GoogleMLKit/TextRecognition','2.2.0'
- Projenizin Kapsüllerini yükledikten veya güncelledikten sonra,
.xcworkspace
kodunu kullanarak Xcode projenizi açın. ML Kit, Xcode'un 12.4 veya sonraki sürümlerinde desteklenir.
1. TextRecognizer
örneği oluşturun
+textRecognizer
yöntemini çağırarak TextRecognizer
örneğini oluşturun:
Swift
let textRecognizer = TextRecognizer.textRecognizer()
Objective-C
MLKTextRecognizer *textRecognizer = [MLKTextRecognizer textRecognizer];
2. Giriş resmini hazırlayın
Resmi,TextRecognizer
process(_:completion:)
yöntemine UIImage
veya CMSampleBufferRef
olarak iletin:
UIImage
veya CMSampleBuffer
kullanarak bir VisionImage
nesnesi oluşturun.
UIImage
kullanıyorsanız şu adımları uygulayın:
UIImage
ile birVisionImage
nesnesi oluşturun. Doğru.orientation
'u belirttiğinizden emin olun.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
CMSampleBuffer
kullanıyorsanız şu adımları uygulayın:
-
CMSampleBuffer
içinde yer alan resim verilerinin yönünü belirtin.Resmin yönünü ayarlamak için:
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; } }
CMSampleBuffer
nesnesini ve yönünü kullanarakVisionImage
nesnesi oluşturun: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. Resmi işleyin
Ardından, resmi process(_:completion:)
yöntemine geçirin:
Swift
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // Error handling return } // Recognized text }
Objective-C
[textRecognizer processImage:image completion:^(MLKText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // Error handling return; } // Recognized text }];
4. Tanınan metnin engellemelerinden metin çıkarma
Metin tanıma işlemi başarılı olursa Text
nesnesi döndürür. Text
nesnesi, resimde tanınan tam metni ve sıfır veya daha fazla TextBlock
nesnesini içerir.
Her TextBlock
, sıfır veya daha fazla TextLine
nesne içeren dikdörtgen metin bloğunu temsil eder. Her TextLine
nesnesi, kelimeler ve tarih ve sayı gibi kelime benzeri öğeleri temsil eden sıfır veya daha fazla TextElement
nesnesi içerir.
Her bir TextBlock
, TextLine
ve TextElement
nesnesi için metnin bölgede ve sınır koordinatlarında tanınmasını sağlayabilirsiniz.
Örnek:
Swift
let resultText = result.text for block in result.blocks { let blockText = block.text let blockLanguages = block.recognizedLanguages let blockCornerPoints = block.cornerPoints let blockFrame = block.frame for line in block.lines { let lineText = line.text let lineLanguages = line.recognizedLanguages let lineCornerPoints = line.cornerPoints let lineFrame = line.frame for element in line.elements { let elementText = element.text let elementCornerPoints = element.cornerPoints let elementFrame = element.frame } } }
Objective-C
NSString *resultText = result.text; for (MLKTextBlock *block in result.blocks) { NSString *blockText = block.text; NSArray<MLKTextRecognizedLanguage *> *blockLanguages = block.recognizedLanguages; NSArray<NSValue *> *blockCornerPoints = block.cornerPoints; CGRect blockFrame = block.frame; for (MLKTextLine *line in block.lines) { NSString *lineText = line.text; NSArray<MLKTextRecognizedLanguage *> *lineLanguages = line.recognizedLanguages; NSArray<NSValue *> *lineCornerPoints = line.cornerPoints; CGRect lineFrame = line.frame; for (MLKTextElement *element in line.elements) { NSString *elementText = element.text; NSArray<NSValue *> *elementCornerPoints = element.cornerPoints; CGRect elementFrame = element.frame; } } }
Giriş resmi yönergeleri
-
ML Kit'in metni doğru bir şekilde tanıyabilmesi için giriş resimleri yeterli piksel verisi tarafından temsil edilen metin içermelidir. İdeal olarak her karakter en az 16x16 piksel olmalıdır. Karakterlerin genellikle 24x24 pikselden büyük olmasında doğruluk avantajı yoktur.
Örneğin, 640x480 boyutlu bir resim, resmin tam genişliğini kaplayan bir kartvizit taramak için iyi sonuç verebilir. Harf boyutunda kağıt üzerine basılı bir dokümanı taramak için 720x1280 piksel boyutunda bir resim gerekebilir.
-
Düşük resim odağı, metin tanıma doğruluğunu etkileyebilir. Kabul edilebilir sonuçlar elde edemiyorsanız kullanıcıdan resmi tekrar yakalamasını isteyin.
-
Gerçek zamanlı bir uygulamadaki metni tanıyorsanız giriş resimlerinin genel boyutlarını dikkate almanız gerekir. Küçük resimler daha hızlı işlenebilir. Gecikmeyi azaltmak için metnin resmin mümkün olduğunca fazla yer kaplamasını sağlayın ve resimleri daha düşük çözünürlüklerde yakalayın (yukarıda belirtilen doğruluk gereksinimlerini göz önünde bulundurun). Daha fazla bilgi için Performansı iyileştirmeye yönelik ipuçları konusuna bakın.
Performansı artırmayla ilgili ipuçları
- Video çerçevelerini işlemek için algılayıcının
results(in:)
eşzamanlı API'sini kullanın. Belirtilen video çerçevesinden eşzamanlı olarak sonuç almak içinAVCaptureVideoDataOutputSampleBufferDelegate
captureOutput(_, didOutput:from:)
işlevinden bu yöntemi çağırın. Algılayıcının çağrılarını kısmak içinAVCaptureVideoDataOutput
alwaysDiscardsLateVideoFrames
değerinitrue
olarak tutun. Algılayıcı çalışırken yeni bir video çerçevesi kullanılabilir hale gelirse atlanır. - Algılayıcının çıkışını giriş resmine yer paylaşımlı olarak eklemek için kullanıyorsanız önce ML Kit'ten sonucu alın, ardından resmi ve yer paylaşımını tek bir adımda oluşturun. Bu şekilde, her bir işlenmiş giriş çerçevesi için ekranı yalnızca bir kez oluşturursunuz. Örnek için ML Kit hızlı başlangıç örneğindeki updatepreviewOverlayViewWithLastFrame konusuna bakın.
- Resimleri daha düşük çözünürlükte çekmeyi düşünebilirsiniz. Ancak bu API'nin görüntü boyutu şartlarını da göz önünde bulundurun.