iOS: OCR en time real en la parte superior de la alimentación de camera en vivo (similar a la tarjeta de regalo de Canje de iTunes)

¿Hay alguna forma de lograr algo similar a lo que hacen las aplicaciones de iTunes y App Store cuando canjea una tarjeta de regalo con la camera del dispositivo, reconociendo una cadena corta de caracteres en time real además de la transmisión de camera en vivo?

iTunes App Canjear UI de tarjeta de regalo

Sé que en iOS 7 ahora hay la class AVMetadataMachineReadableCodeObject que, AFAIK, solo representa códigos de barras. Estoy más interesado en detectar y leer el contenido de una cadena corta. ¿Es posible utilizar methods de API disponibles públicamente o algún otro SDK de terceros que pueda conocer?

También hay un video del process en acción:

Mejor,

Estoy trabajando en un proyecto que hace algo similar a la tienda de aplicaciones de Apple canjear con la camera como mencionaste.

Un gran lugar para comenzar a procesar video en vivo es un proyecto que encontré en GitHub . Esto está utilizando el marco AVFoundation e implementa los methods AVCaptureVideoDataOutputSampleBufferDelegate.

Una vez que tenga la secuencia de imágenes (video), puede usar OpenCV para procesar el video. Debe determinar el área en la image que desea OCR antes de ejecutarlo a través de Tesseract. Tienes que jugar con el filtrado, pero los pasos generales que tomas con OpenCV son:

  • Convierta las imágenes a B & W usando cv :: cvtColor (inputMat, outputMat, CV_RGBA2GRAY);
  • Umbral de imágenes para eliminar elementos innecesarios. Usted especifica el valor umbral para eliminar y luego establece todo lo demás en negro (o blanco).
  • Determine las líneas que forman el límite del cuadro (o lo que sea que esté procesando). Puede crear un "cuadro delimitador" si ha eliminado todo less el área deseada, o puede usar el algorithm HoughLines (o la versión probabilística, HoughLinesP). Utilizando esto, puede determinar la intersección de línea para encontrar esquinas, y usar las esquinas para deformar el área deseada para enderezarla en un rectángulo apropiado (si este paso es necesario en su aplicación) antes del OCR.
  • Procese la parte de la image con la biblioteca OCR de Tesseract para get el text resultante. Es posible crear files de entrenamiento para letras en OpenCV para que pueda leer el text sin Tesseract. Esto podría ser más rápido, pero también podría ser mucho más trabajo. En el caso de App Store, están haciendo algo similar para mostrar el text que se leyó superpuesto sobre la image original. Esto agrega al factor genial, entonces depende de lo que necesites.

Algunos otros consejos:

  • Utilicé el libro "Instant OpenCV" para comenzar rápidamente con esto. Fue bastante útil
  • Descarga OpenCV para iOS desde OpenCV.org/downloads.html
  • He encontrado que el umbral adaptativo es muy útil, puedes leerlo al search "OpenCV adaptiveThreshold". Además, si tiene una image con muy poco entre elementos claros y oscuros, puede usar la Binarización de Otsu . Esto determina automáticamente los valores de umbral basados ​​en el histogtwig de la image en escala de grises.

'Tiempo real' es solo un set de imágenes. Ni siquiera necesita pensar en procesarlos, lo suficiente como para representar ampliamente el movimiento del dispositivo (o el cambio en la position de la camera). No hay nada integrado en el SDK de iOS para hacer lo que desea, pero puede usar una biblioteca de OCR de terceros (como Tesseract) para procesar las imágenes que toma de la camera.

Me gustaría ver a Tesseract . Es una biblioteca de OCR de código abierto que toma datos de imágenes y los procesa. Puede agregar diferentes expresiones regulares y solo search caracteres específicos también. No es perfecto, pero desde mi experiencia funciona bastante bien. También se puede instalar como un CocoaPod si te gusta ese tipo de cosas.

Si quisieras capturar eso en time real, podrías usar GPUImage para capturar imágenes en la transmisión en vivo y procesar las imágenes entrantes para acelerar Tesseract usando diferentes filters o networkinguciendo el tamaño o la calidad de las imágenes entrantes.

Hay un proyecto similar al de github: https://github.com/Devxhkl/RealtimeOCR