web-dev-qa-db-fra.com

lire des chiffres et des lettres d'une image en utilisant openCV

Je développe une application pour lire les lettres et les chiffres d'une image en utilisant opencv en c ++. J'ai d'abord changé l'image couleur et le modèle de couleur donnés en image binaire, puis j'ai appelé la méthode cvMatchTemplate (). Cette méthode vient de mettre en évidence les zones où le modèle correspond .. Mais pas clair .. Je ne veux tout simplement pas voir la zone .. J'ai besoin d'analyser les caractères (lettres et chiffres) de l'image. Je suis nouveau sur openCV. Quelqu'un connaît-il une autre méthode pour obtenir le résultat ??

alt text

L'image est prise depuis l'appareil photo. l'exemple d'image est illustré ci-dessus. J'ai besoin d'obtenir tous les textes de l'écran LED (130 et Delft Tanthaf).

Amis, j'ai essayé avec l'exemple d'application de détection de visage, il détecte les visages. le fichier HaarCascade est fourni avec l'openCV. Je viens de charger ce fichier et j'ai appelé la méthode cvHaarDetectObjects (); Pour détecter les lettres, j'ai créé le fichier xml en utilisant l'application letter_recog.cpp fournie par openCV. Mais lorsque je charge ce fichier, il affiche une erreur (erreur OpenCV: erreur non spécifiée> dans une fonction inconnue, fichier ........\ocv\opencv\src\cxcore\cxpersistence.cpp, ligne 4720). J'ai recherché cette erreur sur le Web et j'ai obtenu les informations sur les fichiers lib utilisés. Je l'ai fait, mais l'erreur persiste. Est-ce l'erreur avec mon fichier xml ou en appelant la méthode pour charger ce fichier xml ((CvHaarClassifierCascade *) cvLoad ("nom du fichier xml construit", 0,0,0);) ?? s'il vous plaît AIDER ...

Merci d'avance

21
asifkt

Depuis OpenCV 3.0 (en dev actif), vous pouvez utiliser le module de détection d'objets "texte de scène" intégré ~

La détection de texte est basée sur ces deux articles:

Une fois que vous avez trouvé où se trouve le texte dans la scène, vous pouvez exécuter n'importe quel type d'OCR standard sur ces tranches (l'OCR Tesseract est courant). Et il y a maintenant un exemple de bout en bout dans opencv utilisant la nouvelle interface d'OpenCV vers Tesseract:

17
Kaolin Fire

La mise en correspondance de modèles a tendance à ne pas être robuste pour ce type d'application en raison d'incohérences d'éclairage, de changements d'orientation, de changements d'échelle, etc. La manière typique de résoudre ce problème consiste à introduire l'apprentissage automatique. Ce que vous essayez de faire en formant votre propre classificateur de boosting est une approche possible. Cependant, je ne pense pas que vous faites correctement la formation. Vous avez mentionné que vous lui avez donné 1 logo comme image d'entraînement positive et 5 autres images ne contenant pas le logo comme exemples négatifs? En règle générale, vous avez besoin d'échantillons de formation pour être de l'ordre de centaines ou de milliers ou plus. Vous ne pouvez pas vous entraîner avec 6 échantillons d'entraînement et vous attendre à ce que cela fonctionne.

Si vous n'êtes pas familier avec l'apprentissage automatique, voici à peu près ce que vous devez faire:

1) Vous devez collecter de nombreux échantillons d'apprentissage positifs (à partir d'une centaine mais généralement plus ils sont joyeux) de l'objet que vous essayez de détecter. Si vous essayez de détecter des caractères individuels dans l'image, obtenez des images recadrées de caractères individuels. Vous pouvez commencer avec la base de données MNIST pour cela. Mieux encore, pour former le classificateur à votre problème particulier, obtenez de nombreuses images recadrées des personnages sur le bus à partir de photos. Si vous essayez de détecter l'intégralité du panneau de la carte LED rectangulaire, utilisez-en des images comme échantillons d'entraînement positifs.

2) Vous devrez collecter de nombreux échantillons d'entraînement négatifs. Leur nombre doit être dans le même ordre que le nombre d'échantillons d'entraînement positifs dont vous disposez. Il peut s'agir d'images des autres objets qui apparaissent sur les images sur lesquelles vous exécuterez votre détecteur. Par exemple, vous pouvez recadrer des images de l'avant de l'autobus, des revêtements routiers, des arbres le long de la route, etc. et les utiliser comme exemples négatifs. C'est pour aider le classificateur à exclure ces objets dans l'image sur laquelle vous exécutez votre détecteur. Par conséquent, les exemples négatifs ne sont pas pas n'importe quelle image contenant des objets que vous ne voulez pas détecter . Ce doivent être des objets qui pourraient être confondus avec l'objet que vous essayez de détecter dans les images sur lesquelles vous exécutez votre détecteur (au moins pour votre cas).

