🧪 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 couleur 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 ; en ouvrant http://<IP> dans le navigateur, vous verrez :

  • Un rectangle coloré encadrant 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 sur 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 fonctionne 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-0x29X du centreint16 BE
0x2A-0x2BY du centreint16 BE
0x2C-0x2DID reconnuint16 BE

Code

Moteur de détection principal

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

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 → coordonnées en sortie I2C → possibilité de tri par servomoteur.

Chapitre suivant : Chapitre 7 : Scan de QR codes