J'utilise OpenCV sur l'iPhone et j'ai besoin de détecter des nombres dans une image. J'ai divisé l'image en images plus petites afin que chaque image ait un seul numéro (1-9). Tous les numéros sont imprimés, PAS manuscrits.
Quelle serait la meilleure approche pour comprendre les chiffres avec OpenCV?
MISE À JOUR:
J'ai réussi à trouver les chiffres et à les extraire. Ils ressemblent à ceci:
http://img198.imageshack.us/img198/5671/101ht.jpg
http://img824.imageshack.us/img824/539/606yu.jpg
Lorsqu'elles sont extraites, elles sont de la même taille et ainsi de suite. J'ai enregistré un tas d'images et les ai placées dans un répertoire OCR où elles sont classées en nombres. Comme: ocr/1/100.jpg 101.jpg .... et ocr/2/200.jpg 201.jpg ....
Ensuite, j'allais utiliser la même approche que dans le didacticiel OCR de base: http://blog.damiles.com/?p=9
Cependant, je programme pour iPhone et ne peux pas utiliser de code C++ (erreur lors de la compilation et ainsi de suite) et je n'ai pas accès à highgui.
J'ai essayé d'utiliser cvMatchTemplate () et de faire correspondre un tas d'images mais cela semble fonctionner plutôt mal ...
D'autres idées que je peux essayer?
Vous pouvez commencer par lire des informations sur l'analyse en composantes principales (PCA), l'analyse discriminante linéaire de Fisher (LDA) et les machines à vecteurs de support (SVM). Ce sont des méthodes de classification qui sont extrêmement utiles pour l'OCR, et il existe des bibliothèques dans n'importe quel langage, y compris C++, Python, C # etc.
Il s'avère qu'OpenCV inclut déjà d'excellentes implémentations sur PCAs et SVMs . Je n'ai vu aucun exemple de code OpenCV pour l'OCR, mais vous pouvez utiliser une version modifiée de la classification des visages pour effectuer la classification des caractères. Une excellente ressource pour le code de reconnaissance faciale pour OpenCV est ce site Web .
Si les chiffres sont imprimés, le travail est assez simple, il vous suffit de trouver un bel ensemble de fonctionnalités à faire correspondre. Si les nombres sont une police, vous pouvez vous en sortir avec cette approche:
Faites cela pour un petit ensemble d'entraînement, prenez l'image `` moyenne '' pour chaque numéro
Pour les nouvelles images, suivez les étapes ci-dessus, mais la dernière n'est qu'une différence d'image absolue avec chacun des modèles de nombres. Prenez ensuite la somme des différences (pixels dans l'image de différence). Celui avec le minimum est votre numéro.
Toutes les opérations ci-dessus sont des opérations OpenCV de base.
Le moyen le plus simple et le plus pratique consiste peut-être à utiliser svm comme algorithme ml http://opencv.willowgarage.com/documentation/cpp/support_vector_machines.html et des images grises comme vecteurs de fonctionnalités.
Fondamentalement, votre problème consiste simplement à classer un vecteur d'entité, qui est l'ensemble des intensités de pixels après certaines étapes de prétraitement. Vous pouvez utiliser n'importe quel classificateur pour cette tâche, comme par exemple. les réseaux de neurones, qui devraient avoir une implémentation C à l'intérieur d'OpenCV. Vous pouvez également essayer une bibliothèque C libsvm pour les machines à vecteurs de support.
Il y a un bon site lié à ce problème avec beaucoup d'articles et une base de données de formation.
Objectif C++? Essayez de renommer vos fichiers .m en .mm et vous pourrez ensuite utiliser c ++ dans votre projet iPhone.
Les réseaux de neurones à convolution sont de loin les meilleurs algorithmes pour les chiffres écrits à la main. Ils sont implémentés dans la plupart des systèmes comme USPS, etc. Voici quelques articles expliquant les algorithmes. http://yann.lecun.com/exdb/lenet/
Tesseract est également un moteur OCR gratuit et agréable qui est facilement disponible pour iPhone et vous permet d'utiliser vos propres ensembles d'images de formation: http://tinsuke.wordpress.com/2011/11/01/how-to- compiler-et-utiliser-tesseract-3-01-on-ios-sdk-5 /
Ceci est un bon open source , c'est un ORCDemo sur iPhone.J'espère qu'il vous sera utile
OCR simple de reconnaissance de chiffres dans OpenCV-Python
Cela pourrait vous aider. La conversion du code de Python en C++ n'est pas une tâche difficile, car les API OpenCV sont les mêmes pour les deux.
HOG + SVM (Essayez de jouer avec les noyaux)