5.34. Recapitulación¶
El módulo image es la mayor API que expone la cam, y este capítulo acaba de cubrir su esquema general: cómo se representa una imagen en memoria, cómo la cámara lee y escribe píxeles individuales, cómo dibuja en los fotogramas capturados, cómo los transforma aritmética y geométricamente, cómo los clasifica por umbral y los filtra, cómo extrae mediciones y detecciones de ellos, cómo decodifica símbolos impresos a partir de ellos, cómo compara una imagen con otra, y cómo obtiene los resultados dentro y fuera de la cam.
El conjunto de herramientas es amplio a propósito. Una canalización clásica de visión por computador que se ejecuta en una pequeña cámara embebida realiza la mayor parte de su trabajo antes de que nada llegue a un modelo de aprendizaje automático, cuando lo hay – el umbralizado limpia la entrada, los filtros eliminan el ruido, las regiones acotan la búsqueda, los detectores de manchas (blobs) y de líneas localizan candidatos, la puntuación de similitud decide si el candidato es interesante, y la capa de E/S entrega el resultado a lo que ejecute la siguiente etapa. Cada página de este capítulo cubrió una de esas operaciones; la canalización adecuada para una aplicación dada es una secuencia de ellas compuesta en el orden que el problema exija.
5.34.1. El patrón de canalización¶
La mayoría de las aplicaciones no triviales de la cam siguen el mismo esquema. Capturar un fotograma del sensor. Preprocesarlo: convertir formatos, ecualizar el histograma, difuminar el ruido. Localizar las regiones o características de interés: detección de manchas (blobs), detección de líneas, emparejamiento de plantillas, decodificación de códigos. Analizar lo que se encontró: mediciones geométricas, puntuación de similitud, estadísticas. Decidir qué hacer en función del análisis: activar un GPIO, reportar una carga útil, capturar y registrar, entregar el fotograma a un modelo de ML. Generar la salida de la decisión o del artefacto capturado: guardar, codificar, enviar, dibujar de vuelta en el fotograma para la vista previa del IDE.
Ninguna página del capítulo cubrió todos los pasos por sí sola; el capítulo cubrió los bloques de construcción que la canalización compone. Elegir qué bloques usar y en qué orden es el trabajo del script de la aplicación.
5.34.2. Hacia dónde lleva el capítulo¶
El módulo image trata las imágenes como imágenes – píxeles, regiones, dibujo, detecciones. Buena parte del trabajo sobre los datos capturados no encaja en ese marco. Calcular estadísticas sobre un arreglo numérico arbitrario, ejecutar aritmética vectorizada sobre datos brutos del sensor, aplicar una transformación matricial personalizada que no tiene detrás un método del módulo image, preparar datos para un modelo de aprendizaje automático que quiere una disposición de tensor específica – todos esos son trabajos para una biblioteca de arreglos numéricos, no para una de procesamiento de imágenes.
El siguiente capítulo cubre exactamente eso. El módulo ulab.numpy que se suministra con MicroPython en la cam es un subconjunto de NumPy, y dos puentes lo conectan con el módulo image: to_ndarray() copia los píxeles de un fotograma en un ndarray para el trabajo numérico, y el constructor de Image acepta un ndarray para construir una imagen nueva a partir del resultado, lista para mostrarse, guardarse o realimentarse en la biblioteca de imágenes. Los dos módulos se componen – cada uno hace lo que el otro no hace, y juntos cubren el trabajo numérico y de imagen que necesita una aplicación de visión embebida.