Resimlerdeki veya videolardaki metinleri (örneğin, videodaki sokak tabelası gibi. Bu özelliğin temel özellikleri şunlardır:
Metin Tanıma v2 API'si | |
---|---|
Açıklama | Resim veya videolardaki metinleri tanıma, Latin, Çince, Devanagari, Japonca ve Korece yazım sistemleri ile çeşitli diller için destek. |
SDK adları | GoogleMLKit/TextRecognition |
Uygulama | Öğeler, derleme sırasında uygulamanıza statik olarak bağlıdır |
Uygulama boyutu etkisi | Komut dosyası SDK'sı başına yaklaşık 38 MB |
Performans | Latin alfabesi SDK'sı için çoğu cihazda gerçek zamanlı, diğerlerinde daha yavaştır. |
Deneyin
- Örnek uygulamayı kullanarak bu API'nin örnek kullanımını inceleyin.
- Kodu, ile kendiniz deneyin codelab'e göz atın.
Başlamadan önce
- Aşağıdaki ML Kit kapsüllerini Podfile'ınıza ekleyin:
# To recognize Latin script pod 'GoogleMLKit/TextRecognition', '15.5.0' # To recognize Chinese script pod 'GoogleMLKit/TextRecognitionChinese', '15.5.0' # To recognize Devanagari script pod 'GoogleMLKit/TextRecognitionDevanagari', '15.5.0' # To recognize Japanese script pod 'GoogleMLKit/TextRecognitionJapanese', '15.5.0' # To recognize Korean script pod 'GoogleMLKit/TextRecognitionKorean', '15.5.0'
. - Projenizin kapsüllerini yükledikten veya güncelledikten sonra
.xcworkspace
ML Kit, Xcode 12.4 veya sonraki sürümlerde desteklenir.
1. TextRecognizer
örneği oluşturma
Yukarıda bağımlılık olarak beyan ettiğiniz SDK ile ilgili seçenekleri ileterek +textRecognizer(options:)
'ı çağırarak TextRecognizer
örneği oluşturun:
Swift
// When using Latin script recognition SDK let latinOptions = TextRecognizerOptions() let latinTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Chinese script recognition SDK let chineseOptions = ChineseTextRecognizerOptions() let chineseTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Devanagari script recognition SDK let devanagariOptions = DevanagariTextRecognizerOptions() let devanagariTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Japanese script recognition SDK let japaneseOptions = JapaneseTextRecognizerOptions() let japaneseTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Korean script recognition SDK let koreanOptions = KoreanTextRecognizerOptions() let koreanTextRecognizer = TextRecognizer.textRecognizer(options:options)
Objective-C
// When using Latin script recognition SDK MLKTextRecognizerOptions *latinOptions = [[MLKTextRecognizerOptions alloc] init]; MLKTextRecognizer *latinTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Chinese script recognition SDK MLKChineseTextRecognizerOptions *chineseOptions = [[MLKChineseTextRecognizerOptions alloc] init]; MLKTextRecognizer *chineseTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Devanagari script recognition SDK MLKDevanagariTextRecognizerOptions *devanagariOptions = [[MLKDevanagariTextRecognizerOptions alloc] init]; MLKTextRecognizer *devanagariTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Japanese script recognition SDK MLKJapaneseTextRecognizerOptions *japaneseOptions = [[MLKJapaneseTextRecognizerOptions alloc] init]; MLKTextRecognizer *japaneseTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Korean script recognition SDK MLKKoreanTextRecognizerOptions *koreanOptions = [[MLKKoreanTextRecognizerOptions alloc] init]; MLKTextRecognizer *koreanTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options];
2. Giriş resmini hazırlama
ResmiUIImage
veya CMSampleBufferRef
olarak şuraya aktarın:
TextRecognizer
'in process(_:completion:)
yöntemi:
Bir VisionImage
nesnesi oluşturmak için UIImage
veya
CMSampleBuffer
.
UIImage
kullanıyorsanız şu adımları uygulayın:
UIImage
ile birVisionImage
nesnesi oluşturun. Doğru.orientation
değerini 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 bulunan resim verilerinin yönünü belirtin.Resim yönünü almak 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ü kullanarak birVisionImage
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 iletin:
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 metin bloklarından metin ayıklama
Metin tanıma işlemi başarılı olursa,
Text
nesnesini tanımlayın. Text
nesnesi, resimde tanınan metnin tamamını ve sıfır veya daha fazla TextBlock
nesnesini içerir.
Her TextBlock
, dikdörtgen bir metin blokunu temsil eder.
hiç TextLine
nesne içermeyen. Her TextLine
nesnesi, kelimeleri ve kelime benzeri öğeleri (ör. tarihler ve sayılar) temsil eden sıfır veya daha fazla TextElement
nesnesi içerir.
Her TextBlock
, TextLine
ve TextElement
nesnesi için bölgede tanınan metni ve bölgenin sınır koordinatlarını alabilirsiniz.
Örneğin:
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 kuralları
-
ML Kit'in metni doğru şekilde tanıması için giriş resimlerinin, yeterli piksel verisiyle temsil edilen metin içermesi gerekir. İdeal olarak her karakter en az 16x16 piksel olmalıdır. Karakterlerin 24x24 pikselden daha büyük olması genellikle doğruluk açısından bir avantaj sağlamaz.
Örneğin, 640x480 boyutunda bir resim, resmin tüm genişliğini kaplayan bir kartvizitin taranması için uygun olabilir. Üzerine yazdırılmış bir dokümanı taramak için büyük harf kullanıyorsanız 720x1280 piksel boyutunda bir resim gerekebilir.
-
Kötü resim odağı, metin tanıma doğruluğunu etkileyebilir. Kabul edilebilir sonuçlar elde edemiyorsanız kullanıcıdan resmi yeniden çekmesini isteyin.
-
Gerçek zamanlı bir uygulamada metinleri tanıyorsanız, giriş resimlerinin genel boyutlarını göz önünde bulundurun. Daha küçük resimler daha hızlı işlenebilir. Gecikmeyi azaltmak için metnin görüntünün mümkün olduğunca fazlasını kapladığından emin olun ve resimleri daha düşük çözünürlüklerde çekin (yukarıda belirtilen doğruluk koşullarını göz önünde bulundurun). Daha fazla bilgi için bkz. Performansı iyileştirmeye yönelik ipuçları.
Performansı artırmaya yönelik ipuçları
- Video karelerini işlemek için algılayıcının
results(in:)
eşzamanlı API'sini kullanın. Belirli bir video karesinden eşzamanlı olarak sonuç almak için bu yöntemiAVCaptureVideoDataOutputSampleBufferDelegate
'ıncaptureOutput(_, didOutput:from:)
işlevinden çağırın. Algılayıcıya gelen aramaları azaltmak içinAVCaptureVideoDataOutput
'ninalwaysDiscardsLateVideoFrames
değerinitrue
olarak tutun. Algılayıcı çalışırken yeni bir video karesi kullanılabilir hale gelirse bu kare atlanır. - Algılayıcının çıkışını, üzerine grafik yerleştirmek için 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. Böylece, işlenen her giriş karesi için ekran yüzeyinde yalnızca bir kez oluşturma işlemi gerçekleştirirsiniz. Bkz. updatePreviewOverlayViewWithLastFrame ML Kit hızlı başlangıç örneğine göz atın.
- Resimleri daha düşük çözünürlükte çekmeyi deneyin. Ancak bu API'nin resim boyutu koşullarını da göz önünde bulundurun.
- Performansta düşüş yaşanmasını önlemek için birden fazla çalıştırmayın.
Eş zamanlı olarak farklı komut dosyası seçeneklerine sahip
TextRecognizer
örnek.