image — visão de máquina

O módulo image é o coração da pilha de visão de máquina da OpenMV. Ele expõe a classe Image – o buffer de pixels em memória sobre o qual toda rotina de desenho, filtragem, transformação e extração de características opera – junto com os objetos de resultado de apoio retornados por essas rotinas (Blob, Line, Circle, Rect, QRCode, AprilTag, DataMatrix, BarCode, …) e as classes auxiliares usadas para configurá-las (Threshold, Histogram, Statistics, HaarCascade, Similarity, Percentile, Displacement, ImageIO).

Adquirindo uma Imagem

Existem quatro maneiras de colocar uma Image na RAM:

  • Captura ao vivo a partir do sensor da câmera. Chame csi.CSI.snapshot() para capturar o próximo quadro diretamente no frame buffer; a Image retornada referencia esse buffer.

  • A partir de um arquivo. Passe um caminho para o construtor de Image (image.Image("/sd/photo.jpg")); os formatos suportados em disco são BMP, PPM/PGM, JPEG, PNG e o formato de gravação ImageIO da OpenMV.

  • A partir de um ndarray. Passe um ndarray float32 (h, w) ou (h, w, 3) ao construtor de Image. Os pixels são escalados de 0.0 -- 255.0 para uma imagem GRAYSCALE ou RGB565, respectivamente. Use isto para trazer a saída de tensores do ml (ou de qualquer pipeline ulab) de volta para uma imagem desenhável.

  • Buffer vazio. Construa uma Image com um tamanho e formato de pixel determinados (image.Image(320, 240, image.RGB565)) para desenhar nela do zero, ou para usar como superfície de rascunho em operações aritméticas de imagem.

Formatos de pixel

Toda Image possui um dos seguintes formatos de pixel; a escolha equilibra memória, custo de processamento e quais algoritmos podem ser executados sobre ela. Use BINARY, GRAYSCALE, RGB565, BAYER, YUV422, JPEG ou PNG como argumento pixformat ao construir uma imagem ou configurar o sensor da câmera:

  • BINARY (1 bpp) – um bit por pixel. O menor formato; usado internamente pelas rotinas de limiarização e morfologia, mas raramente capturado diretamente do sensor.

  • GRAYSCALE (8 bpp) – um byte por pixel (o canal Y do YUV422). O formato mais rápido para a maioria dos algoritmos de visão computacional (AprilTag, detecção de bordas, fluxo óptico).

  • RGB565 (16 bpp) – dois bytes por pixel, 5 bits de vermelho / 6 bits de verde / 5 bits de azul. O formato de cor padrão.

  • BAYER (8 bpp) – dados de cor em padrão Bayer brutos, direto do sensor. Útil para de-mosaicing personalizado ou para armazenar mais pixels em menos memória antes de aplicar o debayering sob demanda.

  • YUV422 (16 bpp) – cor com crominância subamostrada em 4:2:2, dois bytes por pixel. Útil quando você quer algoritmos específicos de crominância sem pagar o custo total do RGB.

  • JPEG / PNG – buffers comprimidos. Melhores para armazenamento e transmissão em rede. Operações em nível de pixel exigem Image.to_grayscale() ou Image.to_rgb565() antes.

Trabalhando com resultados

Os métodos de detecção / extração de características de Image retornam objetos sobre os quais você pode iterar e combinar – uma chamada a Image.find_blobs() retorna uma lista de Blob, uma chamada a Image.find_apriltags() retorna uma lista de AprilTag, etc. Cada classe de resultado expõe as propriedades geométricas da detecção (centroide, caixa delimitadora, área, valor do código, etc.) para que você possa agir sobre elas diretamente ou passá-las de volta para os métodos de desenho (Image.draw_rectangle(), Image.draw_string(), …).

Auxiliares de espaço de cor

O módulo também expõe pequenas funções puras para converter valores de pixel individuais entre os espaços de cor binário / escala de cinza / RGB / LAB / YUV. Elas são úteis quando você precisa converter valores de limiar ou entradas de paleta em Python antes de passá-los para operações de imagem – para conversão de imagem completa, use os métodos to_* de Image, que são muito mais rápidos do que chamar esses auxiliares em um laço.

Classes

Funções

Auxiliares de conversão de espaço de cor

Cada uma das funções X_to_Y abaixo realiza a conversão de um único valor de pixel. Todas recebem/retornam valores nas faixas canônicas da OpenMV:

  • binário – int 0 – 1.

  • escala de cinza – int 0 – 255.

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

  • LAB – tupla (l, a, b) com L em 0 – 100 e A/B em -128 – 127.

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

Para conversão de imagem completa, use os métodos to_* de Image, que são muito mais rápidos do que chamar esses auxiliares em um laço.

