Un pipeline de preprocesado OpenCV para inspección automática de impresión
Del frame en bruto a un recorte limpio de la pieza
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
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
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.