Puoi utilizzare Firebase ML per riconoscere il testo nelle immagini. Firebase ML ha sia un'API per uso generico adatta al riconoscimento del testo nelle immagini, come il testo di un cartello stradale e un'API ottimizzata per il riconoscimento del testo 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 Firebase:
- Scegli la raccolta Firebase ML.
- Aggiungi il flag
-ObjC
alla sezione Altri flag linker delle impostazioni di build 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 già abilitato le API basate su cloud per il tuo progetto, procedi nel seguente modo: ora:
- Apri la Firebase ML pagina 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 di 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 testo in cinese, giapponese e coreano, ogni carattere deve avere dimensioni di 24 x 24 pixel. Per tutte le lingue, in genere non c'è alcun vantaggio in termini di accuratezza 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 scansionare un documento stampato su 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. In caso contrario ottenere risultati accettabili, prova a chiedere all'utente di recuperare 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 con codifica Base64
stringa. 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. Estrarre il testo da blocchi di testo riconosciuto
Se l'operazione di riconoscimento del testo va a buon fine, viene restituito un oggettoVisionText
. 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 della 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 eseguire alcuni passaggi aggiuntivi per prevenire e attenuare l'effetto dell'accesso non autorizzato all'API.
Riconoscere il testo nelle immagini dei documenti
Per riconoscere il testo di un documento, configura ed esegui il rilettore di testo dei documenti 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 di testo denso.
Per utilizzare l'API per il riconoscimento del testo dei documenti:
1. Esegui il riconoscimento del testo
Trasmetti l'immagine comeUIImage
o CMSampleBufferRef
al
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 con codifica Base64
stringa. 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 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
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 eseguire alcuni passaggi aggiuntivi per prevenire e attenuare l'effetto dell'accesso non autorizzato all'API.