🧪 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