image.binary_to_grayscale(value: int) int

Converte um valor binário em um valor de escala de cinza.

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

Converte um valor binário em uma tupla RGB.

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

Converte um valor binário em uma tupla LAB.

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

Converte um valor binário em uma tupla YUV.

image.grayscale_to_binary(value: int) int

Converte um valor de escala de cinza em um valor binário.

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

Converte um valor de escala de cinza em uma tupla RGB.

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

Converte um valor de escala de cinza em uma tupla LAB.

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

Converte um valor de escala de cinza em uma tupla YUV.

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

Converte uma tupla RGB em um valor binário.

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

Converte uma tupla RGB em um valor de escala de cinza.

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

Converte uma tupla RGB em uma tupla LAB.

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

Converte uma tupla RGB em uma tupla YUV.

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

Converte uma tupla LAB em um valor binário.

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

Converte uma tupla LAB em um valor de escala de cinza.

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

Converte uma tupla LAB em uma tupla RGB.

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

Converte uma tupla LAB em uma tupla YUV.

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

Converte uma tupla YUV em um valor binário.

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

Converte uma tupla YUV em um valor de escala de cinza.

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

Converte uma tupla YUV em uma tupla RGB.

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

Converte uma tupla YUV em uma tupla LAB.

Descritores de características

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

Carrega um Haar Cascade e retorna um handle Cascade para uso com Image.find_features().

path pode ser:

  • a string literal "frontalface" ou "eye" para carregar um dos dois cascades embutidos na ROM do firmware, ou

  • um caminho no sistema de arquivos para um arquivo binário .cascade personalizado, produzido pelas ferramentas de conversão de cascade da OpenMV.

stages seleciona quantos estágios do cascade avaliar no momento da detecção. -1 usa todos os estágios armazenados no arquivo. Reduzir esse valor acelera a detecção ao custo de mais falsos positivos.

image.load_descriptor(path: str) kp_desc | lbp_desc

Carrega um descritor a partir do arquivo em path e o retorna. A tag de tipo interna do arquivo seleciona qual classe de descritor será reconstruída:

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

Serializa descriptor (um descritor de pontos-chave ORB ou LBP) para o arquivo em path no formato de arquivo de descritor da OpenMV. O mesmo arquivo pode ser recarregado posteriormente via image.load_descriptor().

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

Compara dois descritores do mesmo tipo.

  • Para dois descritores LBP – retorna uma distância de Hamming inteira entre eles (quanto menor, mais próxima a correspondência).

  • Para dois descritores de pontos-chave ORB – retorna um kptmatch descrevendo o agrupamento de pontos-chave correspondentes, ou None se nenhuma correspondência passar de threshold.

threshold (0 – 100) define o quão rigorosa é a correspondência ORB ao aceitar um par de pontos-chave. Valores menores tornam a correspondência mais restritiva, rejeitando correspondências fracas de vizinho mais próximo.

filter_outliers habilita a rejeição de outliers no estilo RANSAC sobre o conjunto de pontos-chave correspondentes. Use-o quando você espera uma única transformação rígida entre as duas visões; desabilite-o quando os pontos-chave correspondentes abrangerem múltiplos objetos.

Auxiliares de geometria de blobs

Esses auxiliares recebem um Blob (conforme retornado por Image.find_blobs()) e calculam propriedades geométricas adicionais sob demanda. Eles ficam no escopo do módulo – não em Blob – de modo que o caminho básico de find_blobs() não paga por eles a menos que você os solicite.

image.get_solidity(blob: blob) float

Retorna a solidez (blob.pixels / convex_hull_area) de blob. Float, 0 – 1; 1.0 significa que o blob preenche completamente sua envoltória convexa.

image.get_convexity(blob: blob) float

Retorna a convexidade (convex_hull_perimeter / blob.perimeter) de blob. Float, 0 – 1; 1.0 é um blob perfeitamente convexo.

image.get_major_axis_line(blob: blob) line

Retorna uma Line ao longo do eixo maior de blob (o mais longo dos dois eixos principais do retângulo rotacionado de área mínima).

image.get_minor_axis_line(blob: blob) line

Retorna uma Line ao longo do eixo menor de blob (o mais curto dos dois eixos principais do retângulo rotacionado de área mínima).

image.get_enclosing_circle(blob: blob) circle

Retorna um Circle que envolve blob.

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

Retorna uma 5-tupla (cx, cy, a, b, rotation) descrevendo a elipse inscrita no retângulo rotacionado de área mínima ao redor de blob:

  • cx / cy – centro da elipse em pixels (inteiro).

  • a / b – comprimentos dos semieixos em pixels (inteiro).

  • rotation – rotação da elipse em graus (inteiro).

