image — visión artificial#

El módulo image es el núcleo de la pila de visión artificial de OpenMV. Expone la clase Image – el búfer de píxeles en memoria sobre el que operan todas las rutinas de dibujo, filtrado, transformación y extracción de características – junto con los objetos de resultado de apoyo devueltos por esas rutinas (Blob, Line, Circle, Rect, QRCode, AprilTag, DataMatrix, BarCode, …) y las clases auxiliares usadas para configurarlas (Threshold, Histogram, Statistics, HaarCascade, Similarity, Percentile, Displacement, ImageIO).

Adquisición de una imagen#

Hay cuatro formas de obtener una Image en la RAM:

  • Captura en vivo desde el sensor de la cámara. Llama a csi.CSI.snapshot() para capturar el siguiente fotograma directamente en el búfer de fotogramas (frame buffer); la Image devuelta hace referencia a ese búfer.

  • Desde un archivo. Pasa una ruta al constructor de Image (image.Image("/sd/photo.jpg")); los formatos en disco admitidos son BMP, PPM/PGM, JPEG, PNG y el formato de grabación ImageIO de OpenMV.

  • Desde un ndarray. Pasa un ndarray float32 (h, w) o (h, w, 3) al constructor de Image. Los píxeles se escalan de 0.0 -- 255.0 a una imagen GRAYSCALE o RGB565 respectivamente. Úsalo para llevar la salida tensorial de ml (o de cualquier canalización de ulab) de vuelta a una imagen dibujable.

  • Búfer vacío. Construye una Image con un tamaño y formato de píxel dados (image.Image(320, 240, image.RGB565)) para dibujar en ella desde cero, o para usarla como superficie de trabajo en operaciones aritméticas sobre imágenes.

Formatos de píxel#

Cada Image tiene uno de los siguientes formatos de píxel; la elección establece un compromiso entre memoria, coste de procesamiento y qué algoritmos pueden ejecutarse sobre ella. Usa BINARY, GRAYSCALE, RGB565, BAYER, YUV422, JPEG o PNG como argumento pixformat al construir una imagen o al configurar el sensor de la cámara:

  • BINARY (1 bpp) – un bit por píxel. El formato más pequeño; usado internamente por las rutinas de umbralización y morfología, pero rara vez capturado directamente desde el sensor.

  • GRAYSCALE (8 bpp) – un byte por píxel (el canal Y de YUV422). El formato más rápido para la mayoría de los algoritmos de visión por computadora (AprilTag, detección de bordes, flujo óptico).

  • RGB565 (16 bpp) – dos bytes por píxel, 5 bits de rojo / 6 bits de verde / 5 bits de azul. El formato de color por defecto.

  • BAYER (8 bpp) – datos de color con patrón Bayer en bruto directamente del sensor. Útil para un demosaico personalizado o para almacenar más píxeles en menos memoria antes de aplicar el debayer bajo demanda.

  • YUV422 (16 bpp) – color con submuestreo de croma 4:2:2, dos bytes por píxel. Útil cuando quieres algoritmos específicos de croma sin pagar el coste completo de RGB.

  • JPEG / PNG – búferes comprimidos. Los mejores para almacenamiento y transmisión por red. Las operaciones a nivel de píxel requieren primero Image.to_grayscale() o Image.to_rgb565().

Trabajar con resultados#

Los métodos de detección / extracción de características de Image devuelven objetos que puedes recorrer y combinar – una llamada a Image.find_blobs() devuelve una lista de Blob, una llamada a Image.find_apriltags() devuelve una lista de AprilTag, etc. Cada clase de resultado expone las propiedades geométricas de la detección (centroide, cuadro delimitador, área, valor de código, etc.) para que puedas actuar sobre ellas directamente o pasarlas de vuelta a los métodos de dibujo (Image.draw_rectangle(), Image.draw_string(), …).

Auxiliares de espacio de color#

El módulo también expone pequeñas funciones puras para convertir valores individuales de píxel entre los espacios de color binario / escala de grises / RGB / LAB / YUV. Son útiles cuando necesitas convertir valores de umbral o entradas de paleta en Python antes de pasarlos a operaciones sobre imágenes – para la conversión de imagen completa usa los métodos to_* de Image, que son mucho más rápidos que llamar a estos auxiliares en un bucle.

Clases#

Funciones#

Auxiliares de conversión de espacio de color#

