J’ai trouvé sur le subreddit  computervision un projet intéressant. Il s’agit d’un système de reconnaissance de cartes fonctionnant sur Raspberry pi 3 avec la bibliothèque OpenCV.

Une vidéo valant mieux qu’un grand discours, je vous laisse regarder une démonstration:

Comment ce système fonctionne, nous allons le découvrir:

Le système se décompose en 2 étapes, la détection et l’identification des cartes.

Reconnaissance de carte: 1 – Détection des cartes

La partie détection s’approche de la technique que nous avions mise en place pour la détection de dés .

Pour commencer, l’auteur convertit l’image en niveau de gris, pour ensuite effectuer un seuillage afin d’extraire les cartes.

Reconnaissance de carte : Image seuillée afin d'extraire les cartes de l'image

Image seuillée afin d’extraire les cartes de l’image

Ensuite, les contours des objets sont calculés. Seuls les grands contours sont conservés, correspondant aux contours des cartes.

Enfin le nombre de cartes peut ainsi être calculé en fonction du nombre de contours.

Reconnaissance de cartes: détection du nombre de cartes dans l'image

Détection du nombre de cartes dans l’image

Une fois toutes les cartes identifiées, il est possible d’étudier chaque carte afin d’en déterminer la valeur et l’enseigne (la couleur).

Reconnaissance de carte: 2 – Identification des cartes

Pour commencer, on extrait les quatre coins de la carte (cv2.approxPolyDP() ) et on utilise la fonction cv2.getPerspectiveTransform() afin d’obtenir une image rectifiée.

Reconnaissance de cartes: Image rectifié de la carte 8 de treffle

Image rectifié de la carte

Le coin supérieur droit est ensuite extrait est zoomé afin de pouvoir obtenir les informations de la carte. Cet extrait est ensuite seuillé et découpé en deux parties: le haut correspondant à la valeur et le bas à la couleur

Reconnaissance de carte: Traitements sur le coin supérieur droit de la carte

Traitements sur le coin supérieur droit de la carte

L’identification de la valeur et de la couleur repose sur le même principe:

On utilise un ensemble de 13 images de références pour les valeurs (4 pour les couleurs), de même taille que la zone extraite (en bleu pour le chiffre, en marron pour l’enseigne).

Pour chaque nouvelle carte, nous allons comparer le nombre (l’enseigne) de la carte avec les 13 (4) images de références. Pour ce faire l’auteur utilise la fonction cv2.absdiff(), calculant la différence absolue entre les deux images. Il calcul ensuite la somme de tous les pixels différents.

Reconnaissance de cartes: Différences de cartes As - 8 (gauche) - 8-8 (droite)

Différences des cartes As – 8 (gauche) – 8-8 (droite)

La différence d’image donnant la somme la plus faible signifie que la valeur que l’on cherche est celle de la carte de référence.

Conclusion

A partir d’un ensemble de fonctions d’OpenCV, l’auteur de ce code arrive d’une façon simple mais efficace d’identifier les cartes présentes sur la table, filmée avec une caméra et un Raspberry. Le système fonction à 4 -5 images par seconde, sachant qu’une grosse partie des ressources est utilisée pour l’affichage graphique.

Vous souhaitez vous lancer ?


0 commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.