Puoi utilizzare ML Kit per riconoscere il testo nelle immagini o nei video, ad esempio il testo di un cartello stradale. Le caratteristiche principali di questa funzionalità sono:
API Text Recognition v2 | |
---|---|
Descrizione | Riconoscimento del testo in immagini o video, supporto di alfabeti latini, cinesi, devanagari, giapponesi e coreani e di una vasta gamma di lingue. |
Nomi SDK | GoogleMLKit/TextRecognition |
Implementazione | Gli asset sono collegati in modo statico alla tua app in fase di compilazione |
Impatto sulle dimensioni dell'app | Circa 38 MB per script SDK |
Prestazioni | In tempo reale sulla maggior parte dei dispositivi per l'SDK con script latino, più lento per altri. |
Prova
- Prova l'app di esempio per vedere un esempio di utilizzo di questa API.
- Prova a utilizzare il codice utilizzando codelab.
Prima di iniziare
- Includi i seguenti pod di ML Kit nel tuo Podfile:
# 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'
- Dopo aver installato o aggiornato i pod del progetto, apri il progetto Xcode utilizzando la relativa
.xcworkspace
. ML Kit è supportato in Xcode versione 12.4 o successiva.
1. Crea un'istanza di TextRecognizer
Crea un'istanza di TextRecognizer
chiamando
+textRecognizer(options:)
, passando le opzioni relative all'SDK dichiarato come
dipendenza sopra:
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. Prepara l'immagine di input
Trasmetti l'immagine comeUIImage
o CMSampleBufferRef
al
Metodo process(_:completion:)
di TextRecognizer
:
Crea un oggetto VisionImage
utilizzando un UIImage
o un
CMSampleBuffer
.
Se usi un UIImage
, segui questi passaggi:
- Crea un oggetto
VisionImage
conUIImage
. Assicurati di specificare il valore.orientation
corretto.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
Se utilizzi un CMSampleBuffer
, segui questi passaggi:
-
Specifica l'orientamento dei dati dell'immagine contenuti in
CMSampleBuffer
.Per ottenere l'orientamento dell'immagine:
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; } }
- Crea un oggetto
VisionImage
utilizzando il metodoCMSampleBuffer
oggetto e orientamento: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. Elabora l'immagine
Quindi, passa l'immagine al metodo process(_:completion:)
:
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. Estrai testo da blocchi di testo riconosciuto
Se il riconoscimento del testo ha esito positivo, viene restituito
Text
. Un oggetto Text
contiene il testo completo riconosciuto nell'immagine e zero o più oggetti TextBlock
.
Ciascun TextBlock
rappresenta un blocco di testo rettangolare, che
contengono zero o più oggetti TextLine
. Ogni TextLine
contiene zero o più oggetti TextElement
,
che rappresentano parole ed entità simili a parole come date e numeri.
Per ogni oggetto TextBlock
, TextLine
e
TextElement
, puoi ottenere il testo riconosciuto nella
regione e le coordinate di confine della regione.
Ad esempio:
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; } } }
Linee guida per le immagini di input
-
Affinché ML Kit riconosca accuratamente il testo, le immagini di input devono contenere di testo rappresentato da un numero sufficiente di dati di pixel. Idealmente, ogni carattere deve essere di almeno 16 x 16 pixel. In genere, non c'è alcun vantaggio in termini di precisione se i caratteri sono più grandi di 24 x 24 pixel.
Ad esempio, un'immagine di 640 x 480 potrebbe essere adatta per la scansione di un biglietto da visita che occupa l'intera larghezza dell'immagine. Per eseguire la scansione di un documento stampato su carta in formato lettera, potrebbe essere necessaria un'immagine di 720 x 1280 pixel.
-
Una scarsa messa a fuoco dell'immagine può influire sull'accuratezza del riconoscimento del testo. In caso contrario ottenere risultati accettabili, prova a chiedere all'utente di recuperare l'immagine.
-
Se stai riconoscendo dei testi in un'applicazione in tempo reale, dovresti considerare le dimensioni complessive delle immagini di input. Più piccola le immagini possono essere elaborate più velocemente. Per ridurre la latenza, assicurati che il testo occupi il più possibile l'immagine e acquisisci le immagini a risoluzioni inferiori (tenendo presente i requisiti di accuratezza sopra indicati). Per ulteriori informazioni, consulta Suggerimenti per migliorare il rendimento.
Suggerimenti per migliorare il rendimento
- Per elaborare i fotogrammi video, utilizza l'API sincrona
results(in:)
del rilevatore. Chiama questo metodo dalla funzionecaptureOutput(_, didOutput:from:)
diAVCaptureVideoDataOutputSampleBufferDelegate
per ottenere in modo sincrono i risultati dal frame video fornito. MantienialwaysDiscardsLateVideoFrames
diAVCaptureVideoDataOutput
cometrue
per limitare le chiamate al rilevatore. Se un nuovo il fotogramma video diventa disponibile mentre il rilevatore è in esecuzione, quindi verrà eliminato. - Se utilizzi l'output del rilevatore per sovrapporre la grafica all'immagine di input, ottieni prima il risultato da ML Kit, poi esegui il rendering dell'immagine e la sovrapposizione in un unico passaggio. In questo modo, esegui il rendering sulla superficie di visualizzazione solo una volta per ogni frame di input elaborato. Per un esempio, consulta updatePreviewOverlayViewWithLastFrame nell'esempio di avvio rapido di ML Kit.
- Valuta la possibilità di acquisire le immagini a una risoluzione inferiore. Tuttavia, tieni presente requisiti per le dimensioni immagine di questa API.
- Per evitare un potenziale calo delle prestazioni, non eseguire contemporaneamente più istanze di
TextRecognizer
con opzioni di script diverse.