Puoi utilizzare Firebase ML per riconoscere il testo nelle immagini. Firebase ML ha sia un'API generica adatta al 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, fallo seguendo i passaggi della guida introduttiva .
- In Xcode, con il progetto dell'app aperto, vai a File > Add Packages .
- Quando richiesto, aggiungi il repository SDK delle piattaforme Firebase Apple:
- Scegli la libreria Firebase ML.
- Al termine, Xcode inizierà automaticamente a risolvere e scaricare le tue dipendenze in background.
- Nella tua app, importa Firebase:
Rapido
import FirebaseMLModelDownloader
Obiettivo-C
@import FirebaseMLModelDownloader;
Se non hai già abilitato le API basate su cloud per il tuo progetto, fallo ora:
- Apri la pagina delle API Firebase ML della console Firebase.
Se non hai già aggiornato il tuo progetto al piano tariffario Blaze, fai clic su Aggiorna per farlo. (Ti verrà chiesto di eseguire l'upgrade solo se il tuo progetto non è nel piano Blaze.)
Solo i progetti di 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
Successivamente, esegui alcune configurazioni in-app:
Ora sei pronto per iniziare a riconoscere il testo nelle immagini.
Inserire le linee guida dell'immagine
Affinché Firebase ML riconosca accuratamente il testo, le immagini di input devono contenere testo rappresentato da dati in pixel sufficienti. Idealmente, per il testo latino, ogni carattere dovrebbe essere di almeno 16x16 pixel. Per il testo cinese, giapponese e coreano, ogni carattere deve essere di 24 x 24 pixel. Per tutte le lingue, in genere non vi è alcun vantaggio in termini di precisione se i caratteri sono più grandi di 24x24 pixel.
Quindi, ad esempio, un'immagine 640x480 potrebbe funzionare bene 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 720x1280 pixel.
Una scarsa messa a fuoco dell'immagine può compromettere la precisione del riconoscimento del testo. Se non ottieni risultati accettabili, prova a chiedere all'utente di acquisire nuovamente l'immagine.
Riconoscere il testo nelle immagini
Per riconoscere il testo in un'immagine, eseguire il riconoscimento del testo come descritto di seguito.
1. Eseguire il riconoscimento del testo
Passa l'immagine comeUIImage
o CMSampleBufferRef
al VisionTextRecognizer
process(_:completion:)
di VisionTextRecognizer :- Ottieni un'istanza di
VisionTextRecognizer
chiamandocloudTextRecognizer
:Rapido
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)
Obiettivo-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 richiamare Cloud Vision, l'immagine deve essere formattata come stringa con codifica Base64. Per elaborare
UIImage
:Rapido
guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return } let base64encodedImage = imageData.base64EncodedString()
Obiettivo-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Quindi, passa l'immagine al metodo
process(_:completion:)
:Rapido
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Obiettivo-C
[textRecognizer processImage:image completion:^(FIRVisionText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. Estrarre il testo da blocchi di testo riconosciuto
Se l'operazione di riconoscimento del testo ha esito positivo, restituirà un oggettoVisionText
. Un oggetto VisionText
contiene il testo completo riconosciuto nell'immagine e zero o più oggetti VisionTextBlock
. Ogni VisionTextBlock
rappresenta un blocco rettangolare di testo, 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 VisionTextBlock
, VisionTextLine
e VisionTextElement
è possibile ottenere il testo riconosciuto nell'area e le coordinate di delimitazione dell'area.
Per esempio:
Rapido
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 } } }
Obiettivo-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; } } }
Prossimi passi
- Prima di eseguire il deployment in produzione di un'app che utilizza un'API Cloud, devi eseguire alcuni passaggi aggiuntivi per prevenire e mitigare l'effetto dell'accesso API non autorizzato .
Riconoscere il testo nelle immagini dei documenti
Per riconoscere il testo di un documento, configurare ed eseguire il riconoscimento del testo del documento come descritto di seguito.
L'API di riconoscimento del testo del documento, descritta di seguito, fornisce un'interfaccia destinata a essere più comoda per lavorare con le immagini dei documenti. Tuttavia, se preferisci l'interfaccia fornita dall'API di testo sparso, puoi usarla invece per scansionare documenti configurando il riconoscimento di testo cloud per utilizzare il modello di testo denso .
Per utilizzare l'API di riconoscimento del testo del documento:
1. Eseguire il riconoscimento del testo
Passa l'immagine comeUIImage
o CMSampleBufferRef
al VisionDocumentTextRecognizer
process(_:completion:)
di VisionDocumentTextRecognizer :- Ottieni un'istanza di
VisionDocumentTextRecognizer
chiamandocloudDocumentTextRecognizer
:Rapido
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)
Obiettivo-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 richiamare Cloud Vision, l'immagine deve essere formattata come stringa con codifica base64. Per elaborare
UIImage
:Rapido
guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return } let base64encodedImage = imageData.base64EncodedString()
Obiettivo-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Quindi, passa l'immagine al metodo
process(_:completion:)
:Rapido
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Obiettivo-C
[textRecognizer processImage:image completion:^(FIRVisionDocumentText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. Estrarre il testo da blocchi di testo riconosciuto
Se l'operazione di riconoscimento del testo ha esito positivo, restituirà un oggettoVisionDocumentText
. Un oggetto VisionDocumentText
contiene il testo completo riconosciuto nell'immagine e una gerarchia di oggetti che riflettono la struttura del documento riconosciuto: Per ogni VisionDocumentTextBlock
, VisionDocumentTextParagraph
, VisionDocumentTextWord
e VisionDocumentTextSymbol
, puoi ottenere il testo riconosciuto nell'area e le coordinate di delimitazione dell'area.
Per esempio:
Rapido
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 } } } }
Obiettivo-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; } } } }
Prossimi passi
- Prima di eseguire il deployment in produzione di un'app che utilizza un'API Cloud, devi eseguire alcuni passaggi aggiuntivi per prevenire e mitigare l'effetto dell'accesso API non autorizzato .