Cada una de las funciones X_to_Y siguientes realiza una única conversión de valor de píxel. Todas toman/devuelven valores en los rangos canónicos de OpenMV:

  • binario – int 0 – 1.

  • escala de grises – int 0 – 255.

  • RGB – tupla (r, g, b) de enteros de 8 bits (cada uno 0 – 255).

  • LAB – tupla (l, a, b) con L en 0 – 100 y A/B en -128 – 127.

  • YUV – tupla (y, u, v) con Y en 0 – 255 y U/V en -128 – 127.

Para la conversión de imagen completa usa los métodos to_* de Image, que son mucho más rápidos que llamar a estos auxiliares en un bucle.

image.binary_to_grayscale(value: int) int#

Convierte un valor binario en un valor de escala de grises.

image.binary_to_rgb(value: int) Tuple[int, int, int]#

Convierte un valor binario en una tupla RGB.

image.binary_to_lab(value: int) Tuple[int, int, int]#

Convierte un valor binario en una tupla LAB.

image.binary_to_yuv(value: int) Tuple[int, int, int]#

Convierte un valor binario en una tupla YUV.

image.grayscale_to_binary(value: int) int#

Convierte un valor de escala de grises en un valor binario.

image.grayscale_to_rgb(value: int) Tuple[int, int, int]#

Convierte un valor de escala de grises en una tupla RGB.

image.grayscale_to_lab(value: int) Tuple[int, int, int]#

Convierte un valor de escala de grises en una tupla LAB.

image.grayscale_to_yuv(value: int) Tuple[int, int, int]#

Convierte un valor de escala de grises en una tupla YUV.

image.rgb_to_binary(value: Tuple[int, int, int]) int#

Convierte una tupla RGB en un valor binario.

image.rgb_to_grayscale(value: Tuple[int, int, int]) int#

Convierte una tupla RGB en un valor de escala de grises.

image.rgb_to_lab(value: Tuple[int, int, int]) Tuple[int, int, int]#

Convierte una tupla RGB en una tupla LAB.

image.rgb_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]#

Convierte una tupla RGB en una tupla YUV.

image.lab_to_binary(value: Tuple[int, int, int]) int#

Convierte una tupla LAB en un valor binario.

image.lab_to_grayscale(value: Tuple[int, int, int]) int#

Convierte una tupla LAB en un valor de escala de grises.

image.lab_to_rgb(value: Tuple[int, int, int]) Tuple[int, int, int]#

Convierte una tupla LAB en una tupla RGB.

image.lab_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]#

Convierte una tupla LAB en una tupla YUV.

image.yuv_to_binary(value: Tuple[int, int, int]) int#

Convierte una tupla YUV en un valor binario.

image.yuv_to_grayscale(value: Tuple[int, int, int]) int#

Convierte una tupla YUV en un valor de escala de grises.

image.yuv_to_rgb(value: Tuple[int, int, int]) Tuple[int, int, int]#

Convierte una tupla YUV en una tupla RGB.

image.yuv_to_lab(value: Tuple[int, int, int]) Tuple[int, int, int]#

Convierte una tupla YUV en una tupla LAB.

Descriptores de características#

image.HaarCascade(path: str, stages: int = -1) Cascade#

Carga un Haar Cascade y devuelve un manejador Cascade para usar con Image.find_features().

path puede ser cualquiera de los siguientes:

  • la cadena literal "frontalface" o "eye" para cargar uno de los dos cascades integrados en la ROM del firmware, o

  • una ruta del sistema de archivos a un archivo binario .cascade personalizado producido por las herramientas de conversión de cascade de OpenMV.

stages selecciona cuántas etapas del cascade se evalúan en el momento de la detección. -1 usa todas las etapas almacenadas en el archivo. Reducir este valor acelera la detección a costa de más falsos positivos.

image.load_descriptor(path: str) kp_desc | lbp_desc#

Carga un descriptor desde el archivo en path y lo devuelve. La etiqueta de tipo interna del archivo selecciona qué clase de descriptor se reconstruye:

image.save_descriptor(descriptor: kp_desc | lbp_desc, path: str) None#

Serializa descriptor (un descriptor de puntos clave ORB o un descriptor LBP) al archivo en path en el formato de archivo de descriptor de OpenMV. El mismo archivo puede recargarse posteriormente mediante image.load_descriptor().

