Amélioration de la reconnaissance de la canette Coca-Cola : algorithme C++

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : pourquoi reconnaître une canette Coca-Cola est plus difficile qu'il n'y paraît

Imaginez : vous programmez un robot qui doit trier automatiquement les déchets. Ou un système qui compte le nombre de produits sur une étagère. L'une des tâches les plus populaires lors des entretiens et dans les projets d'étude est la reconnaissance de la canette Coca-Cola. Cela semble simple, non ? Un cylindre rouge vif avec une inscription blanche. Mais en pratique, tout est différent.

Sur Stack Overflow, la question "Image Processing: Algorithm Improvement for 'Coca-Cola Can' Recognition" a rassemblé des milliers de vues et des dizaines de réponses. Les programmeurs se sont heurtés au problème : comment distinguer de manière fiable une canette d'autres objets rouges (extincteur, tasse rouge, morceau de plastique) dans différentes conditions d'éclairage ?

Dans cet article, nous ne nous contenterons pas de donner un code prêt à l'emploi en C++ utilisant OpenCV. Nous analyserons étape par étape les algorithmes de traitement d'images qui transforment un flux vidéo brut en une reconnaissance fiable. Vous apprendrez comment améliorer la précision de la détection, éviter les faux positifs et écrire un code qui fonctionne en temps réel.



Le problème : pourquoi les méthodes simples ne fonctionnent pas

L'erreur typique d'un débutant est d'essayer de trouver un objet uniquement par la couleur. Par exemple, isoler tous les pixels rouges et trouver parmi eux le plus grand contour. Mais :

  • L'éclairage change — la couleur rouge sous une lampe fluorescente et sous le soleil semble différente.
  • Les reflets sur le métal — la canette réfléchit la lumière et sa couleur peut sembler blanche ou orange.
  • L'arrière-plan est bruyant — les t-shirts rouges, les chaises, les panneaux publicitaires perturbent le détecteur.
  • La forme est déformée — la canette peut être tournée, partiellement cachée ou déformée.

C'est pourquoi l'amélioration de l'algorithme de reconnaissance n'est pas simplement un réglage de seuils, mais une combinaison de méthodes : filtrage couleur, recherche de contours, analyse de la forme et des textures.



Architecture de la solution : des pixels à la décision

Nous construirons un pipeline en trois étapes :

  1. Prétraitement — flou, conversion en HSV, morphologie.
  2. Segmentation — extraction des candidats par couleur et contours.
  3. Vérification — filtrage par rapport d'aspect, surface, caractéristiques de texture.

Cette approche est utilisée en vision par ordinateur C++ pour des tâches industrielles — du tri de pièces au contrôle qualité.



Étape 1 : Filtrage couleur en HSV

La première et la plus importante étape consiste à convertir l'image de RVB en HSV (Teinte, Saturation, Valeur). Pourquoi ? Parce que HSV sépare la couleur (teinte) de la luminosité. Cela permet de définir une plage pour la couleur rouge qui fonctionnera sous différents éclairages.

#include <opencv2/opencv.hpp>using namespace cv;

Mat hsv, mask;cvtColor(src, hsv, COLOR_BGR2HSV);

// Plage pour la couleur rouge (deux intervalles à cause de la cyclicité de HSV)Scalar lower_red1 = Scalar(0, 70, 50);Scalar upper_red1 = Scalar(10, 255, 255);Scalar lower_red2 = Scalar(170, 70, 50);Scalar upper_red2 = Scalar(180, 255, 255);

Mat mask1, mask2;inRange(hsv, lower_red1, upper_red1, mask1);inRange(hsv, lower_red2, upper_red2, mask2);mask = mask1 | mask2;

Notez : la couleur rouge se trouve à la limite de HSV (0 et 180 degrés), nous avons donc besoin de deux plages. Les paramètres Saturation (70) et Valeur (50) éliminent les pixels trop pâles ou trop sombres.



Étape 2 : Morphologie et recherche de contours

Après le masque, nous obtenons une image binaire, mais elle contient du bruit. Nous appliquons une fermeture morphologique (closing) pour remplir les trous à l'intérieur de la canette, et une ouverture (opening) pour supprimer les petits points.

Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(5, 5));morphologyEx(mask, mask, MORPH_CLOSE, kernel);morphologyEx(mask, mask, MORPH_OPEN, kernel);                

Blogs

Book Recommendations