🧪 Se publican nuevos tutoriales — del brazo robótico al sensor
Saltar al contenido
Comprar este productoTienda oficialSitio web oficial

Capítulo 6: Reconocimiento de colores ​

Comprar en la tienda

Objetivo de este capítulo: conseguir que NanoCam reconozca el color de los objetos de la imagen y obtener las coordenadas para aplicaciones como la clasificación.

Principio ​

Basado en el espacio de color HSV (tono-saturación-valor). La imagen RGB565 que emite la cámara se procesa con el motor ColorDetector de esp-dl: la imagen se escala a 80×80 para reducir el ruido y, píxel a píxel, se convierte a HSV para compararla con los umbrales de los 7 colores predefinidos.

Umbrales de color predefinidos (rango H estándar de OpenCV, escala 0-180) ​

ColorTono (H)Saturación (S)Valor (V)Umbral de área
Rojo0-1570-25590-25564
Amarillo23-3370-25590-25564
Verde34-7570-25590-25564
Azul97-12470-25590-25564
Púrpura125-15570-25590-25564
Blanco0-1800-40200-25580
Negro0-1800-2550-5080

El tono usa la escala 0-180 de OpenCV (correspondiente a 0-360°). set_bgr(false) asegura que la biblioteca lea los datos RGB565 tal cual, sin intercambiar canales.

Pasos ​

6.1 Entrar en el modo de color ​

Plain
ai_mode:3

El dispositivo se reinicia automáticamente y entra en el modo de detección de color; el LED RGB WS2812 (GPIO18) muestra el color reconocido en ese momento.

Consulta el manual del protocolo de puerto serie para ver todos los comandos.

6.2 Observar el resultado del reconocimiento ​

Coloca un objeto de color sólido delante de la cámara y abre http://<IP> en el navegador; verás:

  • Cuadros rectangulares de color que marcan la zona de color detectada
  • Texto de etiqueta de color (red/yellow/green/blue/purple/white/black)
  • El color del cuadro y de la etiqueta coincide con el color detectado real

El modo de color solo superpone información en la imagen (OSD) y no emite registros por el puerto serie. Para obtener coordenadas, léelas mediante los registros I2C.

6.3 Leer los datos de detección por I2C ​

NanoCam actúa como esclavo I2C (dirección 0x33, GPIO SDA=41 SCL=42) y actualiza en tiempo real las coordenadas del punto central del cuadro de detección.

RegistroContenidoTipo de dato
0x28-0x29Centro Xint16 BE
0x2A-0x2BCentro Yint16 BE
0x2C-0x2DID de reconocimientoint16 BE

Código ​

Motor de detección central ​

components/modules/ai/who_color_detection.cpp — basado en ColorDetector de esp-dl:

C++
// Crear el detector; set_bgr(false) asegura canales de color correctos
ColorDetector detector;
detector.set_bgr(false);
detector.set_detection_shape({80, 80, 1});
// Registrar los umbrales de 7 colores
detector.register_color({h_lo, h_hi, s_lo, s_hi, v_lo, v_hi}, area_min, "red");
// Detectar
auto &results = detector.detect((uint16_t *)frame->buf,
    {(int)frame->height, (int)frame->width, 3});

// Recorrer los resultados y dibujar cuadros + etiquetas
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);
    }
}

Resultado ​

Objeto rojo, verde o azul → se reconoce el color → cuadro + etiqueta → coordenadas por I2C → se puede conectar un servo para clasificar.

Capítulo siguiente: Capítulo 7: Escaneo de códigos QR