Voir le lien suivant sur la façon de former la cascade de classificateurs et de produire le fichier de modèle XML: http://note.sonots.com/SciSoftware/haartraining.html

Même si vous avez mentionné que vous ne souhaitez détecter que les caractères individuels au lieu de l'ensemble du panneau LED sur le bus, je recommanderais d'abord de détecter le panneau LED afin de localiser la région contenant les caractères d'intérêt. Après cela, effectuez une correspondance de modèle dans cette région plus petite ou exécutez un classificateur formé pour reconnaître des caractères individuels sur des correctifs de pixels dans cette région obtenus en utilisant une approche de fenêtre coulissante, et éventuellement à plusieurs échelles. (Remarque: Le classificateur de renforcement de la haarcascade que vous avez mentionné ci-dessus détectera les personnages, mais il ne vous dira pas quel personnage il a détecté, sauf si vous ne le formez que pour détecter ce caractère particulier ...) vous l'ordre dans lequel les caractères apparaissent afin que vous puissiez les enchaîner en mots, etc.

J'espère que cela t'aides.

ÉDITER:

Je suis tombé par hasard sur mon ancien poste après avoir découvert séparément le module de texte de scène dans OpenCV 3 mentionné par @KaolinFire.

Pour ceux qui sont curieux, c'est le résultat de l'exécution de ce détecteur sur l'image échantillon donnée par l'OP. Notez que le détecteur est capable de localiser la zone de texte, même s'il renvoie plusieurs zones de délimitation.

Result of OpenCV 3 text detector.

Notez que cette méthode n'est pas infaillible ( au moins cette implémentation dans OpenCV avec les paramètres par défaut ). Il a tendance à générer des faux positifs, surtout lorsque l'image d'entrée contient de nombreux "distracteurs". Voici d'autres exemples obtenus à l'aide de ce détecteur de texte OpenCV 3 sur le jeu de données Google Street View:

Negative result 1Negative result 2Negative result 3Negative result 4

Notez qu'il a tendance à trouver du "texte" entre des lignes parallèles (par exemple, des fenêtres, des murs, etc.). Étant donné que l'image d'entrée de l'OP contiendra probablement des scènes extérieures, ce sera un problème surtout s'il ne restreint pas la région d'intérêt à une plus petite région autour des panneaux LED.

Il semble que si vous êtes en mesure de localiser une région "approximative" contenant uniquement le texte (par exemple, juste le signe LED dans l'exemple d'image de l'OP), l'exécution de cet algorithme peut vous aider à obtenir un cadre de délimitation plus serré. Mais vous devrez cependant gérer les faux positifs (peut-être éliminer les petites régions ou choisir parmi les zones de délimitation qui se chevauchent en utilisant une heuristique basée sur la connaissance de la façon dont les lettres apparaissent sur les panneaux LED).

Voici plus de ressources (discussion + code + jeux de données) sur la détection de texte.

Code

Jeux de données

Vous trouverez les jeux de données google streetview et MSRA ici. Bien que les images de ces jeux de données ne soient pas exactement les mêmes que celles des panneaux LED sur les bus, elles peuvent être utiles soit pour choisir l'algorithme le plus performant parmi plusieurs algorithmes concurrents, soit pour former un algorithme d'apprentissage automatique à partir de zéro.

http://www.iapr-tc11.org/mediawiki/index.php/Datasets_List

10
lightalchemist

Voir ma réponse à Comment lire l'heure à partir d'une vidéo de caméra de surveillance enregistrée? Vous pouvez/devez utiliser cvMatchTemplate() pour ce faire.

5
Adi Shavit

Si vous travaillez avec un ensemble fixe de destinations de bus, la correspondance des modèles fera l'affaire.

Cependant, si vous voulez que le système soit plus flexible, j'imagine que vous auriez besoin d'une certaine forme d'analyse de contour/forme pour chaque lettre individuelle.

1
kylestephens

Vous pouvez également consulter EAST: Efficient Scene Text Detector - https://www.learnopencv.com/deep-learning-based-text-detection-using-opencv-c-python/ Sous ce lien , vous avez des exemples avec C++ et Python. J'ai utilisé ce code pour détecter le nombre de bus (après avoir détecté que l'objet donné est un bus).

0
Artur