🧪 Stanno arrivando nuovi tutorial — dal braccio robotico al sensore
Vai al contenuto
Acquista questo prodottoNegozio ufficialeSito ufficiale

Capitolo 6: Riconoscimento dei colori ​

Acquista nel negozio

Obiettivo del capitolo: far riconoscere a NanoCam il colore degli oggetti nell'immagine e ottenere le coordinate per applicazioni come lo smistamento.

Funzionamento ​

Basato sullo spazio colore HSV (tonalità-saturazione-valore). L'immagine RGB565 emessa dalla fotocamera viene elaborata dal motore ColorDetector di esp-dl: dopo aver ridotto l'immagine a 80×80 di risoluzione per attenuare il rumore, ogni pixel viene convertito in valore HSV e confrontato con le soglie predefinite di 7 colori.

Soglie di colore predefinite (intervallo H standard di OpenCV, scala 0-180) ​

ColoreTonalità (H)Saturazione (S)Valore (V)Soglia di area
Rosso0-1570-25590-25564
Giallo23-3370-25590-25564
Verde34-7570-25590-25564
Blu97-12470-25590-25564
Viola125-15570-25590-25564
Bianco0-1800-40200-25580
Nero0-1800-2550-5080

La tonalità utilizza la scala 0-180 di OpenCV (corrispondente a 0-360°). set_bgr(false) garantisce che la libreria legga i dati RGB565 così come sono, senza scambiare i canali.

Procedura ​

6.1 Entrare in modalità colore ​

Plain
ai_mode:3

Il dispositivo si riavvia automaticamente e passa alla modalità di rilevamento dei colori; il LED RGB WS2812 (GPIO18) mostra il colore attualmente riconosciuto.

Per tutti i comandi vedi il manuale del protocollo seriale.

6.2 Osservare il risultato del riconoscimento ​

Metti un oggetto di colore uniforme davanti alla fotocamera; aprendo http://<IP> nel browser vedrai:

  • Un riquadro colorato che delimita l'area del colore rilevato
  • Un'etichetta testuale del colore (red/yellow/green/blue/purple/white/black)
  • Il colore del riquadro e dell'etichetta corrisponde a quello effettivamente rilevato

La modalità colore esegue solo la sovrapposizione sull'immagine (OSD) e non produce log sulla porta seriale. Per ottenere le coordinate, leggile tramite i registri I2C.

6.3 Lettura dei dati di rilevamento via I2C ​

NanoCam opera come slave I2C (indirizzo 0x33, GPIO SDA=41 SCL=42) e aggiorna in tempo reale le coordinate del centro del riquadro rilevato.

RegistroContenutoTipo di dato
0x28-0x29Centro Xint16 BE
0x2A-0x2BCentro Yint16 BE
0x2C-0x2DID riconosciutoint16 BE

Codice ​

Motore di rilevamento principale ​

components/modules/ai/who_color_detection.cpp — basato su esp-dl ColorDetector:

C++
// costruisce il detector, set_bgr(false) garantisce i canali colore corretti
ColorDetector detector;
detector.set_bgr(false);
detector.set_detection_shape({80, 80, 1});
// registra le soglie dei 7 colori
detector.register_color({h_lo, h_hi, s_lo, s_hi, v_lo, v_hi}, area_min, "red");
// rilevamento
auto &results = detector.detect((uint16_t *)frame->buf,
    {(int)frame->height, (int)frame->width, 3});

// scorre i risultati disegnando riquadro + etichetta
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);
    }
}

Risultato ​

Oggetto rosso/verde/blu→riconoscimento del colore→riquadro + etichetta→coordinate in uscita via I2C→possibile collegare un servo per lo smistamento.

Capitolo successivo: Capitolo 7: Scansione codici QR