Quels sont les bons algorithmes pour la plaque d'immatriculation de détection?
arrière-plan
pour mon dernier projet à l'université, je développe une application de détection de plaque d'immatriculation de véhicule. Je me considère comme un programmeur intermédiaire, mais mes connaissances en mathématiques manque de tout au-dessus de l'école secondaire, ce qui rend la production des bonnes formules plus difficile qu'il devrait probablement être.
j'ai passé beaucoup de temps à chercher des papiers académiques tels que:
- Détection des plaques D'immatriculation dans les Images
- détection de Plaque D'immatriculation robuste à L'aide de la salinité de L'Image
- amélioration locale de L'Image de la voiture pour la détection des plaques D'immatriculation
quand il s'agit des maths, je suis perdu. Grâce à ces tests, diverses images graphiques se sont avérées productives, par exemple:
à
cependant cette approche ne fonctionnait qu'à cette image particulière, et si les techniques étaient appliquées à des images différentes, je suis sûr qu'une conversion plus pauvre se produirait. J'ai lu au sujet d'une formule appelée la "transformation de morphologie de chapeau de fond", qui fait ce qui suit:
en gros, la formation trans garde tous les détails sombres de l'image, et élimine tout le reste (y compris les grandes régions sombres et les régions claires).
Je ne peux pas trouver beaucoup d'informations à ce sujet, mais l'image dans la documentation vers la fin du rapport montre son efficacité.
autres contraintes
- développement en C#
- Confiner le projet de royaume-UNI plaques d'immatriculation uniquement
- je peux choisir les images pour convertir en démonstration
Question
j'ai besoin de conseils sur les techniques de transformation que je dois mettre au point et sur les algorithmes qui peuvent m'aider.
modifier: nouvelle information présente sur suite-détection de la plaque D'immatriculation du véhicule
11 réponses
il y a un certain nombre d'approches que vous pouvez adopter, mais la première stratégie qui vient à l'esprit est la suivante:
- découverte/recherche: identifiez l'ensemble des couleurs et des polices que vous pourriez avoir besoin d'identifier. Si votre photo d'échantillon est représentative de la plupart des plaques Britanniques, alors votre travail est facilité. Par exemple: Simple, singulier font et le lettrage noir sur un fond blanc Code
- : tenter d'identifier une région rectangulaire d'une image où la les couleurs sont principalement blanc et noir. Ce n'est pas un problème très mathématique et ça devrait vous donner la région de plaque d'immatriculation sur laquelle vous concentrer.
- Code: faire un peu de nettoyage sur votre sous-région telle conversion en noir et blanc pur (monochrome) et peut-être l'échelle/se déplacer dans un joli rectangle serré.
- utiliser API: ensuite employer un algorithme OCR (Reconnaissance optique des caractères) existant sur votre région d'image sous-sélectionnée donc voir si vous pouvez lire la texte.
comme je l'ai dit, c'est une stratégie parmi tant d'autres, mais elle vient à l'esprit comme celle qui nécessite le moins de mathématiques lourdes... c'est-à-dire si vous pouvez trouver une implémentation ROC qui fonctionnera pour vous.
vous pouvez jeter un coup d'oeil à l'un des exemples emgucv qui vous montrent un monde réel exemples de travail de la détection de Plaque de véhicule à L'aide OCR
http://www.emgu.com/wiki/index.php/License_Plate_Recognition_in_CSharp
j'ai fait un projet similaire il y a quelques années en Java, d'abord j'ai appliqué le opérateur Sobel puis j'ai masqué toute l'image avec une image d'une plaque (avec l'opérateur Sobel appliqué aussi). La région de coïncidence maximale est où la plaque est. Ensuite, appliquez un roc à la région sélectionnée pour obtenir le numéro.
Voici comment je vous suggère de faire cette tâche. Lisez ma réponse détaillée ici .
- Convertissez-vous en échelle de gris.
- Gaussian Blur avec filtre 3x3 ou 5x5.
-
appliquer un filtre de Sobel pour trouver les bords verticaux.
Sobel(gray, dst, -1, 1, 0)
- Seuil l'image résultante pour obtenir une image binaire.
- appliquer un morphologiques opération de fermeture avec un élément structurant.
- trouver les contours de l'image résultante.
- trouver
minAreaRect
de chaque contour. Sélectionnez des rectangles en fonction du rapport d'aspect et de la surface minimale et maximale. - pour chaque contour choisi, trouver la densité des bords. Déterminez un seuil pour la densité de bordure et choisissez les rectangles qui franchissent ce seuil comme régions possibles de plaque.
- il restera peu de rectangles après cette. Vous pouvez les filtrer en fonction de l'orientation ou de tout critère que vous jugez approprié.
- Clip ces portions rectangulaires détectées à partir d'une image après
adaptiveThreshold
de l'image originale (échelle de gris) et appliquer OCR.
il s'agit clairement d'un problème de type vision par ordinateur. Jetez un oeil à OpenCV . C'est en C++, mais vous pourrez probablement s'y connecter d'une façon ou d'une autre .
le Royaume-Uni a déjà un système qui fait cela. Je me rappelle avoir vu une émission de télévision dans laquelle ils ont démontré qu'ils peuvent trouver une voiture à Londres en moins de 10 minutes (en supposant qu'ils connaissent le numéro et que la voiture circule).) Juste la lecture de Wikipedia vous donne les conseils dont vous avez besoin pour commencer à penser à la question: http://en.wikipedia.org/wiki/Automatic_number_plate_recognition
il vous dit exactement comment calculer la transformation de chapeau de fond(sorte de ressemble à une transformée de seuil graduée inversée pour moi).
la première chose à faire est de mettre en œuvre les deux fonctions morphologiques dilatation et érosion.
pour ce faire, vous avez besoin de votre f et b puis vous calculez la fonction sur une petite région de l'image à un point de garder la plus grande valeur trouvée.
(f ⊕ b)(s, t) = max{f (s − x, t − y) + b(x, y)
|(s − x), (t − y) ∈ Df ; (x, y)∈Db}
ce que cela dit est, prendre le maximum de l'expression sur tous les points dans la région de domaine(comme un petit rectangle centré à votre point (s,t).
simple pseudo code serait
max = -infinity // for the point (s,t) on the image, must compute this for all points
for(x = -5 to 5)
for(y = -5 to 5)
max = Max(max, f(s - x, t - y) + b(x,y))
effectivement nous avons maintenant une nouvelle image des valeurs max.
c'est en fait assez simple donc ne le rendez pas plus difficile qu'il ne l'est(nous ajoutons simplement b(x,y) à chaque point dans la région et trouver lequel donne la valeur maximale).
vous faites le de même pour l'érosion(très similaire à ci-dessus)
maintenant l'ouverture et la fermeture est la composition des deux
on peut y voir d'abord une dilatation puis une érosion pour une ouverture.
il est dit finalement soustraire la fermeture de l'image originale et vous devriez avoir votre transform.
si vous êtes intéressé par le problème de la détection de la présence d'une plaque d'immatriculation (plutôt que de la reconnaître), vous devriez probablement regarder la détection de texte dans les images car il est lié à ce que vous faites.
cette question est liée à la vôtre: algorithme pour détecter la présence de texte sur l'image
vous pouvez utiliser la détection de rectangle dans opencv ou des dispositifs similaires à la rame pour détecter les plaques qui sont également présentes dans l'opencv
vous pouvez également vous référer à Automatique de Reconnaissance de Plaque d'immatriculation de la bibliothèque & requête . Cela vous donnera également une idée de la façon d'aborder les choses,et de la façon dont les solutions existantes sont.
mais comme répondu par paul, vous devriez d'abord essayer de trouver la plaque rectangulaire de numéro de l'image complète et puis binarize et puis utiliser les bibliothèques OCR disponibles (Tesseract serait recommandé)
Vous pouvez vous référer à cette lien qui vous aidera à trouver la plaque rectangulaire. Vous devez utiliser les bibliothèques openCV, donc vous n'aurez pas besoin de beaucoup de mathématiques, mais oui une compréhension de base de ce qui se passe dans les coulisses peut vous aider à résoudre le problème d'une meilleure façon.
vous pouvez vérifier www.openalpr.com comme point de départ. Il utilise un certain nombre de techniques pour trouver et analyser la plaque d'immatriculation.