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); laImagedevuelta 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ónImageIOde OpenMV.Desde un ndarray. Pasa un
ndarrayfloat32(h, w)o(h, w, 3)al constructor deImage. Los píxeles se escalan de0.0 -- 255.0a una imagen GRAYSCALE o RGB565 respectivamente. Úsalo para llevar la salida tensorial deml(o de cualquier canalización deulab) de vuelta a una imagen dibujable.Búfer vacío. Construye una
Imagecon 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()oImage.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¶
- class Image – Objeto de imagen
- clase ImageIO – objeto ImageIO
- class HaarCascade – Descriptor de características
- clase Similarity – objeto Similarity
- class Histogram – objeto Histogram
- clase Percentile – objeto Percentile
- class Threshold – Objeto Threshold
- clase Statistics – objeto Statistics
- class Blob – objeto Blob
- clase Line – objeto Line
- class Circle – objeto Circle
- clase Rect – objeto Rectangle
- clase QRCode – objeto QRCode
- class AprilTag – objeto AprilTag
- class DataMatrix – objeto DataMatrix
- class BarCode – objeto BarCode
- class Displacement – objeto Displacement
- class kptmatch – Objeto de coincidencia de puntos clave
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 –
int0 – 1.escala de grises –
int0 – 255.RGB – tupla
(r, g, b)de enteros de 8 bits (cada uno 0 – 255).LAB – tupla
(l, a, b)conLen 0 – 100 yA/Ben -128 – 127.YUV – tupla
(y, u, v)conYen 0 – 255 yU/Ven -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.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_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_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_grayscale(value: Tuple[int, int, int]) int¶
Convierte una tupla YUV en un valor de escala de grises.
Descriptores de características¶
- image.HaarCascade(path: str, stages: int = -1) Cascade¶
Carga un Haar Cascade y devuelve un manejador
Cascadepara usar conImage.find_features().pathpuede ser cualquiera de los siguientes:la cadena literal
"frontalface"o"eye"para cargar uno de los dos cascades integrados en la ROM del firmware, ouna ruta del sistema de archivos a un archivo binario
.cascadepersonalizado producido por las herramientas de conversión de cascade de OpenMV.
stagesselecciona cuántas etapas del cascade se evalúan en el momento de la detección.-1usa 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
pathy lo devuelve. La etiqueta de tipo interna del archivo selecciona qué clase de descriptor se reconstruye:Descriptor de puntos clave ORB – guardado por
Image.find_keypoints()seguido deimage.save_descriptor().Descriptor LBP – guardado por
Image.find_lbp()seguido deimage.save_descriptor().
- 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 enpathen el formato de archivo de descriptor de OpenMV. El mismo archivo puede recargarse posteriormente medianteimage.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
kptmatchque describe el grupo de puntos clave coincidentes, oNonesi ninguna coincidencia superathreshold.
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_outliershabilita 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) deblob. 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) deblob. Float, 0 – 1; 1.0 es una mancha (blob) perfectamente convexa.
- image.get_major_axis_line(blob: blob) line¶
Devuelve una
Linea lo largo del eje mayor deblob(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
Linea lo largo del eje menor deblob(el más corto de los dos ejes principales del rectángulo rotado de área mínima).
- 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 deblob: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, Vpor 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()oImage.to_rgb565().
- image.PNG: int¶
Búfer PNG comprimido. Las operaciones a nivel de píxel requieren primero
Image.to_grayscale()oImage.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_palettepara que el controlador GENX320 emita fotogramas RGB565 coloreados en modo histograma, o aImage.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.
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.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.
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.
Coincidencia de plantillas¶
Pasa cualquiera de los siguientes como argumento search a Image.find_template().
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_AGASTpero menos preciso.
- image.CORNER_AGAST: int¶
Detector de esquinas AGAST. Más lento que
CORNER_FASTpero 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.TAG25H9: int¶
Familia
25h9de AprilTag (35 IDs únicos, corrección de errores de hasta 3 bits).
- image.TAG36H10: int¶
Familia
36h10de AprilTag (2320 IDs únicos, corrección de errores de hasta 3 bits).
Simbologías de código de barras¶
Los valores reportados en BarCode.type para las entradas devueltas por Image.find_barcodes().
- 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.