Puedes usar el Kit de AA para reconocer texto en imágenes o videos, como el de una señal de tránsito. Las características principales de esta función son las siguientes:
API de reconocimiento de texto | |
---|---|
Descripción | Reconoce texto con alfabeto latino en imágenes o videos. |
Nombre del SDK | GoogleMLKit/TextRecognition (version 2.2.0) |
Implementación | Los recursos se vinculan estáticamente a tu aplicación en el momento de la compilación. |
Impacto en el tamaño de la app | Cerca de 20 MB |
Rendimiento | En tiempo real en la mayoría de los dispositivos. |
Probarlo
- Juega con la app de muestra para ver un ejemplo de uso de esta API.
- Prueba tú mismo el código con el codelab.
Antes de comenzar
- Incluye los siguientes pods de ML Kit en tu Podfile:
pod 'GoogleMLKit/TextRecognition','2.2.0'
- Después de instalar o actualizar los pods de tu proyecto, abre el proyecto de Xcode con su
.xcworkspace
. El Kit de AA es compatible con Xcode 12.4 o versiones posteriores.
1. Crea una instancia de TextRecognizer
.
Crea una instancia de TextRecognizer
mediante una llamada a +textRecognizer
:
Swift
let textRecognizer = TextRecognizer.textRecognizer()
Objective‑C
MLKTextRecognizer *textRecognizer = [MLKTextRecognizer textRecognizer];
2. Prepara la imagen de entrada
Pasa la imagen comoUIImage
o CMSampleBufferRef
al método process(_:completion:)
de TextRecognizer
:
Crea un objeto VisionImage
con un UIImage
o CMSampleBuffer
.
Si usas un UIImage
, sigue estos pasos:
- Crea un objeto
VisionImage
con elUIImage
. Asegúrate de especificar la.orientation
correcta.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:
-
Especifica la orientación de los datos de imagen que se encuentran en
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 objeto y la orientaciónCMSampleBuffer
: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
Luego, 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 mostrará un objeto Text
. Un objeto Text
contiene el texto completo reconocido en la imagen, y cero o más objetos TextBlock
.
Cada TextBlock
representa un bloque rectangular de texto que contiene cero o más objetos TextLine
. Cada objeto TextLine
contiene cero o más objetos TextElement
que representan palabras y entidades similares, como fechas y números.
Para cada objeto TextBlock
, TextLine
y TextElement
, puedes obtener el texto reconocido en la 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 ingresar imágenes
-
Para que el Kit de AA reconozca con precisión el texto, las imágenes de entrada deben contener texto que esté representado por suficientes datos de píxeles. Lo ideal es que cada carácter sea de al menos 16x16 píxeles. Por lo general, no existe un beneficio de precisión para los caracteres que superen los 24 × 24 píxeles.
Por ejemplo, una imagen de 640 × 480 podría funcionar bien para escanear una tarjeta de presentación que ocupa todo el ancho de la imagen. Para escanear un documento impreso en papel de tamaño carta, es posible que se requiera una imagen de 720 × 1280 píxeles.
-
Un enfoque de imagen deficiente puede afectar la exactitud del reconocimiento de texto. Si no obtienes resultados aceptables, intenta pedirle al usuario que vuelva a capturar la imagen.
-
Si reconoces texto en una aplicación en tiempo real, debes considerar las dimensiones generales de las imágenes de entrada. Las imágenes más pequeñas se pueden procesar más rápido. Para reducir la latencia, asegúrate de que el texto ocupe la mayor parte de la imagen y captura las imágenes en resoluciones más bajas (ten en cuenta los requisitos de exactitud mencionados anteriormente). Si quieres 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. Llama a este método desde la funcióncaptureOutput(_, didOutput:from:)
deAVCaptureVideoDataOutputSampleBufferDelegate
para obtener resultados de manera síncrona desde el marco de video determinado. Mantén elalwaysDiscardsLateVideoFrames
deAVCaptureVideoDataOutput
comotrue
para regular las llamadas al detector. Si hay un fotograma de video nuevo disponible mientras se ejecuta el detector, se descartará. - Si usas la salida del detector para superponer gráficos en la imagen de entrada, primero obtén el resultado del Kit de AA y, luego, procesa la imagen y la superposición en un solo paso. De esta manera, procesas en la superficie de visualización solo una vez por cada fotograma de entrada procesado. Consulta la updatePreviewOverlayViewWithLastFrame en la muestra de inicio rápido del Kit de AA para ver un ejemplo.
- Considere la opción de 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.