🧪 De nouveaux tutoriels arrivent — du bras robotique au capteur
Aller au contenu

Chapitre 6 : Reconnaissance des couleurs ​

Acheter en boutique

Objectif de ce chapitre : faire reconnaître la couleur des objets par le NanoCam et récupérer les coordonnées pour des applications comme le tri.

Principe ​

Basé sur l'espace colorimétrique HSV (teinte-saturation-valeur). L'image RGB565 fournie par la caméra est traitée par le moteur ColorDetector d'esp-dl : l'image est réduite à une résolution 80×80 pour réduire le bruit, puis chaque pixel est converti en valeurs HSV et comparé aux seuils prédéfinis des 7 couleurs.

Seuils de couleurs prédéfinis (plage H standard OpenCV, échelle 0-180) ​

CouleurTeinte (H)Saturation (S)Valeur (V)Seuil de surface
Rouge0-1570-25590-25564
Jaune23-3370-25590-25564
Vert34-7570-25590-25564
Bleu97-12470-25590-25564
Violet125-15570-25590-25564
Blanc0-1800-40200-25580
Noir0-1800-2550-5080

La teinte utilise l'échelle OpenCV 0-180 (correspondant à 0-360°). set_bgr(false) garantit que la bibliothèque lit les données RGB565 telles quelles, sans échanger les canaux.

Étapes ​

6.1 Passer en mode couleur ​

Plain
ai_mode:3

L'appareil redémarre automatiquement en mode détection de couleur ; la LED RGB WS2812 (GPIO18) affiche la couleur actuellement reconnue.

Pour la liste complète des commandes, voir le Manuel du protocole série.

6.2 Observer les résultats de reconnaissance ​

Placez un objet de couleur unie devant la caméra ; ouvrez http://<IP> dans le navigateur, vous verrez :

  • Un rectangle coloré délimitant la zone de couleur détectée
  • Une étiquette de couleur (red/yellow/green/blue/purple/white/black)
  • La couleur du cadre et de l'étiquette correspond à la couleur réellement détectée

Le mode couleur ne fait qu'une superposition à l'image (OSD), sans journaux sur le port série. Pour obtenir les coordonnées, lisez-les via les registres I2C.

6.3 Lire les données de détection en I2C ​

Le NanoCam agit comme esclave I2C (adresse 0x33, GPIO SDA=41 SCL=42) et met à jour en temps réel les coordonnées du centre du cadre de détection.

RegistreContenuType de donnée
0x28-0x29Centre Xint16 BE
0x2A-0x2BCentre Yint16 BE
0x2C-0x2DID reconnuint16 BE

Code ​

Moteur de détection principal ​

components/modules/ai/who_color_detection.cpp — basé sur esp-dl ColorDetector :

C++
// Créer le détecteur ; set_bgr(false) garantit des canaux de couleur corrects
ColorDetector detector;
detector.set_bgr(false);
detector.set_detection_shape({80, 80, 1});
// Enregistrer les seuils des 7 couleurs
detector.register_color({h_lo, h_hi, s_lo, s_hi, v_lo, v_hi}, area_min, "red");
// Détection
auto &results = detector.detect((uint16_t *)frame->buf,
    {(int)frame->height, (int)frame->width, 3});

// Parcourir les résultats pour dessiner cadres + étiquettes
for (int ci = 0; ci < (int)results.size(); ci++) {
    for (int ri = 0; ri < (int)results[ci].size(); ri++) {
        color_detect_result_t &res = results[ci][ri];
        draw_rect(frame, res.box[0], res.box[1], res.box[2], res.box[3], color_lcd);
        fb_gfx_print(frame, lx, ly, color_lcd, color_name);
    }
}

Résultat ​

Objet rouge, vert ou bleu → reconnaissance de la couleur → cadre + étiquette → sortie des coordonnées en I2C → possibilité de tri par servomoteur.

Chapitre suivant : Chapitre 7 : Scan de QR codes