image.match_descriptor(descriptor0, descriptor1, threshold: int = 85, filter_outliers: bool = False) int | kptmatch#

Compara dos descriptores del mismo tipo.

  • Para dos descriptores LBP – devuelve una distancia de Hamming entera entre ellos (cuanto menor, mejor coincidencia).

  • Para dos descriptores de puntos clave ORB – devuelve un kptmatch que describe el grupo de puntos clave coincidentes, o None si ninguna coincidencia supera threshold.

threshold (0 – 100) establece la estrictez de la comparación ORB al aceptar un par de puntos clave. Valores más bajos endurecen la comparación rechazando las coincidencias débiles del vecino más cercano.

filter_outliers habilita el rechazo de valores atípicos al estilo RANSAC en el conjunto de puntos clave coincidentes. Úsalo cuando esperes una única transformación rígida entre las dos vistas; desactívalo cuando los puntos clave coincidentes abarquen varios objetos.

Auxiliares de geometría de manchas (blobs)#

Estos auxiliares toman una Blob (tal como la devuelve Image.find_blobs()) y calculan propiedades geométricas adicionales bajo demanda. Residen en el ámbito del módulo – no en Blob – de modo que la ruta básica de find_blobs() no paga por ellas a menos que las solicites.

image.get_solidity(blob: blob) float#

Devuelve la solidez (blob.pixels / convex_hull_area) de blob. Float, 0 – 1; 1.0 significa que la mancha (blob) llena completamente su envolvente convexa.

image.get_convexity(blob: blob) float#

Devuelve la convexidad (convex_hull_perimeter / blob.perimeter) de blob. Float, 0 – 1; 1.0 es una mancha (blob) perfectamente convexa.

image.get_major_axis_line(blob: blob) line#

Devuelve una Line a lo largo del eje mayor de blob (el más largo de los dos ejes principales del rectángulo rotado de área mínima).

image.get_minor_axis_line(blob: blob) line#

Devuelve una Line a lo largo del eje menor de blob (el más corto de los dos ejes principales del rectángulo rotado de área mínima).

image.get_enclosing_circle(blob: blob) circle#

Devuelve un Circle que encierra blob.

image.get_enclosed_ellipse(blob: blob) Tuple[int, int, int, int, int]#

Devuelve una tupla de 5 elementos (cx, cy, a, b, rotation) que describe la elipse inscrita en el rectángulo rotado de área mínima alrededor de blob:

  • cx / cy – centro de la elipse en píxeles (entero).

  • a / b – longitudes de los semiejes en píxeles (entero).

  • rotation – rotación de la elipse en grados (entero).

Esta es una tupla simple, no una attrtuple, por lo que los campos solo son accesibles por índice.

Constantes#

Formatos de píxel#

Pasa cualquiera de los siguientes como argumento pixformat al constructor de Image o a csi.CSI.pixformat().

image.BINARY: int#

Mapa de bits de 1 bit por píxel. El formato más pequeño – usado internamente por la umbralización y la morfología, rara vez capturado directamente desde un sensor.

image.GRAYSCALE: int#

Escala de grises de 8 bits por píxel (un byte por píxel). El formato más rápido para la mayoría de los algoritmos de visión por computadora (AprilTag, detección de bordes, flujo óptico).

image.RGB565: int#

Color de 16 bits por píxel empaquetado como 5 bits de rojo / 6 bits de verde / 5 bits de azul. El formato de color por defecto.

image.BAYER: int#

Datos Bayer en bruto de 8 bits por píxel directamente del sensor. La mayoría de los métodos de procesamiento de imágenes no están disponibles para imágenes Bayer; úsalo cuando quieras aplicar el debayer bajo demanda o almacenar más píxeles en menos memoria.

image.YUV422: int#

Color con submuestreo de croma 4:2:2, dos bytes por píxel, empaquetado como Y1, U, Y2, V por cada par de píxeles. Solo algunos métodos de procesamiento de imágenes funcionan directamente sobre YUV422.

image.JPEG: int#

Búfer JPEG comprimido. Las operaciones a nivel de píxel requieren primero Image.to_grayscale() o Image.to_rgb565().

image.PNG: int#

Búfer PNG comprimido. Las operaciones a nivel de píxel requieren primero Image.to_grayscale() o Image.to_rgb565().

Paletas de color#

