Puoi utilizzare Firebase ML per riconoscere il testo nelle immagini. Firebase ML ha sia un'API generica adatta per il riconoscimento del testo nelle immagini, come il testo di un segnale stradale, sia un'API ottimizzata per il riconoscimento del testo dei documenti.
Prima di iniziare
-
Se non hai già aggiunto Firebase alla tua app, puoi farlo seguendo le istruzioni riportate in
passaggi nella Guida introduttiva.
- In Xcode, con il progetto dell'app aperto, vai a File > Aggiungi pacchetti.
- Quando richiesto, aggiungi il repository dell'SDK delle piattaforme Apple di Firebase:
- Scegli la libreria Firebase ML.
- Aggiungi il flag
-ObjC
alla sezione Altri flag del linker delle impostazioni di compilazione del target. - Al termine, Xcode inizierà automaticamente a risolvere e scaricare il le dipendenze in background.
- Nell'app, importa Firebase:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
-
Se non hai ancora attivato le API basate su cloud per il tuo progetto, fallo subito:
- Apri l'app Firebase ML API della console Firebase.
-
Se non hai già eseguito l'upgrade del progetto al piano tariffario Blaze, fai clic su Per farlo, esegui l'upgrade. Ti verrà chiesto di eseguire l'upgrade solo se non è incluso nel piano Blaze.)
Solo i progetti a livello Blaze possono utilizzare le API basate su cloud.
- Se le API basate su cloud non sono già abilitate, fai clic su Abilita API basate su cloud.
Utilizza Swift Package Manager per installare e gestire le dipendenze di Firebase.
https://github.com/firebase/firebase-ios-sdk.git
A questo punto, esegui la configurazione in-app:
Ora puoi iniziare a riconoscere il testo nelle immagini.
Linee guida per l'immagine di input
-
Affinché Firebase ML riconosca in modo preciso il testo, le immagini di input devono contenere di testo rappresentato da un numero sufficiente di dati di pixel. Idealmente, per la lingua latina di testo, ogni carattere deve essere di almeno 16 x 16 pixel. Per il cinese, in giapponese e coreano, ciascuna deve essere di 24 x 24 pixel. Per tutte le lingue, in genere non c'è maggiore di 24 x 24 pixel.
Ad esempio, un'immagine di 640 x 480 potrebbe essere l'ideale per scansionare 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 messa a fuoco scadente dell'immagine può influire sulla precisione del riconoscimento del testo. Se non ottieni risultati accettabili, prova a chiedere all'utente di acquisire di nuovo l'immagine.
Riconosce il testo nelle immagini
Per riconoscere il testo in un'immagine, esegui il riconoscimento del testo come descritto di seguito.
1. Esegui il riconoscimento del testo
Trasmetti l'immagine comeUIImage
o CMSampleBufferRef
al
process(_:completion:)
di VisionTextRecognizer
:
- Ricevi un'istanza di
VisionTextRecognizer
chiamandocloudTextRecognizer
:Swift
let vision = Vision.vision() let textRecognizer = vision.cloudTextRecognizer() // Or, to provide language hints to assist with language detection: // See https://cloud.google.com/vision/docs/languages for supported languages let options = VisionCloudTextRecognizerOptions() options.languageHints = ["en", "hi"] let textRecognizer = vision.cloudTextRecognizer(options: options)
Objective-C
FIRVision *vision = [FIRVision vision]; FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizer]; // Or, to provide language hints to assist with language detection: // See https://cloud.google.com/vision/docs/languages for supported languages FIRVisionCloudTextRecognizerOptions *options = [[FIRVisionCloudTextRecognizerOptions alloc] init]; options.languageHints = @[@"en", @"hi"]; FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizerWithOptions:options];
-
Per chiamare Cloud Vision, l'immagine deve essere formattata come stringa codificata in base64. Per elaborare un
UIImage
:Swift
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Objective-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
-
Quindi, passa l'immagine al metodo
process(_:completion:)
:Swift
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Objective-C
[textRecognizer processImage:image completion:^(FIRVisionText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. Estrai testo da blocchi di testo riconosciuto
Se il riconoscimento del testo viene eseguito correttamente, viene restituitoVisionText
. Un oggetto VisionText
contiene il testo completo
riconosciuti nell'immagine e zero o più VisionTextBlock
di oggetti strutturati.
Ogni VisionTextBlock
rappresenta un blocco di testo rettangolare che contiene zero o più oggetti VisionTextLine
. Ogni oggetto VisionTextLine
contiene zero o più oggetti VisionTextElement
, che rappresentano parole ed entità simili a parole (date, numeri e così via).
Per ogni oggetto VisionTextBlock
, VisionTextLine
e VisionTextElement
,
puoi ottenere il testo riconosciuto nella regione e le coordinate di delimitazione di
regione.
Ad esempio:
Swift
let resultText = result.text for block in result.blocks { let blockText = block.text let blockConfidence = block.confidence let blockLanguages = block.recognizedLanguages let blockCornerPoints = block.cornerPoints let blockFrame = block.frame for line in block.lines { let lineText = line.text let lineConfidence = line.confidence let lineLanguages = line.recognizedLanguages let lineCornerPoints = line.cornerPoints let lineFrame = line.frame for element in line.elements { let elementText = element.text let elementConfidence = element.confidence let elementLanguages = element.recognizedLanguages let elementCornerPoints = element.cornerPoints let elementFrame = element.frame } } }
Objective-C
NSString *resultText = result.text; for (FIRVisionTextBlock *block in result.blocks) { NSString *blockText = block.text; NSNumber *blockConfidence = block.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *blockLanguages = block.recognizedLanguages; NSArray<NSValue *> *blockCornerPoints = block.cornerPoints; CGRect blockFrame = block.frame; for (FIRVisionTextLine *line in block.lines) { NSString *lineText = line.text; NSNumber *lineConfidence = line.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *lineLanguages = line.recognizedLanguages; NSArray<NSValue *> *lineCornerPoints = line.cornerPoints; CGRect lineFrame = line.frame; for (FIRVisionTextElement *element in line.elements) { NSString *elementText = element.text; NSNumber *elementConfidence = element.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *elementLanguages = element.recognizedLanguages; NSArray<NSValue *> *elementCornerPoints = element.cornerPoints; CGRect elementFrame = element.frame; } } }
Passaggi successivi
- Prima di eseguire il deployment in produzione di un'app che utilizza un'API Cloud, devi svolgere alcuni passaggi aggiuntivi per prevenire e ridurre l'effetto dell'accesso non autorizzato all'API.
Riconosci il testo nelle immagini di documenti
Per riconoscere il testo di un documento, configura ed esegui il come descritto di seguito.
L'API di riconoscimento del testo dei documenti, descritta di seguito, fornisce un'interfaccia che è pensato per essere più comodo per lavorare con le immagini di documenti. Tuttavia, Se preferisci l'interfaccia fornita dall'API sparse text, puoi utilizzarla anziché scansionare i documenti configurando il riconoscimento del testo nel cloud utilizza il modello basato su testo denso.
Per utilizzare l'API per il riconoscimento del testo dei documenti:
1. Esegui il riconoscimento del testo
Passa l'immagine comeUIImage
o CMSampleBufferRef
al metodo process(_:completion:)
di VisionDocumentTextRecognizer
:
- Ricevi un'istanza di
VisionDocumentTextRecognizer
chiamandocloudDocumentTextRecognizer
:Swift
let vision = Vision.vision() let textRecognizer = vision.cloudDocumentTextRecognizer() // Or, to provide language hints to assist with language detection: // See https://cloud.google.com/vision/docs/languages for supported languages let options = VisionCloudDocumentTextRecognizerOptions() options.languageHints = ["en", "hi"] let textRecognizer = vision.cloudDocumentTextRecognizer(options: options)
Objective-C
FIRVision *vision = [FIRVision vision]; FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizer]; // Or, to provide language hints to assist with language detection: // See https://cloud.google.com/vision/docs/languages for supported languages FIRVisionCloudDocumentTextRecognizerOptions *options = [[FIRVisionCloudDocumentTextRecognizerOptions alloc] init]; options.languageHints = @[@"en", @"hi"]; FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizerWithOptions:options];
-
Per chiamare Cloud Vision, l'immagine deve essere formattata come stringa codificata in base64. Per elaborare un
UIImage
:Swift
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Objective-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
-
Quindi, passa l'immagine al metodo
process(_:completion:)
:Swift
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Objective-C
[textRecognizer processImage:image completion:^(FIRVisionDocumentText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. Estrai testo da blocchi di testo riconosciuto
Se il riconoscimento del testo viene eseguito correttamente, viene restituitoVisionDocumentText
. Un oggetto VisionDocumentText
contiene tutto il testo riconosciuto nell'immagine e una gerarchia di oggetti che
rifletta la struttura del documento riconosciuto:
Per ogni VisionDocumentTextBlock
, VisionDocumentTextParagraph
,
VisionDocumentTextWord
e VisionDocumentTextSymbol
, puoi ottenere
testo riconosciuto nella regione e le coordinate di delimitazione della regione.
Ad esempio:
Swift
let resultText = result.text for block in result.blocks { let blockText = block.text let blockConfidence = block.confidence let blockRecognizedLanguages = block.recognizedLanguages let blockBreak = block.recognizedBreak let blockCornerPoints = block.cornerPoints let blockFrame = block.frame for paragraph in block.paragraphs { let paragraphText = paragraph.text let paragraphConfidence = paragraph.confidence let paragraphRecognizedLanguages = paragraph.recognizedLanguages let paragraphBreak = paragraph.recognizedBreak let paragraphCornerPoints = paragraph.cornerPoints let paragraphFrame = paragraph.frame for word in paragraph.words { let wordText = word.text let wordConfidence = word.confidence let wordRecognizedLanguages = word.recognizedLanguages let wordBreak = word.recognizedBreak let wordCornerPoints = word.cornerPoints let wordFrame = word.frame for symbol in word.symbols { let symbolText = symbol.text let symbolConfidence = symbol.confidence let symbolRecognizedLanguages = symbol.recognizedLanguages let symbolBreak = symbol.recognizedBreak let symbolCornerPoints = symbol.cornerPoints let symbolFrame = symbol.frame } } } }
Objective-C
NSString *resultText = result.text; for (FIRVisionDocumentTextBlock *block in result.blocks) { NSString *blockText = block.text; NSNumber *blockConfidence = block.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *blockRecognizedLanguages = block.recognizedLanguages; FIRVisionTextRecognizedBreak *blockBreak = block.recognizedBreak; CGRect blockFrame = block.frame; for (FIRVisionDocumentTextParagraph *paragraph in block.paragraphs) { NSString *paragraphText = paragraph.text; NSNumber *paragraphConfidence = paragraph.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *paragraphRecognizedLanguages = paragraph.recognizedLanguages; FIRVisionTextRecognizedBreak *paragraphBreak = paragraph.recognizedBreak; CGRect paragraphFrame = paragraph.frame; for (FIRVisionDocumentTextWord *word in paragraph.words) { NSString *wordText = word.text; NSNumber *wordConfidence = word.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *wordRecognizedLanguages = word.recognizedLanguages; FIRVisionTextRecognizedBreak *wordBreak = word.recognizedBreak; CGRect wordFrame = word.frame; for (FIRVisionDocumentTextSymbol *symbol in word.symbols) { NSString *symbolText = symbol.text; NSNumber *symbolConfidence = symbol.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *symbolRecognizedLanguages = symbol.recognizedLanguages; FIRVisionTextRecognizedBreak *symbolBreak = symbol.recognizedBreak; CGRect symbolFrame = symbol.frame; } } } }
Passaggi successivi
- Prima di eseguire il deployment in produzione di un'app che utilizza un'API Cloud, devi: alcune misure aggiuntive per prevenire e mitigare dell'accesso non autorizzato all'API.