Você pode usar o Firebase ML para reconhecer texto em imagens. O Firebase ML possui uma API de uso geral adequada para reconhecer texto em imagens, como o texto de uma placa de rua, e uma API otimizada para reconhecer o texto de documentos.
Antes de você começar
- Se você ainda não adicionou o Firebase ao seu aplicativo, faça isso seguindo as etapas do guia de primeiros passos .
- No Xcode, com o projeto do seu aplicativo aberto, navegue até File > Add Packages .
- Quando solicitado, adicione o repositório SDK das plataformas Apple do Firebase:
- Escolha a biblioteca Firebase ML.
- Adicione o sinalizador
-ObjC
à seção Outros sinalizadores de vinculador das configurações de compilação do seu destino. - Quando terminar, o Xcode começará automaticamente a resolver e baixar suas dependências em segundo plano.
- No seu aplicativo, importe o Firebase:
Rápido
import FirebaseMLModelDownloader
Objetivo-C
@import FirebaseMLModelDownloader;
Se você ainda não habilitou APIs baseadas em nuvem para seu projeto, faça-o agora:
- Abra a página APIs do Firebase ML do console do Firebase.
Se você ainda não atualizou seu projeto para o plano de preços Blaze, clique em Atualizar para fazer isso. (Você será solicitado a atualizar somente se o seu projeto não estiver no plano Blaze.)
Somente projetos no nível Blaze podem usar APIs baseadas em nuvem.
- Se as APIs baseadas em nuvem ainda não estiverem habilitadas, clique em Habilitar APIs baseadas em nuvem .
Use o Swift Package Manager para instalar e gerenciar dependências do Firebase.
https://github.com/firebase/firebase-ios-sdk.git
Em seguida, execute algumas configurações no aplicativo:
Agora você está pronto para começar a reconhecer texto em imagens.
Diretrizes de imagem de entrada
Para que o Firebase ML reconheça o texto com precisão, as imagens de entrada devem conter texto representado por dados de pixel suficientes. Idealmente, para texto latino, cada caractere deve ter pelo menos 16x16 pixels. Para texto em chinês, japonês e coreano, cada caractere deve ter 24x24 pixels. Para todos os idiomas, geralmente não há benefício de precisão se caracteres maiores que 24x24 pixels.
Assim, por exemplo, uma imagem de 640x480 pode funcionar bem para digitalizar um cartão de visita que ocupe toda a largura da imagem. Para digitalizar um documento impresso em papel tamanho carta, pode ser necessária uma imagem de 720x1280 pixels.
O foco inadequado da imagem pode prejudicar a precisão do reconhecimento de texto. Se você não estiver obtendo resultados aceitáveis, tente pedir ao usuário para recapturar a imagem.
Reconhecer texto em imagens
Para reconhecer texto em uma imagem, execute o reconhecedor de texto conforme descrito abaixo.
1. Execute o reconhecedor de texto
Passe a imagem comoUIImage
ou CMSampleBufferRef
para o método process(_:completion:)
do VisionTextRecognizer
:- Obtenha uma instância do
VisionTextRecognizer
chamandocloudTextRecognizer
:Rápido
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)
Objetivo-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];
- Para chamar o Cloud Vision, a imagem deve ser formatada como uma string codificada em base64. Para processar um
UIImage
:Rápido
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Objetivo-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Em seguida, passe a imagem para o
process(_:completion:)
:Rápido
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Objetivo-C
[textRecognizer processImage:image completion:^(FIRVisionText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. Extraia texto de blocos de texto reconhecidos
Se a operação de reconhecimento de texto for bem-sucedida, ela retornará um objetoVisionText
. Um objeto VisionText
contém o texto completo reconhecido na imagem e zero ou mais objetos VisionTextBlock
. Cada VisionTextBlock
representa um bloco retangular de texto, que contém zero ou mais objetos VisionTextLine
. Cada objeto VisionTextLine
contém zero ou mais objetos VisionTextElement
, que representam palavras e entidades semelhantes a palavras (datas, números e assim por diante).
Para cada objeto VisionTextBlock
, VisionTextLine
e VisionTextElement
, você pode obter o texto reconhecido na região e as coordenadas delimitadoras da região.
Por exemplo:
Rápido
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 } } }
Objetivo-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; } } }
Próximos passos
- Antes de implantar em produção um aplicativo que usa uma API do Cloud, você deve seguir algumas etapas adicionais para evitar e mitigar o efeito do acesso não autorizado à API .
Reconhecer texto em imagens de documentos
Para reconhecer o texto de um documento, configure e execute o reconhecedor de texto do documento conforme descrito abaixo.
A API de reconhecimento de texto de documentos, descrita abaixo, fornece uma interface que pretende ser mais conveniente para trabalhar com imagens de documentos. No entanto, se você preferir a interface fornecida pela API de texto esparso, poderá usá-la para digitalizar documentos configurando o reconhecedor de texto em nuvem para usar o modelo de texto denso .
Para usar a API de reconhecimento de texto de documento:
1. Execute o reconhecedor de texto
Passe a imagem comoUIImage
ou CMSampleBufferRef
para o método process(_:completion:)
do VisionDocumentTextRecognizer
:- Obtenha uma instância de
VisionDocumentTextRecognizer
chamandocloudDocumentTextRecognizer
:Rápido
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)
Objetivo-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];
- Para chamar o Cloud Vision, a imagem deve ser formatada como uma string codificada em base64. Para processar um
UIImage
:Rápido
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Objetivo-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Em seguida, passe a imagem para o
process(_:completion:)
:Rápido
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Objetivo-C
[textRecognizer processImage:image completion:^(FIRVisionDocumentText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. Extraia texto de blocos de texto reconhecidos
Se a operação de reconhecimento de texto for bem-sucedida, ela retornará um objetoVisionDocumentText
. Um objeto VisionDocumentText
contém o texto completo reconhecido na imagem e uma hierarquia de objetos que refletem a estrutura do documento reconhecido: Para cada objeto VisionDocumentTextBlock
, VisionDocumentTextParagraph
, VisionDocumentTextWord
e VisionDocumentTextSymbol
, você pode obter o texto reconhecido na região e as coordenadas delimitadoras da região.
Por exemplo:
Rápido
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 } } } }
Objetivo-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; } } } }
Próximos passos
- Antes de implantar em produção um aplicativo que usa uma API do Cloud, você deve seguir algumas etapas adicionais para evitar e mitigar o efeito do acesso não autorizado à API .