Pasa cualquiera de los siguientes a Image.to_rainbow(), Image.to_ironbow(), Image.draw_image() (color_palette=) o a csi.CSI.color_palette() para colorear una imagen en escala de grises.

image.PALETTE_RAINBOW: int#

Rueda de color de arcoíris suave. La paleta OpenMV por defecto para imágenes térmicas.

image.PALETTE_IRONBOW: int#

Paleta «ironbow» no lineal que imita el aspecto del visor térmico de la FLIR Lepton.

image.PALETTE_DEPTH: int#

Paleta de imagen de profundidad. Solo disponible en compilaciones con soporte de sensor de profundidad (la canalización ToF – p. ej. la OpenMV Cam AE3 o cualquier cámara con un Pmod ToF acoplado).

image.PALETTE_EVT_DARK: int#

Paleta para visualizar fotogramas de la cámara de eventos GENX320 sobre fondo oscuro. Pásala a csi.CSI.color_palette para que el controlador GENX320 emita fotogramas RGB565 coloreados en modo histograma, o a Image.draw_image() color_palette= al colorear una imagen de eventos en escala de grises.

Solo disponible en compilaciones con soporte de GENX320 (la OpenMV Cam AE3 y el Pmod GENX320).

image.PALETTE_EVT_LIGHT: int#

Paleta para visualizar fotogramas de la cámara de eventos GENX320 sobre fondo claro. Mismo despacho y disponibilidad que PALETTE_EVT_DARK.

Modos de escalado#

Pasa cualquiera de los siguientes como argumento hint a Image.draw_image(), Image.scale() o métodos de escalado similares.

image.AREA: int#

Escalador de promediado de áreas. Usado al reducir la escala; para ampliar se usa Nearest-Neighbor.

image.BILINEAR: int#

Escalador bilineal. Submuestrea al reducir la escala.

image.BICUBIC: int#

Escalador bicúbico. Mayor calidad que BILINEAR pero más lento. Submuestrea al reducir la escala.

Sugerencias de dibujo / draw_image#

Combina con OR a nivel de bits cualquiera de estas y pásalas como argumento hint de Image.draw_image().

image.VFLIP: int#

Voltea verticalmente el origen al dibujar.

image.HMIRROR: int#

Refleja horizontalmente el origen al dibujar.

image.TRANSPOSE: int#

Transpone (intercambia x/y) el origen al dibujar.

image.CENTER: int#

Centra el origen sobre el destino. Cualquier desplazamiento x/y explícito pasa entonces a ser un desplazamiento desde el centro en lugar de desde la esquina superior izquierda.

image.EXTRACT_RGB_CHANNEL_FIRST: int#

Al extraer un canal RGB mediante Image.draw_image(), extrae el canal antes de escalar. Sin esta sugerencia, el canal se extrae después de escalar.

image.APPLY_COLOR_PALETTE_FIRST: int#

Al aplicar una paleta de color mediante Image.draw_image(), aplica la paleta antes de escalar. Sin esta sugerencia, la paleta se aplica después de escalar.

image.SCALE_ASPECT_KEEP: int#

Escala el origen para que quepa dentro del destino manteniendo la relación de aspecto (añade bandas negras cuando las relaciones difieren).

image.SCALE_ASPECT_EXPAND: int#

Escala el origen para que llene el destino manteniendo la relación de aspecto (recorta cuando las relaciones difieren).

image.SCALE_ASPECT_IGNORE: int#

Escala el origen para que llene el destino, ignorando la relación de aspecto.

image.BLACK_BACKGROUND: int#

Indica a la ruta de mezcla alfa que se sabe que el destino es negro, de modo que pueda omitir la relectura del píxel de destino. Acelera los efectos alfa en búferes recién borrados.

image.ROTATE_90: int#

Atajo para VFLIP | TRANSPOSE (rotar 90 grados en sentido horario).

image.ROTATE_180: int#

Atajo para HMIRROR | VFLIP (rotar 180 grados).

image.ROTATE_270: int#

Atajo para HMIRROR | TRANSPOSE (rotar 270 grados en sentido horario).

Submuestreo JPEG#

Pasa cualquiera de los siguientes como argumento subsampling a Image.to_jpeg(), Image.compress() o Image.save() al escribir un JPEG.

image.JPEG_SUBSAMPLING_AUTO: int#

Elige el submuestreo de croma automáticamente según el ajuste de calidad JPEG.

