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:

alt text

à

alt text

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

57
demandé sur Community 2011-01-16 22:40:20

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.

13
répondu Paul Sasik 2011-01-16 19:54:38

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

8
répondu Luca Del Tongo 2011-01-17 00:20:27

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.

3
répondu rodrigoap 2011-01-16 20:01:16

Voici comment je vous suggère de faire cette tâche. Lisez ma réponse détaillée ici .

  1. Convertissez-vous en échelle de gris.
  2. Gaussian Blur avec filtre 3x3 ou 5x5.
  3. appliquer un filtre de Sobel pour trouver les bords verticaux.

    Sobel(gray, dst, -1, 1, 0)

  4. Seuil l'image résultante pour obtenir une image binaire.
  5. appliquer un morphologiques opération de fermeture avec un élément structurant.
  6. trouver les contours de l'image résultante.
  7. trouver minAreaRect de chaque contour. Sélectionnez des rectangles en fonction du rapport d'aspect et de la surface minimale et maximale.
  8. 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.
  9. 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é.
  10. Clip ces portions rectangulaires détectées à partir d'une image après adaptiveThreshold de l'image originale (échelle de gris) et appliquer OCR.
2
répondu Abdul Fatir 2017-05-23 11:47:35

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 .

1
répondu 9000 2011-01-16 19:54:52

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

1
répondu Mircea 2011-01-16 21:58:18

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.

1
répondu AbstractDissonance 2011-01-17 01:10:51

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

1
répondu carlosdc 2017-05-23 10:29:57

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

1
répondu mrgloom 2012-08-10 09:32:08

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.

1
répondu Mayank 2017-05-23 11:55:16

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.

0
répondu Derrick Johnson 2014-01-17 22:45:04