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; aImageretornada 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çãoImageIOda OpenMV.A partir de um ndarray. Passe um
ndarrayfloat32(h, w)ou(h, w, 3)ao construtor deImage. Os pixels são escalados de0.0 -- 255.0para uma imagem GRAYSCALE ou RGB565, respectivamente. Use isto para trazer a saída de tensores doml(ou de qualquer pipelineulab) de volta para uma imagem desenhável.Buffer vazio. Construa uma
Imagecom 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()ouImage.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¶
- class Image – Objeto de imagem
- classe ImageIO – objeto ImageIO
- classe HaarCascade – Descritor de Característica
- classe Similarity – objeto Similarity
- classe Histogram – objeto Histogram
- classe Percentile – objeto Percentile
- class Threshold – Objeto Threshold
- classe Statistics – objeto Statistics
- classe Blob – objeto Blob
- classe Line – objeto Line
- classe Circle – objeto Circle
- classe Rect – objeto Rectangle
- classe QRCode – objeto QRCode
- class AprilTag – objeto AprilTag
- classe DataMatrix – objeto DataMatrix
- classe BarCode – objeto BarCode
- classe Displacement – objeto Displacement
- class kptmatch – Objeto de correspondência de pontos-chave
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 –
int0 – 1.escala de cinza –
int0 – 255.RGB – tupla
(r, g, b)de inteiros de 8 bits (cada um de 0 – 255).LAB – tupla
(l, a, b)comLem 0 – 100 eA/Bem -128 – 127.YUV – tupla
(y, u, v)comYem 0 – 255 eU/Vem -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.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_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_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_grayscale(value: Tuple[int, int, int]) int¶
Converte uma tupla YUV em um valor de escala de cinza.
Descritores de características¶
- image.HaarCascade(path: str, stages: int = -1) Cascade¶
Carrega um Haar Cascade e retorna um handle
Cascadepara uso comImage.find_features().pathpode ser:a string literal
"frontalface"ou"eye"para carregar um dos dois cascades embutidos na ROM do firmware, ouum caminho no sistema de arquivos para um arquivo binário
.cascadepersonalizado, produzido pelas ferramentas de conversão de cascade da OpenMV.
stagesseleciona quantos estágios do cascade avaliar no momento da detecção.-1usa 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
pathe o retorna. A tag de tipo interna do arquivo seleciona qual classe de descritor será reconstruída:Descritor de pontos-chave ORB – salvo por
Image.find_keypoints()seguido deimage.save_descriptor().Descritor LBP – salvo por
Image.find_lbp()seguido deimage.save_descriptor().
- image.save_descriptor(descriptor: kp_desc | lbp_desc, path: str) None¶
Serializa
descriptor(um descritor de pontos-chave ORB ou LBP) para o arquivo empathno formato de arquivo de descritor da OpenMV. O mesmo arquivo pode ser recarregado posteriormente viaimage.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
kptmatchdescrevendo o agrupamento de pontos-chave correspondentes, ouNonese nenhuma correspondência passar dethreshold.
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_outliershabilita 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) deblob. 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) deblob. Float, 0 – 1; 1.0 é um blob perfeitamente convexo.
- image.get_major_axis_line(blob: blob) line¶
Retorna uma
Lineao longo do eixo maior deblob(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
Lineao longo do eixo menor deblob(o mais curto dos dois eixos principais do retângulo rotacionado de área mínima).
- 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 deblob: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, Vpor 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()ouImage.to_rgb565()antes.
- image.PNG: int¶
Buffer PNG comprimido. Operações em nível de pixel exigem
Image.to_grayscale()ouImage.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_palettepara fazer o driver GENX320 emitir quadros RGB565 colorizados em modo de histograma, ou paraImage.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.
Dicas de desenho / draw_image¶
Combine qualquer uma destas com OR de bits e passe como argumento hint de Image.draw_image().
- 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).
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).
Correspondência de modelo¶
Passe um dos seguintes como argumento search para Image.find_template().
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.
Simbologias de código de barras¶
Os valores reportados em BarCode.type para entradas retornadas por Image.find_barcodes().
- 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.