Esta é uma tupla simples, não uma attrtuple, então os campos são acessíveis apenas por índice.

Constantes

Formatos de pixel

Passe qualquer um dos seguintes como argumento pixformat ao construtor de Image ou a csi.CSI.pixformat().

image.BINARY: int

Bitmap de 1 bit por pixel. O menor formato – usado internamente pela limiarização e morfologia, raramente capturado diretamente de um sensor.

image.GRAYSCALE: int

Escala de cinza de 8 bits por pixel (um byte por pixel). O formato mais rápido para a maioria dos algoritmos de visão computacional (AprilTag, detecção de bordas, fluxo óptico).

image.RGB565: int

Cor de 16 bits por pixel empacotada como 5 bits de vermelho / 6 bits de verde / 5 bits de azul. O formato de cor padrão.

image.BAYER: int

Dados Bayer brutos de 8 bits por pixel, direto do sensor. A maioria dos métodos de processamento de imagem não está disponível em imagens Bayer; use isto quando quiser aplicar o debayer sob demanda ou armazenar mais pixels em menos memória.

image.YUV422: int

Cor com crominância subamostrada em 4:2:2, dois bytes por pixel, empacotada como Y1, U, Y2, V por par de pixels. Apenas alguns métodos de processamento de imagem funcionam diretamente em YUV422.

image.JPEG: int

Buffer JPEG comprimido. Operações em nível de pixel exigem Image.to_grayscale() ou Image.to_rgb565() antes.

image.PNG: int

Buffer PNG comprimido. Operações em nível de pixel exigem Image.to_grayscale() ou Image.to_rgb565() antes.

Paletas de cores

Passe qualquer um dos seguintes para Image.to_rainbow(), Image.to_ironbow(), Image.draw_image() (color_palette=) ou para csi.CSI.color_palette() para colorizar uma imagem em escala de cinza.

image.PALETTE_RAINBOW: int

Roda de cores arco-íris suave. A paleta OpenMV padrão para imagens térmicas.

image.PALETTE_IRONBOW: int

Paleta “ironbow” não linear que imita a aparência do visor térmico FLIR Lepton.

image.PALETTE_DEPTH: int

Paleta de imagem de profundidade. Disponível apenas em builds com suporte a sensor de profundidade (o pipeline ToF – por exemplo, a OpenMV Cam AE3 ou qualquer câmera com um Pmod ToF acoplado).

image.PALETTE_EVT_DARK: int

Paleta para visualizar quadros da câmera de eventos GENX320 sobre um fundo escuro. Passe para csi.CSI.color_palette para fazer o driver GENX320 emitir quadros RGB565 colorizados em modo de histograma, ou para Image.draw_image() color_palette= ao colorizar uma imagem de eventos em escala de cinza.

Disponível apenas em builds com suporte a GENX320 (OpenMV Cam AE3 e o Pmod GENX320).

image.PALETTE_EVT_LIGHT: int

Paleta para visualizar quadros da câmera de eventos GENX320 sobre um fundo claro. Mesmo despacho e disponibilidade que PALETTE_EVT_DARK.

Modos de escalonamento

Passe qualquer um dos seguintes como argumento hint para Image.draw_image(), Image.scale() ou métodos de escalonamento semelhantes.

image.AREA: int

Escalonador por média de área. Usado ao reduzir a escala; o Nearest-Neighbor é usado para aumentar a escala.

image.BILINEAR: int

Escalonador bilinear. Subamostra ao reduzir a escala.

image.BICUBIC: int

Escalonador bicúbico. Maior qualidade que BILINEAR, porém mais lento. Subamostra ao reduzir a escala.

Dicas de desenho / draw_image

Combine qualquer uma destas com OR de bits e passe como argumento hint de Image.draw_image().

image.VFLIP: int

Inverte a origem verticalmente durante o desenho.

image.HMIRROR: int

Espelha a origem horizontalmente durante o desenho.

image.TRANSPOSE: int

Transpõe (troca x/y) a origem durante o desenho.

image.CENTER: int

Centraliza a origem no destino. Quaisquer deslocamentos x/y explícitos passam então a ser deslocamentos a partir do centro, em vez do canto superior esquerdo.

image.EXTRACT_RGB_CHANNEL_FIRST: int

Ao extrair um canal RGB via Image.draw_image(), extrai o canal antes do escalonamento. Sem esta dica, o canal é extraído após o escalonamento.

image.APPLY_COLOR_PALETTE_FIRST: int

Ao aplicar uma paleta de cores via Image.draw_image(), aplica a paleta antes do escalonamento. Sem esta dica, a paleta é aplicada após o escalonamento.

