欢迎参加我们将于 2022 年 10 月 18 日举办的 Firebase 峰会(线上线下同时进行),了解 Firebase 如何帮助您加快应用开发速度、满怀信心地发布应用并在之后需要时轻松地扩大应用规模。立即报名

Riconosci il testo nelle immagini con Firebase ML su iOS

Puoi utilizzare Firebase ML per riconoscere il testo nelle immagini. Firebase ML ha sia un'API generica adatta per riconoscere il testo nelle immagini, come il testo di un segnale stradale, sia un'API ottimizzata per riconoscere il testo dei documenti.

Prima di iniziare

    Se non hai già aggiunto Firebase alla tua app, fallo seguendo i passaggi nella Guida introduttiva .

    Usa Swift Package Manager per installare e gestire le dipendenze di Firebase.

    1. In Xcode, con il progetto dell'app aperto, vai su File > Aggiungi pacchetti .
    2. Quando richiesto, aggiungi il repository SDK delle piattaforme Apple Firebase:
    3.   https://github.com/firebase/firebase-ios-sdk
    4. Scegli la libreria Firebase ML.
    5. Al termine, Xcode inizierà automaticamente a risolvere e scaricare le tue dipendenze in background.

    Quindi, esegui alcune impostazioni in-app:

    1. Nella tua app, importa Firebase:

      Veloce

      import FirebaseMLModelDownloader

      Obiettivo-C

      @import FirebaseMLModelDownloader;
  1. Se non hai già abilitato le API basate su cloud per il tuo progetto, fallo ora:

    1. Apri la pagina API Firebase ML della console Firebase.
    2. Se non hai già aggiornato il tuo progetto al piano tariffario Blaze, fai clic su Aggiorna per farlo. (Ti verrà richiesto di eseguire l'aggiornamento solo se il tuo progetto non è nel piano Blaze.)

      Solo i progetti di livello Blaze possono utilizzare le API basate su cloud.

    3. Se le API basate su cloud non sono già abilitate, fai clic su Abilita API basate su cloud .

Ora sei pronto per iniziare a riconoscere il testo nelle immagini.

Linee guida per l'immagine di input

  • Affinché Firebase ML riconosca accuratamente il testo, le immagini di input devono contenere testo rappresentato da dati pixel sufficienti. Idealmente, per il testo latino, ogni carattere dovrebbe essere almeno 16x16 pixel. Per il testo cinese, giapponese e coreano, ogni carattere deve essere di 24x24 pixel. Per tutte le lingue, generalmente non vi è alcun vantaggio in termini di precisione per i caratteri 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 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.


Riconosci 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 come UIImage o CMSampleBufferRef al VisionTextRecognizer process(_:completion:) di VisionTextRecognizer:

  1. Ottieni un'istanza di VisionTextRecognizer chiamando cloudTextRecognizer :

    Veloce

    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];
    
  2. Per poter chiamare Cloud Vision, l'immagine deve essere formattata come stringa con codifica base64. Per elaborare UIImage :

    Veloce

    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];
  3. Quindi, passa l'immagine al metodo process(_:completion:) :

    Veloce

    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 oggetto VisionText . 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 VisionTextBlock , VisionTextLine e VisionTextElement , è possibile ottenere il testo riconosciuto nell'area e le coordinate di delimitazione dell'area.

Per esempio:

Veloce

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


Riconosci 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 progettata per essere più comoda per lavorare con le immagini dei documenti. Tuttavia, se preferisci l'interfaccia fornita dall'API di testo sparso, puoi utilizzarla invece per scansionare i documenti configurando il riconoscimento del 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 come UIImage o CMSampleBufferRef al VisionDocumentTextRecognizer process(_:completion:) di VisionDocumentTextRecognizer :

  1. Ottieni un'istanza di VisionDocumentTextRecognizer chiamando cloudDocumentTextRecognizer :

    Veloce

    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];
    
  2. Per poter chiamare Cloud Vision, l'immagine deve essere formattata come stringa con codifica base64. Per elaborare UIImage :

    Veloce

    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];
  3. Quindi, passa l'immagine al metodo process(_:completion:) :

    Veloce

    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 oggetto VisionDocumentText . 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 , è possibile ottenere il testo riconosciuto nell'area e le coordinate di delimitazione dell'area.

Per esempio:

Veloce

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