image — visione artificiale¶
Il modulo image è il cuore dello stack di visione artificiale di OpenMV. Espone la classe Image – il buffer di pixel in memoria su cui operano tutte le routine di disegno, filtraggio, trasformazione ed estrazione di caratteristiche – insieme agli oggetti risultato di supporto restituiti da tali routine (Blob, Line, Circle, Rect, QRCode, AprilTag, DataMatrix, BarCode, …) e alle classi di supporto usate per configurarle (Threshold, Histogram, Statistics, HaarCascade, Similarity, Percentile, Displacement, ImageIO).
Acquisire un’immagine¶
Ci sono quattro modi per portare un’immagine Image in RAM:
Acquisizione dal vivo dal sensore della camera. Chiama
csi.CSI.snapshot()per acquisire il frame successivo direttamente nel frame buffer; l’immagineImagerestituita fa riferimento a quel buffer.Da un file. Passa un percorso al costruttore di
Image(image.Image("/sd/photo.jpg")); i formati su disco supportati sono BMP, PPM/PGM, JPEG, PNG e il formato di registrazioneImageIOdi OpenMV.Da un ndarray. Passa un
ndarrayfloat32(h, w)o(h, w, 3)al costruttore diImage. I pixel vengono scalati da0.0 -- 255.0rispettivamente in un’immagine GRAYSCALE o RGB565. Usalo per riportare l’output tensoriale diml(o di qualsiasi pipelineulab) in un’immagine disegnabile.Buffer vuoto. Costruisci un’immagine
Imagecon una dimensione e un formato di pixel dati (image.Image(320, 240, image.RGB565)) su cui disegnare da zero, oppure da usare come superficie di lavoro per l’aritmetica sulle immagini.
Formati di pixel¶
Ogni Image ha uno dei seguenti formati di pixel; la scelta è un compromesso tra memoria, costo di elaborazione e quali algoritmi possono essere eseguiti su di essa. Usa BINARY, GRAYSCALE, RGB565, BAYER, YUV422, JPEG o PNG come argomento pixformat durante la costruzione di un’immagine o la configurazione del sensore della camera:
BINARY (1 bpp) – un bit per pixel. Il formato più piccolo; usato internamente dalle routine di soglia e morfologia ma raramente acquisito direttamente dal sensore.
GRAYSCALE (8 bpp) – un byte per pixel (il canale Y di YUV422). Il formato più veloce per la maggior parte degli algoritmi di visione artificiale (AprilTag, rilevamento dei bordi, flusso ottico).
RGB565 (16 bpp) – due byte per pixel, rosso a 5 bit / verde a 6 bit / blu a 5 bit. Il formato colore predefinito.
BAYER (8 bpp) – dati colore raw in pattern Bayer direttamente dal sensore. Utile per il de-mosaicing personalizzato o per memorizzare più pixel in meno memoria prima del debayering su richiesta.
YUV422 (16 bpp) – colore con sottocampionamento di crominanza 4:2:2, due byte per pixel. Utile quando si desiderano algoritmi specifici per la crominanza senza pagare il costo completo dell’RGB.
JPEG / PNG – buffer compressi. Ideali per l’archiviazione e la trasmissione in rete. Le operazioni a livello di pixel richiedono prima
Image.to_grayscale()oImage.to_rgb565().
Lavorare con i risultati¶
I metodi di rilevamento / estrazione di caratteristiche di Image restituiscono oggetti su cui puoi iterare e che puoi combinare – una chiamata a Image.find_blobs() restituisce un elenco di Blob, una chiamata a Image.find_apriltags() restituisce un elenco di AprilTag, ecc. Ogni classe di risultato espone le proprietà geometriche del rilevamento (centroide, bounding box, area, valore del codice, ecc.) così da poter agire direttamente su di esse o passarle nuovamente ai metodi di disegno (Image.draw_rectangle(), Image.draw_string(), …).
Funzioni di supporto per lo spazio colore¶
Il modulo espone anche piccole funzioni pure per convertire singoli valori di pixel tra gli spazi colore binario / scala di grigi / RGB / LAB / YUV. Sono utili quando devi convertire valori di soglia o voci di palette in Python prima di passarli alle operazioni sulle immagini – per la conversione dell’immagine completa usa i metodi to_* di Image, che sono molto più veloci del chiamare queste funzioni di supporto in un ciclo.
Classi¶
- class Image – Oggetto immagine
- classe ImageIO – oggetto ImageIO
- class HaarCascade – Descrittore di caratteristiche
- classe Similarity – oggetto Similarity
- class Histogram – oggetto Histogram
- classe Percentile – oggetto Percentile
- class Threshold – Oggetto Threshold
- classe Statistics – oggetto Statistics
- class Blob – oggetto Blob
- classe Line – oggetto Line
- class Circle – oggetto Circle
- classe Rect – oggetto Rectangle
- classe QRCode – oggetto QRCode
- class AprilTag – oggetto AprilTag
- class DataMatrix – oggetto DataMatrix
- class BarCode – oggetto BarCode
- class Displacement – oggetto Displacement
- class kptmatch – Oggetto keypoint match
Funzioni¶
Funzioni di supporto per la conversione dello spazio colore¶
Ognuna delle funzioni X_to_Y qui sotto esegue una singola conversione del valore di un pixel. Tutte accettano/restituiscono valori negli intervalli canonici di OpenMV:
binario –
int0 – 1.scala di grigi –
int0 – 255.RGB – tupla
(r, g, b)di interi a 8 bit (ciascuno 0 – 255).LAB – tupla
(l, a, b)conLin 0 – 100 eA/Bin -128 – 127.YUV – tupla
(y, u, v)conYin 0 – 255 eU/Vin -128 – 127.
Per la conversione dell’immagine completa usa i metodi to_* di Image, che sono molto più veloci del chiamare queste funzioni di supporto in un ciclo.
- image.binary_to_grayscale(value: int) int¶
Converte un valore binario in un valore in scala di grigi.
- image.grayscale_to_binary(value: int) int¶
Converte un valore in scala di grigi in un valore binario.
- image.grayscale_to_rgb(value: int) Tuple[int, int, int]¶
Converte un valore in scala di grigi in una tupla RGB.
- image.grayscale_to_lab(value: int) Tuple[int, int, int]¶
Converte un valore in scala di grigi in una tupla LAB.
- image.grayscale_to_yuv(value: int) Tuple[int, int, int]¶
Converte un valore in scala di grigi in una tupla YUV.
- image.rgb_to_grayscale(value: Tuple[int, int, int]) int¶
Converte una tupla RGB in un valore in scala di grigi.
- image.rgb_to_lab(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Converte una tupla RGB in una tupla LAB.
- image.rgb_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Converte una tupla RGB in una tupla YUV.
- image.lab_to_grayscale(value: Tuple[int, int, int]) int¶
Converte una tupla LAB in un valore in scala di grigi.
- image.lab_to_rgb(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Converte una tupla LAB in una tupla RGB.
- image.lab_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Converte una tupla LAB in una tupla YUV.
- image.yuv_to_grayscale(value: Tuple[int, int, int]) int¶
Converte una tupla YUV in un valore in scala di grigi.
Descrittori di caratteristiche¶
- image.HaarCascade(path: str, stages: int = -1) Cascade¶
Carica una Haar Cascade e restituisce un handle
Cascadeda usare conImage.find_features().pathpuò essere:la stringa letterale
"frontalface"o"eye"per caricare una delle due cascade integrate nella ROM del firmware, oppureun percorso del filesystem a un file binario
.cascadepersonalizzato prodotto dagli strumenti di conversione cascade di OpenMV.
stagesseleziona quanti stadi della cascade valutare al momento del rilevamento.-1usa ogni stadio memorizzato nel file. Ridurre questo valore velocizza il rilevamento al costo di un maggior numero di falsi positivi.
- image.load_descriptor(path: str) kp_desc | lbp_desc¶
Carica un descrittore dal file in
pathe lo restituisce. Il tag di tipo interno del file seleziona quale classe di descrittore viene ricostruita:Descrittore di keypoint ORB – salvato da
Image.find_keypoints()seguito daimage.save_descriptor().Descrittore LBP – salvato da
Image.find_lbp()seguito daimage.save_descriptor().
- image.save_descriptor(descriptor: kp_desc | lbp_desc, path: str) None¶
Serializza
descriptor(un descrittore di keypoint ORB o LBP) nel file inpathnel formato di file descrittore di OpenMV. Lo stesso file può essere ricaricato in seguito tramiteimage.load_descriptor().
- image.match_descriptor(descriptor0, descriptor1, threshold: int = 85, filter_outliers: bool = False) int | kptmatch¶
Confronta due descrittori dello stesso tipo.
Per due descrittori LBP – restituisce una distanza di Hamming intera tra di essi (più bassa indica una corrispondenza più stretta).
Per due descrittori di keypoint ORB – restituisce un
kptmatchche descrive il cluster di keypoint corrispondenti, oppureNonese nessuna corrispondenza superathreshold.
threshold(0 – 100) imposta quanto è rigoroso il matching ORB nell’accettare una coppia di keypoint. Valori più bassi rendono il matching più stretto rifiutando le corrispondenze deboli al vicino più prossimo.filter_outliersabilita il rifiuto degli outlier in stile RANSAC sull’insieme dei keypoint corrispondenti. Usalo quando ti aspetti una singola trasformazione rigida tra le due viste; disabilitalo quando i keypoint corrispondenti coprono più oggetti.
Funzioni di supporto per la geometria dei blob¶
Queste funzioni di supporto prendono un Blob (come restituito da Image.find_blobs()) e calcolano proprietà geometriche aggiuntive su richiesta. Risiedono a livello di modulo – non su Blob – così che il percorso base di find_blobs() non ne paghi il costo se non lo richiedi.
- image.get_solidity(blob: blob) float¶
Restituisce la solidità (
blob.pixels / convex_hull_area) diblob. Float, 0 – 1; 1.0 significa che il blob riempie completamente il suo guscio convesso.
- image.get_convexity(blob: blob) float¶
Restituisce la convessità (
convex_hull_perimeter / blob.perimeter) diblob. Float, 0 – 1; 1.0 indica un blob perfettamente convesso.
- image.get_major_axis_line(blob: blob) line¶
Restituisce una
Linelungo l’asse maggiore diblob(il più lungo dei due assi principali del rettangolo ruotato di area minima).
- image.get_minor_axis_line(blob: blob) line¶
Restituisce una
Linelungo l’asse minore diblob(il più corto dei due assi principali del rettangolo ruotato di area minima).
- image.get_enclosed_ellipse(blob: blob) Tuple[int, int, int, int, int]¶
Restituisce una 5-tupla
(cx, cy, a, b, rotation)che descrive l’ellisse inscritta nel rettangolo ruotato di area minima attorno ablob:cx/cy– centro dell’ellisse in pixel (intero).a/b– lunghezze dei semiassi in pixel (intero).rotation– rotazione dell’ellisse in gradi (intero).
Questa è una tupla semplice, non una attrtuple, quindi i campi sono accessibili solo per indice.
Costanti¶
Formati di pixel¶
Passa uno qualsiasi dei seguenti come argomento pixformat al costruttore di Image o a csi.CSI.pixformat().
- image.BINARY: int¶
Bitmap a 1 bit per pixel. Il formato più piccolo – usato internamente dalle routine di soglia e morfologia, raramente acquisito direttamente da un sensore.
- image.GRAYSCALE: int¶
Scala di grigi a 8 bit per pixel (un byte per pixel). Il formato più veloce per la maggior parte degli algoritmi di visione artificiale (AprilTag, rilevamento dei bordi, flusso ottico).
- image.RGB565: int¶
Colore a 16 bit per pixel impacchettato come 5 bit rosso / 6 bit verde / 5 bit blu. Il formato colore predefinito.
- image.BAYER: int¶
Dati Bayer raw a 8 bit per pixel direttamente dal sensore. La maggior parte dei metodi di elaborazione delle immagini non è disponibile sulle immagini Bayer; usalo quando vuoi fare il debayer su richiesta o memorizzare più pixel in meno memoria.
- image.YUV422: int¶
Colore con sottocampionamento di crominanza 4:2:2, due byte per pixel, impacchettato come
Y1, U, Y2, Vper coppia di pixel. Solo alcuni metodi di elaborazione delle immagini funzionano direttamente su YUV422.
- image.JPEG: int¶
Buffer JPEG compresso. Le operazioni a livello di pixel richiedono prima
Image.to_grayscale()oImage.to_rgb565().
- image.PNG: int¶
Buffer PNG compresso. Le operazioni a livello di pixel richiedono prima
Image.to_grayscale()oImage.to_rgb565().
Palette di colori¶
Passa uno qualsiasi dei seguenti a Image.to_rainbow(), Image.to_ironbow(), Image.draw_image() (color_palette=) o a csi.CSI.color_palette() per colorare un’immagine in scala di grigi.
- image.PALETTE_RAINBOW: int¶
Ruota dei colori arcobaleno fluida. La palette OpenMV predefinita per le immagini termiche.
- image.PALETTE_IRONBOW: int¶
Palette «ironbow» non lineare che imita l’aspetto del mirino termico FLIR Lepton.
- image.PALETTE_DEPTH: int¶
Palette per immagini di profondità. Disponibile solo nelle build con supporto per sensori di profondità (la pipeline ToF – ad esempio OpenMV Cam AE3 o qualsiasi cam con un Pmod ToF collegato).
- image.PALETTE_EVT_DARK: int¶
Palette per visualizzare i frame della event-camera GENX320 su sfondo scuro. Passala a
csi.CSI.color_paletteper far sì che il driver GENX320 emetta frame RGB565 colorati in modalità istogramma, oppure aImage.draw_image()color_palette=quando colori un’immagine di eventi in scala di grigi.Disponibile solo nelle build con supporto GENX320 (OpenMV Cam AE3 e il Pmod GENX320).
- image.PALETTE_EVT_LIGHT: int¶
Palette per visualizzare i frame della event-camera GENX320 su sfondo chiaro. Stesso dispatch e disponibilità di
PALETTE_EVT_DARK.
Modalità di scalatura¶
Passa uno qualsiasi dei seguenti come argomento hint a Image.draw_image(), Image.scale() o a metodi di scalatura simili.
Hint di disegno / draw_image¶
Combina uno qualsiasi di questi con un OR a livello di bit e passalo come argomento hint di Image.draw_image().
- image.CENTER: int¶
Centra la sorgente sulla destinazione. Eventuali offset x/y espliciti diventano allora offset rispetto al centro anziché rispetto all’angolo in alto a sinistra.
- image.EXTRACT_RGB_CHANNEL_FIRST: int¶
Quando si estrae un canale RGB tramite
Image.draw_image(), estrae il canale prima della scalatura. Senza questo hint, il canale viene estratto dopo la scalatura.
- image.APPLY_COLOR_PALETTE_FIRST: int¶
Quando si applica una palette di colori tramite
Image.draw_image(), applica la palette prima della scalatura. Senza questo hint, la palette viene applicata dopo la scalatura.
- image.SCALE_ASPECT_KEEP: int¶
Scala la sorgente per adattarla all’interno della destinazione mantenendo le proporzioni (aggiunge bande quando i rapporti differiscono).
- image.SCALE_ASPECT_EXPAND: int¶
Scala la sorgente per riempire la destinazione mantenendo le proporzioni (ritaglia quando i rapporti differiscono).
- image.SCALE_ASPECT_IGNORE: int¶
Scala la sorgente per riempire la destinazione, ignorando le proporzioni.
Sottocampionamento JPEG¶
Passa uno qualsiasi dei seguenti come argomento subsampling a Image.to_jpeg(), Image.compress() o Image.save() quando scrivi un JPEG.
- image.JPEG_SUBSAMPLING_AUTO: int¶
Sceglie automaticamente il sottocampionamento di crominanza in base all’impostazione della qualità JPEG.
- image.JPEG_SUBSAMPLING_444: int¶
Forza il sottocampionamento di crominanza 4:4:4 (nessuna compressione della crominanza).
Template matching¶
Passa uno dei seguenti come argomento search a Image.find_template().
Rilevamento dei bordi¶
Passa uno dei seguenti come argomento algorithm a Image.find_edges().
- image.EDGE_CANNY: int¶
Rilevatore di bordi Canny – magnitudine del gradiente + soppressione dei non-massimi + isteresi. Qualità superiore, più lento.
- image.EDGE_SIMPLE: int¶
Rilevatore di bordi a filtro passa-alto con soglia. Più veloce ma produce bordi più spessi e più rumorosi rispetto a
EDGE_CANNY.
Rilevatori di angoli ORB¶
Passa uno dei seguenti come argomento corner_detector a Image.find_keypoints().
- image.CORNER_FAST: int¶
Rilevatore di angoli FAST. Più veloce di
CORNER_AGASTma meno accurato.
- image.CORNER_AGAST: int¶
Rilevatore di angoli AGAST. Più lento di
CORNER_FASTma produce keypoint più stabili.
Famiglie AprilTag¶
Combina con un OR a livello di bit qualsiasi combinazione dei seguenti e passala come argomento families a Image.find_apriltags(). Ogni famiglia è condizionata dalla propria opzione di build nel firmware; le famiglie non supportate sono assenti a runtime anziché sempre a zero.
Simbologie di barcode¶
I valori riportati in BarCode.type per le voci restituite da Image.find_barcodes().
- image.PDF417: int¶
Barcode 2D stacked PDF417. La costante esiste per completezza, ma il decodificatore di barcode attualmente non implementa PDF417 –
Image.find_barcodes()non restituirà rilevamenti di questo tipo.