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 ne manquent de rien au-delà de l'école secondaire, ce qui rend la production des bonnes formules plus difficile qu'il ne le devrait probablement.
J'ai passé beaucoup de temps à chercher des documents académiques tels que:
En ce qui concerne le calcul, je suis perdu. Grâce à ces tests, différentes images graphiques se sont avérées productives, par exemple:
à
Cependant, cette approche ne fonctionnait que pour cette image particulière, et si les techniques étaient appliquées à différentes images, je suis sûr que la conversion serait plus médiocre. J'ai entendu parler d'une formule appelée "transformation de la morphologie du chapeau", qui a les effets suivants:
Fondamentalement, la transformation conserve 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 trouve pas beaucoup d’informations à ce sujet, mais l’image dans la documentation vers la fin du rapport montre son efficacité.
J'ai besoin de conseils sur les techniques de transformation sur lesquelles je devrais me concentrer et sur les algorithmes qui peuvent m'aider.
EDIT: Nouvelles informations présentes sur Suite - Détection de la plaque d'immatriculation du véhicule
Un certain nombre d'approches peuvent être adoptées, mais la première stratégie qui s'impose est la suivante:
Comme je l’ai dit plus tôt, c’est une stratégie parmi tant d’autres, mais c’est une stratégie qui nécessite le moins de calculs lourds… c’est-à-dire si vous pouvez trouver une implémentation OCR qui fonctionnera pour vous.
J'ai réalisé un projet similaire il y a quelques années à Java. J'ai d'abord appliqué l'opérateur Sobel puis masqué toute l'image avec l'image d'une plaque (avec l'opérateur Sobel également appliqué). La région de coïncidence maximale est celle où se trouve la plaque. Appliquez ensuite un OCR à la région sélectionnée pour obtenir le numéro.
Le Royaume-Uni a déjà un système qui le fait. Je me souviens d’avoir vu une émission télévisée dans laquelle ils montraient qu’ils pouvaient trouver une voiture à Londres en 10 minutes (s’ils connaissaient le numéro et que la voiture roulait). numéro: http://fr.wikipedia.org/wiki/Automatic_number_plate_recognition
Vous pouvez également vous référer à Bibliothèque de reconnaissance automatique de plaques d'immatriculation & cette requête . Cela vous donnera également une idée de la façon d’aborder les choses et des solutions existantes.
Mais comme Paul vous y a répondu, vous devez d'abord essayer de trouver la plaque d'immatriculation rectangulaire à partir de l'image complète, puis la binariser et d'utiliser les bibliothèques d'OCR disponibles (Tesseract serait recommandé).
Vous pouvez vous référer à ce link qui vous aidera à trouver la plaque rectangulaire. Vous devez utiliser les bibliothèques openCV, vous n’aurez donc pas besoin de beaucoup de mathématiques, mais une bonne compréhension de ce qui se passe dans les coulisses peut vous aider à résoudre le problème de manière plus efficace.
Il vous dit exactement comment calculer la transformation du bas du chapeau (pour moi, elle ressemble à une transformation de seuil gradué inversé).
La première chose à faire est de mettre en œuvre les deux fonctions de morphologie dilatation et érosion.
Pour ce faire, vous avez besoin de vos f et b, puis vous calculez la fonction sur une petite région de l’image en un point qui conserve 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}
Cela dit, prenez le maximum de l'expression sur tous les points de la région du domaine (comme un petit rectangle centré sur votre point (s, t).
pseudo-code simple 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 maximales.
C'est en fait assez simple, donc ne compliquez pas les choses (nous ajoutons simplement b (x, y) à chaque point de la région et recherchons celui qui donne la valeur maximale).
vous faites la même chose pour l'érosion (très semblable à ci-dessus)
Maintenant, l'ouverture et la fermeture est la composition des deux
Vous pouvez penser en premier lieu à une dilatation puis à une érosion pour une ouverture.
Il est dit enfin de soustraire la fermeture de l'image d'origine et vous devriez avoir votre transformation.
Si le problème de la détection de la présence d’une plaque d’immatriculation vous intéresse (par opposition à sa reconnaissance), vous devriez probablement regarder la détection de texte dans les images, car elle est liée à ce que vous faites.
Cette question concerne la vôtre: Algorithme permettant de détecter la présence de texte sur une image
Je suggère d'utiliser un service ou un tiers pour cela. Open ALPR fournit un package open source très précis pour ce service.
Open ALPR - https://www.openalpr.com/
Démo de la vidéo Open ALPR
https://www.youtube.com/watch?v=E-U_H9EbW60
Ou vous pouvez utiliser une API -
API Macgyver Computer Vision
https://askmacgyver.com/explore/program/license-plate-recognition/3X5D3d2k
Dans cette API, vous feriez simplement une demande de publication à -
Exemple de charge utile
{
id: "3X5D3d2k",
key: "free",
data: {
"image_url": "https://storage.googleapis.com/marketing-files/program-markdown-assets/license-detection/license-plate.jpg",
"country": "us",
"numberCandidates": 2
}
}
L'image ci-dessus renverrait ce qui suit -
"plate": "284FH8"
"confidence": 90.601013