image.JPEG_SUBSAMPLING_444: int#

Fuerza el submuestreo de croma 4:4:4 (sin compresión de croma).

image.JPEG_SUBSAMPLING_422: int#

Fuerza el submuestreo de croma 4:2:2. Recomendado al transmitir MJPEG a reproductores de vídeo de terceros que no se comportan bien con 4:2:0.

image.JPEG_SUBSAMPLING_420: int#

Fuerza el submuestreo de croma 4:2:0.

Coincidencia de plantillas#

Pasa cualquiera de los siguientes como argumento search a Image.find_template().

image.SEARCH_EX: int#

Búsqueda exhaustiva – evalúa todas las posiciones en la ROI. La más lenta pero garantiza encontrar la mejor coincidencia.

image.SEARCH_DS: int#

Búsqueda en diamante – búsqueda de grueso a fino que es mucho más rápida que SEARCH_EX pero puede pasar por alto el óptimo global en plantillas muy autosimilares.

Detección de bordes#

Pasa cualquiera de los siguientes como argumento algorithm a Image.find_edges().

image.EDGE_CANNY: int#

Detector de bordes Canny – magnitud del gradiente + supresión de no máximos + histéresis. Mayor calidad, más lento.

image.EDGE_SIMPLE: int#

Detector de bordes por filtro paso alto umbralizado. Más rápido pero produce bordes más gruesos y ruidosos que EDGE_CANNY.

Detectores de esquinas ORB#

Pasa cualquiera de los siguientes como argumento corner_detector a Image.find_keypoints().

image.CORNER_FAST: int#

Detector de esquinas FAST. Más rápido que CORNER_AGAST pero menos preciso.

image.CORNER_AGAST: int#

Detector de esquinas AGAST. Más lento que CORNER_FAST pero produce puntos clave más estables.

Familias de AprilTag#

Combina con OR a nivel de bits cualquier combinación de las siguientes y pásala como argumento families a Image.find_apriltags(). Cada familia está condicionada por su propia opción de compilación en el firmware; las familias no admitidas están ausentes en tiempo de ejecución en lugar de devolver siempre cero.

image.TAG16H5: int#

Familia 16h5 de AprilTag (30 IDs únicos, corrección de errores de 0 bits).

image.TAG25H9: int#

Familia 25h9 de AprilTag (35 IDs únicos, corrección de errores de hasta 3 bits).

image.TAG36H10: int#

Familia 36h10 de AprilTag (2320 IDs únicos, corrección de errores de hasta 3 bits).

image.TAG36H11: int#

Familia 36h11 de AprilTag (587 IDs únicos, corrección de errores de hasta 4 bits). La familia más común.

image.TAGCIRCLE21H7: int#

Familia Circle21h7 de AprilTag.

image.TAGCIRCLE49H12: int#

Familia Circle49h12 de AprilTag.

image.TAGCUSTOM48H12: int#

Familia Custom48h12 de AprilTag.

image.TAGSTANDARD41H12: int#

Familia Standard41h12 de AprilTag.

image.TAGSTANDARD52H13: int#

Familia Standard52h13 de AprilTag.

Simbologías de código de barras#

Los valores reportados en BarCode.type para las entradas devueltas por Image.find_barcodes().

image.EAN2: int#

Código de barras suplementario EAN-2.

image.EAN5: int#

Código de barras suplementario EAN-5.

image.EAN8: int#

Código de barras EAN-8.

image.UPCE: int#

Código de barras UPC-E.

image.ISBN10: int#

Código de barras ISBN-10.

image.UPCA: int#

Código de barras UPC-A.

image.EAN13: int#

Código de barras EAN-13.

image.ISBN13: int#

Código de barras ISBN-13.

image.I25: int#

Código de barras Interleaved 2-of-5.

image.DATABAR: int#

Código de barras GS1 DataBar.

image.DATABAR_EXP: int#

Código de barras GS1 DataBar Expanded.

image.CODABAR: int#

Código de barras Codabar.

image.CODE39: int#

Código de barras Code 39.

image.PDF417: int#

Código de barras apilado 2D PDF417. La constante existe por completitud, pero el decodificador de códigos de barras no implementa actualmente PDF417 – Image.find_barcodes() no devolverá detecciones de este tipo.

image.CODE93: int#

Código de barras Code 93.

image.CODE128: int#

Código de barras Code 128.