web-dev-qa-db-fra.com

Comment reconnaître la plaque d'immatriculation du véhicule (ANPR) à partir d'une image?

J'ai un site Web qui permet aux utilisateurs de télécharger des images de voitures et je voudrais mettre un filtre de confidentialité en place pour détecter les plaques d'immatriculation sur le véhicule et les estomper.

Le flou n'est pas un problème, mais existe-t-il une bibliothèque ou un composant (open source préféré) qui vous aidera à trouver une licence dans une photo?

Avertissements;

  1. Je sais que rien n'est parfait et la reconnaissance d'image de ce type fournira de faux positifs et négatifs.
  2. J'apprécie que nous puissions demander à l'utilisateur de sélectionner la zone à estomper et nous le ferons également, mais la question concerne spécifiquement la recherche de ces données par programme; les réponses telles que "demander à une personne de vérifier chaque image" ne sont pas utiles.
  3. Cette méthode logicielle est appelée "reconnaissance automatique de la plaque d'immatriculation" au Royaume-Uni, mais je ne vois aucune implémentation de celle-ci sous forme de bibliothèques.
  4. N'importe quelle langue est géniale bien que .Net soit préféré.
66
Ryan O'Neill

J'ai codé une version C # basée sur Java ANPR, mais j'ai changé les fonctions de la bibliothèque awt avec OpenCV. Vous pouvez le vérifier sur http://anprmx.codeplex.com

29
Jivan Miranda

[~ # ~] modifier [~ # ~] : J'ai écrit un script Python pour cela.

Comme votre objectif est flou (pour la protection de la vie privée), vous avez essentiellement besoin d'un détecteur rappel élevé dans un premier temps. Voici comment procéder. Les conseils de code inclus utilisent OpenCV avec Python.

  1. Convertissez en niveaux de gris.
  2. Appliquez le flou gaussien.

    img = cv2.imread('input.jpg',1)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img_gray = cv2.GaussianBlur(img_gray, (5,5), 0)  
    

Soit l'image d'entrée la suivante.

enter image description here

  1. Appliquer le filtre Sobel pour détecter les bords verticaux.
  2. Seuil l'image résultante en utilisant un seuil strict ou la binarisation d'OTSU.

    cv2.Sobel(image, -1, 1, 0)
    cv2.threshold() 
    
  3. Appliquer une opération de fermeture morphologique à l'aide d'un élément structurant approprié. (J'ai utilisé 16x4 comme élément structurant)

    se = cv2.getStructuringElement(cv2.MORPH_RECT,(16,4))
    cv2.morphologyEx(image, cv2.MORPH_CLOSE, se)  
    

Image résultante après l'étape 5.

enter image description here

  1. Trouvez les contours externes de cette image.

    cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 
    
  2. Pour chaque contour, trouvez la minAreaRect() la délimitant.

  3. Sélectionnez des rectangles en fonction du rapport d'aspect, de la zone minimale et maximale et de l'angle avec l'horizontale. (J'ai utilisé 2,2 <= Aspect Ratio <= 8, 500 <= Area <= 15000 et angle <= 45 degrés)

Toutes les minAreaRect() s sont affichées en orange et celle qui satisfait nos critères est en vert.

enter image description here

  1. Il peut y avoir des faux positifs après cette étape, pour le filtrer, utilisez la densité Edge. La densité des bords est définie comme le nombre de pixels blancs/nombre total de pixels dans un rectangle. Définissez un seuil pour la densité des bords. (J'ai utilisé 0,5)

enter image description here

  1. Flou les régions détectées.

enter image description here

Vous pouvez appliquer d'autres filtres que vous jugez appropriés pour augmenter le rappel et la précision. La détection peut également être entraînée en utilisant HOG + SVM pour augmenter la précision.

26
Abdul Fatir

Il y a une nouvelle bibliothèque open source sur GitHub qui fait ANPR pour les plaques américaines et européennes. Il semble assez précis et devrait faire exactement ce dont vous avez besoin (reconnaître les régions de la plaque). Voici le projet GitHub: https://github.com/openalpr/openalpr

13
Derrick Johnson

Je suis tombé sur celui-ci qui est écrit en Java javaANPR , je cherche également une bibliothèque c #.

Je voudrais un système où je peux pointer une caméra vidéo sur certains voiliers, qui ont tous de grands numéros identifiables, et lui permettre d'identifier les bateaux et d'envoyer un Tweet lorsqu'ils passent devant une caméra vidéo.

10
Bruce McLeod

J'ai fait une recherche sur ce sujet il y a quelques mois. Il y a pas mal d'articles sur ce sujet, mais je n'ai jamais trouvé d'implémentation open-source concrète. Il y a beaucoup d'implémentations commerciales cependant, mais aucune d'entre elles avec un devis, elles sont donc probablement assez chères.

8
Mauricio Scheffer

essayez ce système de reconnaissance de plaque d'immatriculation automatique simple

http://opos.codeplex.com/

Open source et écrit avec C #

5
Birol Kuyumcu

Jetez un oeil à Java ANPR . Reconnaissance gratuite de la plaque d'immatriculation ...

3
Ralph Wegner

Bibliothèque ANPR haute performance - http://www.dtksoft.com/dtkanpr.php . C'est commercial, mais ils fournissent une clé d'essai.

2
codeguru

Oui, j'utilise gocr à http://jocr.sourceforge.net/ c'est une application en ligne de commande que vous pouvez exécuter à partir de votre application. Je l'utilise dans quelques applications.

2
keyoke

http://licenseplate.sourceforge.net Python (je ne l'ai pas testé)

2
Somatik