Puedes usar ML Kit para reconocer texto en imágenes o videos, como el texto de una señal de tránsito. Las características principales de esta función son las siguientes:
API de Text Recognition v2 | |
---|---|
Descripción | Reconoce texto en imágenes o videos, admite alfabetos latino, chino, devanagari, japonés y coreano, y una amplia variedad de idiomas. |
Nombres de SDK | GoogleMLKit/TextRecognition |
Implementación | Los recursos se vinculan de forma estática a tu app durante el tiempo de compilación |
Impacto del tamaño de la app | Aproximadamente 38 MB por SDK de secuencia de comandos |
Rendimiento | En tiempo real en la mayoría de los dispositivos para el SDK de la secuencia de comandos latina; más lento para otros. |
Probar
- Prueba la app de ejemplo para ver un ejemplo de uso de esta API.
- Prueba el código por tu cuenta con el Codelab.
Antes de comenzar
- Incluye los siguientes pods del ML Kit en tu Podfile:
# To recognize Latin script pod 'GoogleMLKit/TextRecognition', '3.2.0' # To recognize Chinese script pod 'GoogleMLKit/TextRecognitionChinese', '3.2.0' # To recognize Devanagari script pod 'GoogleMLKit/TextRecognitionDevanagari', '3.2.0' # To recognize Japanese script pod 'GoogleMLKit/TextRecognitionJapanese', '3.2.0' # To recognize Korean script pod 'GoogleMLKit/TextRecognitionKorean', '3.2.0'
- Después de instalar o actualizar los Pods de tu proyecto, abre el proyecto de Xcode a través de su
.xcworkspace
El Kit de AA es compatible con Xcode 12.4 o versiones posteriores.
1. Crea una instancia de TextRecognizer
.
Llama para crear una instancia de TextRecognizer
.
+textRecognizer(options:)
, pasando las opciones relacionadas con el SDK que declaraste como
dependencia de lo anterior:
Swift
// When using Latin script recognition SDK let latinOptions = TextRecognizerOptions() let latinTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Chinese script recognition SDK let chineseOptions = ChineseTextRecognizerOptions() let chineseTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Devanagari script recognition SDK let devanagariOptions = DevanagariTextRecognizerOptions() let devanagariTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Japanese script recognition SDK let japaneseOptions = JapaneseTextRecognizerOptions() let japaneseTextRecognizer = TextRecognizer.textRecognizer(options:options) // When using Korean script recognition SDK let koreanOptions = KoreanTextRecognizerOptions() let koreanTextRecognizer = TextRecognizer.textRecognizer(options:options)
Objective-C
// When using Latin script recognition SDK MLKTextRecognizerOptions *latinOptions = [[MLKTextRecognizerOptions alloc] init]; MLKTextRecognizer *latinTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Chinese script recognition SDK MLKChineseTextRecognizerOptions *chineseOptions = [[MLKChineseTextRecognizerOptions alloc] init]; MLKTextRecognizer *chineseTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Devanagari script recognition SDK MLKDevanagariTextRecognizerOptions *devanagariOptions = [[MLKDevanagariTextRecognizerOptions alloc] init]; MLKTextRecognizer *devanagariTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Japanese script recognition SDK MLKJapaneseTextRecognizerOptions *japaneseOptions = [[MLKJapaneseTextRecognizerOptions alloc] init]; MLKTextRecognizer *japaneseTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options]; // When using Korean script recognition SDK MLKKoreanTextRecognizerOptions *koreanOptions = [[MLKKoreanTextRecognizerOptions alloc] init]; MLKTextRecognizer *koreanTextRecognizer = [MLKTextRecognizer textRecognizerWithOptions:options];
2. Prepara la imagen de entrada
Pasa la imagen comoUIImage
o CMSampleBufferRef
a la
Método process(_:completion:)
de TextRecognizer
:
Crea un objeto VisionImage
con un objeto UIImage
o
CMSampleBuffer
Si usas un UIImage
, sigue estos pasos:
- Crea un objeto
VisionImage
conUIImage
. Asegúrate de especificar el.orientation
correcto.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
Si usas un CMSampleBuffer
, sigue estos pasos:
-
Especificar la orientación de los datos de imagen que se incluyen en la
CMSampleBuffer
Para obtener la orientación de la imagen, haz lo siguiente:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> UIImage.Orientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftMirrored : .right case .landscapeLeft: return cameraPosition == .front ? .downMirrored : .up case .portraitUpsideDown: return cameraPosition == .front ? .rightMirrored : .left case .landscapeRight: return cameraPosition == .front ? .upMirrored : .down case .faceDown, .faceUp, .unknown: return .up } }
Objective-C
- (UIImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationLeftMirrored : UIImageOrientationRight; case UIDeviceOrientationLandscapeLeft: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationDownMirrored : UIImageOrientationUp; case UIDeviceOrientationPortraitUpsideDown: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationRightMirrored : UIImageOrientationLeft; case UIDeviceOrientationLandscapeRight: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationUpMirrored : UIImageOrientationDown; case UIDeviceOrientationUnknown: case UIDeviceOrientationFaceUp: case UIDeviceOrientationFaceDown: return UIImageOrientationUp; } }
- Crea un objeto
VisionImage
con el elemento ObjetoCMSampleBuffer
y orientación:Swift
let image = VisionImage(buffer: sampleBuffer) image.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)
Objective-C
MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer]; image.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
3. Procesa la imagen
Por último, pasa la imagen al método process(_:completion:)
:
Swift
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // Error handling return } // Recognized text }
Objective-C
[textRecognizer processImage:image completion:^(MLKText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // Error handling return; } // Recognized text }];
4. Extrae texto de bloques de texto reconocido
Si la operación de reconocimiento de texto se ejecuta correctamente, se muestra
Objeto Text
. Un objeto Text
contiene el texto completo
reconocidos en la imagen y cero o más TextBlock
objetos.
Cada objeto TextBlock
representa un bloque rectangular de texto.
contener cero o más objetos TextLine
Cada TextLine
contiene cero o más objetos TextElement
,
que representan palabras y entidades similares, como fechas y números.
Para cada TextBlock
, TextLine
y
TextElement
, puedes obtener el texto reconocido en
región y las coordenadas que limitan la región.
Por ejemplo:
Swift
let resultText = result.text for block in result.blocks { let blockText = block.text let blockLanguages = block.recognizedLanguages let blockCornerPoints = block.cornerPoints let blockFrame = block.frame for line in block.lines { let lineText = line.text let lineLanguages = line.recognizedLanguages let lineCornerPoints = line.cornerPoints let lineFrame = line.frame for element in line.elements { let elementText = element.text let elementCornerPoints = element.cornerPoints let elementFrame = element.frame } } }
Objective-C
NSString *resultText = result.text; for (MLKTextBlock *block in result.blocks) { NSString *blockText = block.text; NSArray<MLKTextRecognizedLanguage *> *blockLanguages = block.recognizedLanguages; NSArray<NSValue *> *blockCornerPoints = block.cornerPoints; CGRect blockFrame = block.frame; for (MLKTextLine *line in block.lines) { NSString *lineText = line.text; NSArray<MLKTextRecognizedLanguage *> *lineLanguages = line.recognizedLanguages; NSArray<NSValue *> *lineCornerPoints = line.cornerPoints; CGRect lineFrame = line.frame; for (MLKTextElement *element in line.elements) { NSString *elementText = element.text; NSArray<NSValue *> *elementCornerPoints = element.cornerPoints; CGRect elementFrame = element.frame; } } }
Lineamientos para imágenes de entrada
-
Para que el Kit de AA reconozca con precisión el texto, las imágenes de entrada deben contener texto representado con suficientes datos de píxeles. Idealmente, cada carácter debe tener al menos 16x16 píxeles. Por lo general, no hay se beneficia de que los caracteres sean mayores que 24 x 24 píxeles.
Por ejemplo, una imagen de 640 x 480 podría funcionar bien para escanear una tarjeta que ocupa todo el ancho de la imagen. Para escanear un documento impreso en puede requerir una imagen de 720 x 1280 píxeles.
-
Un enfoque de imagen deficiente puede afectar la exactitud del reconocimiento de texto. Si no eres obtener resultados aceptables, intenta pedirle al usuario que vuelva a capturar la imagen.
-
Si reconoces texto en una aplicación en tiempo real, deberías considerar las dimensiones generales de las imágenes de entrada. Más pequeña las imágenes se pueden procesar más rápido. Para reducir la latencia, asegúrate de que el texto ocupe la mayor cantidad de y capturar imágenes con menores resoluciones (ten en cuenta la precisión los requisitos mencionados anteriormente). Para obtener más información, consulta Sugerencias para mejorar el rendimiento
Sugerencias para mejorar el rendimiento
- Para procesar fotogramas de video, usa la API síncrona
results(in:)
del detector. Llamada este método desde el DeAVCaptureVideoDataOutputSampleBufferDelegate
La funcióncaptureOutput(_, didOutput:from:)
para obtener resultados de un video determinado de forma síncrona marco. Mantener deAVCaptureVideoDataOutput
alwaysDiscardsLateVideoFrames
comotrue
para limitar las llamadas al detector Si un nuevo cliente El fotograma estará disponible mientras se ejecute el detector, que se descartará. - Si usas la salida del detector para superponer gráficos la imagen de entrada, primero obtén el resultado del ML Kit y, luego, renderiza la imagen y superponerla en un solo paso. De esta manera, renderizas en la superficie de visualización. solo una vez por cada trama de entrada procesada. Consulta updatePreviewOverlayViewWithLastFrame. en la muestra de inicio rápido del Kit de AA para ver un ejemplo.
- Intenta capturar imágenes con una resolución más baja. Sin embargo, también ten en cuenta los requisitos de dimensiones de imágenes de esta API.
- Para evitar una posible degradación del rendimiento, no ejecutes varias
Instancias
TextRecognizer
con diferentes opciones de secuencias de comandos de forma simultánea.