image.SCALE_ASPECT_KEEP: int

Escala a origem para caber dentro do destino mantendo a proporção (adiciona letterbox quando as proporções diferem).

image.SCALE_ASPECT_EXPAND: int

Escala a origem para preencher o destino mantendo a proporção (recorta quando as proporções diferem).

image.SCALE_ASPECT_IGNORE: int

Escala a origem para preencher o destino, ignorando a proporção.

image.BLACK_BACKGROUND: int

Informa ao caminho de mesclagem alfa que o destino é sabidamente preto, para que ele possa pular a releitura do pixel de destino. Acelera os efeitos alfa em buffers recém-limpos.

image.ROTATE_90: int

Atalho para VFLIP | TRANSPOSE (rotaciona 90 graus no sentido horário).

image.ROTATE_180: int

Atalho para HMIRROR | VFLIP (rotaciona 180 graus).

image.ROTATE_270: int

Atalho para HMIRROR | TRANSPOSE (rotaciona 270 graus no sentido horário).

Subamostragem JPEG

Passe qualquer um dos seguintes como argumento subsampling para Image.to_jpeg(), Image.compress() ou Image.save() ao gravar um JPEG.

image.JPEG_SUBSAMPLING_AUTO: int

Escolhe a subamostragem de crominância automaticamente com base na configuração de qualidade do JPEG.

image.JPEG_SUBSAMPLING_444: int

Força a subamostragem de crominância 4:4:4 (sem compressão de crominância).

image.JPEG_SUBSAMPLING_422: int

Força a subamostragem de crominância 4:2:2. Recomendado ao transmitir MJPEG para players de vídeo de terceiros que se comportam mal com 4:2:0.

image.JPEG_SUBSAMPLING_420: int

Força a subamostragem de crominância 4:2:0.

Correspondência de modelo

Passe um dos seguintes como argumento search para Image.find_template().

image.SEARCH_EX: int

Busca exaustiva – avalia cada posição na ROI. A mais lenta, mas garante encontrar a melhor correspondência.

image.SEARCH_DS: int

Busca em diamante – busca de grosseira a fina, muito mais rápida que SEARCH_EX, mas que pode perder o ótimo global em modelos altamente auto-similares.

Detecção de bordas

Passe um dos seguintes como argumento algorithm para Image.find_edges().

image.EDGE_CANNY: int

Detector de bordas Canny – magnitude do gradiente + supressão de não máximos + histerese. Maior qualidade, mais lento.

image.EDGE_SIMPLE: int

Detector de bordas por filtro passa-alta com limiar. Mais rápido, mas produz bordas mais grossas e ruidosas que EDGE_CANNY.

Detectores de cantos ORB

Passe um dos seguintes como argumento corner_detector para Image.find_keypoints().

image.CORNER_FAST: int

Detector de cantos FAST. Mais rápido que CORNER_AGAST, mas menos preciso.

image.CORNER_AGAST: int

Detector de cantos AGAST. Mais lento que CORNER_FAST, mas produz pontos-chave mais estáveis.

Famílias AprilTag

Combine qualquer combinação dos seguintes com OR de bits e passe como argumento families para Image.find_apriltags(). Cada família é controlada por sua própria opção de build no firmware; famílias não suportadas ficam ausentes em tempo de execução, em vez de sempre retornarem zero.

image.TAG16H5: int

Família AprilTag 16h5 (30 IDs únicos, correção de erro de 0 bits).

image.TAG25H9: int

Família AprilTag 25h9 (35 IDs únicos, correção de erro de até 3 bits).

image.TAG36H10: int

Família AprilTag 36h10 (2320 IDs únicos, correção de erro de até 3 bits).

image.TAG36H11: int

Família AprilTag 36h11 (587 IDs únicos, correção de erro de até 4 bits). A família mais comum.

image.TAGCIRCLE21H7: int

Família AprilTag Circle21h7.

image.TAGCIRCLE49H12: int

Família AprilTag Circle49h12.

image.TAGCUSTOM48H12: int

Família AprilTag Custom48h12.

image.TAGSTANDARD41H12: int

Família AprilTag Standard41h12.

image.TAGSTANDARD52H13: int

Família AprilTag Standard52h13.

Simbologias de código de barras

Os valores reportados em BarCode.type para entradas retornadas por Image.find_barcodes().

image.EAN2: int

Código de barras suplementar EAN-2.

image.EAN5: int

Código de barras suplementar 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 empilhado 2D PDF417. A constante existe por completude, mas o decodificador de código de barras atualmente não implementa PDF417 – Image.find_barcodes() não retornará detecções deste tipo.

image.CODE93: int

Código de barras Code 93.

image.CODE128: int

Código de barras Code 128.