web-dev-qa-db-fra.com

iOS: OCR en temps réel en plus du flux de la caméra en direct (similaire à la carte-cadeau iTunes Redeem)

Existe-t-il un moyen d'accomplir quelque chose de similaire à ce que font les applications iTunes et App Store lorsque vous échangez une carte-cadeau à l'aide de l'appareil photo de l'appareil, en reconnaissant une courte chaîne de caractères en temps réel au-dessus du flux de caméra en direct?

iTunes App Redeem Gift Card UI

Je sais que dans iOS 7 il y a maintenant la classe AVMetadataMachineReadableCodeObject qui, AFAIK, ne représente que les codes-barres. Je suis plus intéressé par la détection et la lecture du contenu d'une chaîne courte. Est-ce possible à l'aide de méthodes API accessibles au public ou d'un autre SDK tiers que vous connaissez peut-être?

Il y a aussi une vidéo du processus en action:

https://www.youtube.com/watch?v=c7swRRLlYEo

Meilleur,

25
boliva

Je travaille sur un projet qui fait quelque chose de similaire à Apple app store racheter avec appareil photo comme vous l'avez mentionné.

Un excellent point de départ pour le traitement de la vidéo en direct est n projet que j'ai trouvé sur GitHub . Cela utilise le framework AVFoundation et vous implémentez les méthodes AVCaptureVideoDataOutputSampleBufferDelegate.

Une fois que vous avez le flux d'images (vidéo), vous pouvez utiliser OpenCV pour traiter la vidéo. Vous devez déterminer la zone de l'image que vous souhaitez OCR avant de l'exécuter via Tesseract. Vous devez jouer avec le filtrage, mais les grandes étapes que vous prenez avec OpenCV sont:

  • Convertissez les images en noir et blanc en utilisant cv :: cvtColor (inputMat, outputMat, CV_RGBA2GRAY);
  • Seuil les images pour éliminer les éléments inutiles. Vous spécifiez la valeur de seuil à éliminer, puis définissez tout le reste sur noir (ou blanc).
  • Déterminez les lignes qui forment la limite de la boîte (ou tout ce que vous traitez). Vous pouvez soit créer une "boîte englobante" si vous avez tout éliminé sauf la zone souhaitée, ou utiliser l'algorithme HoughLines (ou la version probabiliste, HoughLinesP). À l'aide de cela, vous pouvez déterminer l'intersection de lignes pour trouver des coins et utiliser les coins pour déformer la zone souhaitée pour la redresser en un rectangle approprié (si cette étape est nécessaire dans votre application) avant l'OCR.
  • Traitez la partie de l'image avec la bibliothèque OCR Tesseract pour obtenir le texte résultant. Il est possible de créer des fichiers de formation pour les lettres dans OpenCV afin que vous puissiez lire le texte sans Tesseract. Cela pourrait être plus rapide, mais cela pourrait également représenter beaucoup plus de travail. Dans le cas de l'App Store, ils font quelque chose de similaire pour afficher le texte lu superposé sur l'image d'origine. Cela ajoute au facteur cool, donc cela dépend juste de ce dont vous avez besoin.

Quelques autres conseils:

  • J'ai utilisé le livre "Instant OpenCV" pour commencer rapidement avec cela. C'était assez utile.
  • Téléchargez OpenCV pour iOS depuis OpenCV.org/downloads.html
  • J'ai trouvé que le seuillage adaptatif était très utile, vous pouvez tout lire à ce sujet en recherchant "OpenCV adaptiveThreshold". De plus, si vous avez une image avec très peu d'éléments intermédiaires entre les éléments clairs et sombres, vous pouvez utiliser Binarisation d'Ots . Cela détermine automatiquement les valeurs de seuil en fonction de l'histogramme de l'image en niveaux de gris.
16
Donovan

Ce fil de questions-réponses semble toujours être l'un des meilleurs résultats de recherche pour le sujet de l'OCR sur iOS, mais il est assez obsolète, j'ai donc pensé publier des ressources supplémentaires qui pourraient être utiles que j'ai trouvées à partir du moment d'écrire ce message:

Cadre de vision
https://developer.Apple.com/documentation/vision
À partir d'iOS 11, vous pouvez désormais utiliser le framework Vision basé sur CoreML inclus pour des choses comme la détection de rectangle ou de texte. J'ai constaté que je n'avais plus besoin d'utiliser OpenCV avec ces capacités incluses dans le système d'exploitation. Cependant, notez que la détection de texte n'est pas la même que la reconnaissance de texte ou OCR, vous aurez donc toujours besoin d'une autre bibliothèque comme Tesseract (ou peut-être votre propre modèle CoreML) pour traduire les parties détectées de l'image en texte réel.

SwiftOCR
https://github.com/garnele007/SwiftOCR
Si vous souhaitez simplement reconnaître les codes alphanumériques, cette bibliothèque OCR revendique des améliorations significatives en termes de vitesse, de consommation de mémoire et de précision par rapport à Tesseract (je ne l'ai pas essayé moi-même).

Kit ML
https://firebase.google.com/products/ml-kit/
Google a publié ML Kit dans le cadre de sa suite d'outils de développement Firebase, en version bêta au moment de la rédaction de cet article. Semblable au CoreML d'Apple, il s'agit d'un framework d'apprentissage machine qui peut utiliser vos propres modèles formés, mais qui possède également des modèles pré-formés pour les tâches de traitement d'image courantes comme Vision Framework. Contrairement à Vision Framework, celui-ci comprend également un modèle de texte sur l'appareil reconnaissance des caractères latins. Actuellement, l'utilisation de cette bibliothèque est gratuite pour la fonctionnalité sur l'appareil, avec des frais pour l'utilisation des offres cloud/API SAAS de Google. J'ai choisi d'utiliser cela dans mon projet, car la vitesse et la précision de la reconnaissance semblent assez bonnes, et je vais également créer une application Android avec les mêmes fonctionnalités, donc avoir une seule plateforme croisée la solution est idéale pour moi.

SDK de reconnaissance en temps réel ABBYY
https://rtrsdk.com/
Ce SDK commercial pour iOS et Android est téléchargeable gratuitement pour évaluation et utilisation commerciale limitée (jusqu'à 5000 unités au moment de la rédaction de cet article). Une utilisation commerciale supplémentaire nécessite un Licence étendue. Je n'ai pas évalué cette offre en raison de son prix opaque.

8
Francis Li

Il y a un projet similaire à celui sur github: https://github.com/Devxhkl/RealtimeOCR

4
zzzel

Le "temps réel" n'est qu'un ensemble d'images. Vous n'avez même pas besoin de penser à tous les traiter, juste assez pour représenter largement le mouvement de l'appareil (ou le changement de position de la caméra). Il n'y a rien dans le SDK iOS pour faire ce que vous voulez, mais vous pouvez utiliser une bibliothèque OCR tierce (comme Tesseract) pour traiter les images que vous prenez de la caméra.

4
Wain

J'examinerais Tesseract . Il s'agit d'une bibliothèque OCR open source qui prend les données d'image et les traite. Vous pouvez ajouter différentes expressions régulières et ne rechercher que des caractères spécifiques. Ce n'est pas parfait, mais d'après mon expérience, cela fonctionne plutôt bien. Il peut également être installé en tant que CocoaPod si vous êtes dans ce genre de chose.

Si vous vouliez capturer cela en temps réel, vous pourriez être en mesure d'utiliser GPUImage pour capturer des images dans le flux en direct et effectuer un traitement sur les images entrantes pour accélérer Tesseract en utilisant différents filtres ou en réduisant la taille ou qualité des images entrantes.

4
nbvikingsidiot001