OpenCV détecter les numéros de
Je suis en utilisant OpenCV sur l'iPhone et la nécessité de détecter les numéros dans une image. Je divise l'image en plusieurs petites images de sorte que chaque image a un seul chiffre (1-9). Tous les numéros sont imprimés, PAS écrit à la main.
Quelle serait la meilleure approche pour comprendre les nombres avec OpenCV?
Mise à JOUR:
J'ai réussi à trouvé les chiffres et les extraits d'eux. Ils ressemblent à ceci:
http://img198.imageshack.us/img198/5671/101ht.jpg
http://img824.imageshack.us/img824/539/606yu.jpg
Lorsqu'ils sont extraits, ils sont de la même taille et ainsi de suite. J'ai sauvé un tas d'images et les mettre dans un ROC dir où ils sont classés dans les numéros. Comme: ocr/1/100.jpg 101.jpg.... et ocr/2/200.jpg 201.jpg....
Alors que j'allais utiliser la même approche que dans la Base de ROC tutoriel:http://blog.damiles.com/?p=93
Cependant, je suis à la programmation pour iPhone et ne peut pas utiliser du code C++ (erreur sur la compilation et ainsi de suite) et je n'ai pas accès à highgui.
J'ai essayé d'utiliser cvMatchTemplate() et correspondent à un tas d'images, mais il semble fonctionner assez mauvais...
Toutes les autres idées que je peux essayer?
- Base de ROC dans opencv
- Je vous remercie. Je l'ai lu avant que. Il est de faire de l'OCR sur l'écriture manuscrite numérique. Va le train des images du bon travail pour le texte imprimé ainsi?
- Il fonctionnera beaucoup mieux. Il est toujours plus facile avec des formes régulières
- Bien sûr, mais ensuite je vais devoir trouver de former des images pour l'impression des numéros et non pas de l'écriture manuscrite numérique, droit?
- Oui - tout simplement de générer une série d'images avec vos numéros dans la police, la taille, etc
- Je viens de mettre à jour le premier post avec un peu plus d'info à propos de mes questions...
- Avez-vous déjà essayé de différencier les nombres & caractères dans une image, c'est à dire uniquement obtenir des numéros à partir d'une image OU quelque chose dans le tableau unidimensionnel de contours à l'aide :findContours. Je suis en train de les différencier des nombres de char. S'il vous plaît laissez-moi savoir, si la suggestion à partir de votre fin.
Vous devez vous connecter pour publier un commentaire.
Vous pourriez commencer par lire à propos de l'Analyse en composantes Principales (PCA), de Fisher de l'Analyse Discriminante Linéaire (LDA), et les Support Vector Machines (SVMs). Ce sont des méthodes de classification qui sont extrêmement utiles pour l'OCR, et il y a des bibliothèques dans n'importe quelle langue, y compris C++, Python, C#, etc
Il s'avère que OpenCV comprend déjà excellent implémentations sur Apc et Les SVMs. Je n'ai pas vu de OpenCV exemples de code pour l'OCR, mais vous pouvez utiliser une version modifiée de la classification des faces pour effectuer la classification des caractères. Une excellente ressource pour le visage, le code de reconnaissance pour OpenCV est ce site internet.
Si les numéros sont imprimés, le travail est assez simple, vous avez juste besoin de trouver un joli ensemble de fonctionnalités pour correspondre. Si les chiffres sont une police, vous pouvez vous en sortir avec cette approche:
Le faire pour un petit entraînement, prendre la "moyenne" de l'image pour chaque numéro
De nouvelles images, suivez les étapes ci-dessus, mais le dernier est juste une absolue de l'image de différence de chaque numéro-modèles. Prendre ensuite la somme des différences (les pixels dans l'image de différence). L'un avec le minimum est de votre numéro.
Tous les ci-dessus sont à la base d'OpenCV opérations.
En fait votre problème, c'est juste pour la classification d'une fonction vectorielle, qui est l'ensemble des intensités des pixels après quelques étapes de prétraitement. Vous pouvez utiliser un classificateur pour cette tâche, comme par exemple. les réseaux de neurones, qui doit avoir un C mise en œuvre à l'intérieur de OpenCV. Vous pouvez également essayer un C libsvm bibliothèque pour les Machines à Vecteurs de Support.
Il y a un bon site liées à ce problème avec beaucoup de papiers et une formation de base de données.
Peut-être le plus simple et pratique façon est d'utiliser des svm en ml d'algorithme
http://opencv.willowgarage.com/documentation/cpp/support_vector_machines.html
et de gris des images comme des vecteurs.
Objective-C++?
Essayez de renommer vos .m de fichiers .mm et vous pouvez alors utiliser c++ dans votre iPhone projet.
Convolution des Réseaux de Neurones sont de loin les meilleurs algorithmes pour les chiffres écrits à la main. La sont mises en œuvre dans la plupart des systèmes comme USPS etc. Voici quelques documents expliquant les algorithmes.
http://yann.lecun.com/exdb/lenet/
C'est une belle open source ,C'est un ORCDemo sur iPhone.J'espère que c'est utile pour vous
Simple Chiffre Reconnaissance OCR dans OpenCV-Python
Cela peut vous aider. La conversion du code de Python pour le C++ n'est pas une tâche difficile, puisque OpenCV de l'API sont les mêmes pour les deux.
Tesseract est aussi un bon OCR gratuit moteur, qui est disponible pour l'iPhone et vous permet d'utiliser vos propres jeux de la formation des images:
http://tinsuke.wordpress.com/2011/11/01/how-to-compile-and-use-tesseract-3-01-on-ios-sdk-5/
PORC + SVM (Essayez de jouer avec les noyaux)