Ir al contenido

← Todas las funcionalidades

Inspección visual (visión artificial)Raspberry Pi + cámara USBUSB/V4L2Visión artificial

Un pipeline de preprocesado OpenCV para inspección automática de impresión

Comprobar a ojo el marcaje impreso de cada pieza es lento y poco fiable — y exactamente el tipo de tarea que una Raspberry Pi con cámara USB hace bien. Este pipeline de inspección de calidad con OpenCV, tomado de un despliegue real de inspección visual en línea de producción, aísla la pieza del fondo y binariza su impresión para poder compararla con una referencia golden. Cada etapa — escala de grises, blur, umbralización, morfología, CLAHE, umbral adaptativo — son unas pocas líneas de Python que se ajustan con seis parámetros.

Del frame en bruto a un recorte limpio de la pieza

La cámara ve una pieza clara sobre fondo oscuro, así que un cv2.threshold fijo tras un blur gaussiano separa ambos de forma fiable. La apertura morfológica (open) elimina motas, el cierre (close) rellena huecos, y el contorno más grande da el bounding box de la pieza. Recortar a esa caja descarta todo lo que no es la pieza — la mayor ganancia de robustez de todo el pipeline.

CLAHE más umbral adaptativo supera a la umbralización global

La iluminación en fábrica nunca es uniforme: reflejos, sombras del operario, cambios de luz natural a lo largo del turno. CLAHE ecualiza el contraste localmente dentro del recorte, y cv2.adaptiveThreshold binariza después la impresión usando el vecindario de cada píxel en lugar de un único valor global. Un medianBlur intermedio elimina el ruido de sal sin comerse los bordes. El resultado es una imagen en blanco y negro estable del marcaje, casi independiente de la luz ambiente — exactamente la entrada que necesita el template matcher.

Seis parámetros, ajustados desde la GUI

Umbral de fondo, tamaño del kernel morfológico, clip y grid de CLAHE, tamaño de bloque y constante C del umbral adaptativo: seis mandos cubren todas las variantes de pieza que la línea ha visto hasta ahora. En el sistema desplegado viven en config.json y se ajustan con sliders sobre la imagen en vivo de la cámara, de modo que un operario de línea puede recalibrar la estación para un producto nuevo en minutos, sin tocar una sola línea de código ni redesplegar nada.

Un fragmento de la implementación

Tal cual del ejemplo desplegado en el Raspberry Pi + cámara USB — cópialo libremente:

def synthetic_image():
    """Generates a light 'part' on a dark background with a silkscreen print."""
    img = np.full((480, 640, 3), 25, np.uint8)            # dark background
    cv2.rectangle(img, (180, 120), (460, 360), (190, 190, 190), -1)  # part
    cv2.putText(img, "IS-42", (230, 260), cv2.FONT_HERSHEY_SIMPLEX,
                1.6, (40, 40, 40), 4)                      # silkscreen
    noise = np.random.randint(0, 18, img.shape, np.uint8)  # camera noise
    return cv2.add(img, noise)

El ejemplo completo es un programa entero — cabecera de conexionado, setup y bucle principal — listo para adaptar a tu aplicación.

Preguntas frecuentes

¿Por qué no comparar directamente las imágenes en bruto de la cámara?

Los frames en bruto cambian con la iluminación, la posición de la pieza y el ruido de la cámara. Comparar impresiones recortadas y binarizadas hace que el veredicto dependa del propio marcaje, que es lo que realmente quieres inspeccionar.

¿Es una Raspberry Pi suficientemente rápida para este pipeline?

Sí. Todas las etapas son operaciones estándar de OpenCV sobre una región recortada pequeña; una Raspberry Pi 4 procesa una pieza en bastante menos de un segundo, lo que encaja con los ritmos típicos de una estación de alimentación manual.

¿Qué ajustes de cámara importan más?

Enfoque manual fijo y exposición constante. Un autofocus que busca entre pieza y pieza es la principal fuente de binarización inconsistente, así que el despliegue bloquea el enfoque vía V4L2 y lo guarda en el fichero de configuración.

Funcionalidades relacionadas