Puoi utilizzare Firebase ML per riconoscere il testo nelle immagini. Firebase ML ha un'API generica adatta al riconoscimento del testo nelle immagini, ad esempio il testo di un cartello stradale, e un'API ottimizzata per il riconoscimento del testo dei documenti.
Prima di iniziare
-
Se non hai ancora 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 (File > Aggiungi pacchetti).
- Quando richiesto, aggiungi il repository dell'SDK delle piattaforme Apple di Firebase:
- Scegli la raccolta Firebase ML.
- Aggiungi il flag
-ObjC
alla sezione Altri flag del linker delle impostazioni di build del target. - Al termine, Xcode inizierà automaticamente a risolvere e a scaricare le tue dipendenze in background.
- Nella tua app, importa Firebase:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
-
Se non hai ancora abilitato le API basate sul cloud per il tuo progetto, fallo ora:
- Apri la pagina Firebase ML API nella console Firebase.
-
Se non hai ancora eseguito l'upgrade del progetto al piano tariffario Blaze con pagamento a consumo, fai clic su Esegui upgrade. (Ti verrà chiesto di eseguire l'upgrade solo se il tuo progetto non è incluso nel piano tariffario Blaze.)
Solo i progetti con il piano tariffario Blaze possono utilizzare le API basate sul cloud.
- Se le API basate sul cloud non sono già abilitate, fai clic su Abilita API basate sul cloud.
Utilizza Swift Package Manager per installare e gestire le dipendenze di Firebase.
https://github.com/firebase/firebase-ios-sdk.git
Poi, esegui alcune operazioni di configurazione nell'app:
Ora puoi iniziare a riconoscere il testo nelle immagini.
Linee guida per le immagini di input
-
Affinché Firebase ML riconosca con precisione il testo, le immagini di input devono contenere testo rappresentato da dati di pixel sufficienti. Idealmente, per il testo latino, ogni carattere dovrebbe essere di almeno 16 x 16 pixel. Per il testo in cinese, giapponese e coreano, ogni carattere deve essere di 24 x 24 pixel. Per tutte le lingue, in genere non è necessario che i caratteri siano più grandi di 24 x 24 pixel per una maggiore precisione.
Ad esempio, un'immagine 640 x 480 potrebbe essere adatta per scansionare un biglietto da visita che occupa l'intera larghezza dell'immagine. Per scansionare un documento stampato su carta formato lettera, potrebbe essere necessaria un'immagine di 720 x 1280 pixel.
-
Una messa a fuoco scadente dell'immagine può compromettere l'accuratezza del riconoscimento del testo. Se non ottieni risultati accettabili, chiedi all'utente di acquisire nuovamente l'immagine.
Riconosce il testo nelle immagini
Per riconoscere il testo in un'immagine, esegui il riconoscimento del testo come descritto di seguito.
1. Eseguire il riconoscimento del testo
Passa l'immagine comeUIImage
o CMSampleBufferRef
al metodo process(_:completion:)
di VisionTextRecognizer
:
- Ottieni 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 con codifica 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. Estrarre 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
riconosciuto nell'immagine e zero o più oggetti VisionTextBlock
.
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 del riquadro di selezione
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 adottare alcune misure aggiuntive per prevenire e mitigare 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 lo strumento di riconoscimento del testo del documento come descritto di seguito.
L'API di riconoscimento del testo del documento, descritta di seguito, fornisce un'interfaccia pensata per semplificare l'utilizzo delle immagini dei documenti. Tuttavia, se preferisci l'interfaccia fornita dall'API Sparse Text, puoi utilizzarla per scansionare i documenti configurando il riconoscitore di testo cloud in modo che utilizzi 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 metodo process(_:completion:)
di VisionDocumentTextRecognizer
:
- Ottieni 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 con codifica 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. Estrarre testo da blocchi di testo riconosciuto
Se l'operazione di riconoscimento del testo va a buon fine, viene restituito 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 oggetto VisionDocumentTextBlock
, VisionDocumentTextParagraph
,
VisionDocumentTextWord
e VisionDocumentTextSymbol
, puoi ottenere il
testo riconosciuto nella regione e le coordinate del rettangolo di selezione 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 adottare alcune misure aggiuntive per prevenire e mitigare l'effetto dell'accesso non autorizzato all'API.