image — viziune artificială¶
Modulul image este inima stivei de viziune artificială OpenMV. El expune clasa Image – tamponul de pixeli din memorie pe care operează fiecare rutină de desenare, filtrare, transformare și extragere de caracteristici – împreună cu obiectele de rezultat asociate returnate de aceste rutine (Blob, Line, Circle, Rect, QRCode, AprilTag, DataMatrix, BarCode, …) și clasele auxiliare folosite pentru configurarea lor (Threshold, Histogram, Statistics, HaarCascade, Similarity, Percentile, Displacement, ImageIO).
Obținerea unei imagini¶
Există patru moduri de a aduce o Image în RAM:
Captură live de la senzorul camerei. Apelați
csi.CSI.snapshot()pentru a captura cadrul următor direct în tamponul de cadre (frame buffer);Imagereturnată face referire la acel tampon.Dintr-un fișier. Transmiteți o cale către constructorul
Image(image.Image("/sd/photo.jpg")); formatele acceptate pe disc sunt BMP, PPM/PGM, JPEG, PNG și formatul de înregistrare OpenMVImageIO.Dintr-un ndarray. Transmiteți un
ndarrayfloat32(h, w)sau(h, w, 3)către constructorulImage. Pixelii sunt scalați din0.0 -- 255.0într-o imagine GRAYSCALE, respectiv RGB565. Folosiți acest mod pentru a readuce ieșirea tensorială dinml(sau orice fluxulab) într-o imagine pe care se poate desena.Tampon gol. Construiți o
Imagecu o dimensiune și un format de pixeli dat (image.Image(320, 240, image.RGB565)) pentru a desena de la zero pe ea sau pentru a o folosi ca suprafață temporară pentru aritmetica de imagini.
Formate de pixeli¶
Fiecare Image are unul dintre formatele de pixeli de mai jos; alegerea este un compromis între memorie, cost de procesare și algoritmii care pot rula pe ea. Folosiți BINARY, GRAYSCALE, RGB565, BAYER, YUV422, JPEG sau PNG ca argument pixformat la construirea unei imagini sau la configurarea senzorului camerei:
BINARY (1 bpp) – un bit per pixel. Cel mai mic format; folosit intern de rutinele de prag și de morfologie, dar rareori capturat direct de la senzor.
GRAYSCALE (8 bpp) – un octet per pixel (canalul Y din YUV422). Cel mai rapid format pentru majoritatea algoritmilor de viziune artificială (AprilTag, detectarea muchiilor, fluxul optic).
RGB565 (16 bpp) – doi octeți per pixel, 5 biți roșu / 6 biți verde / 5 biți albastru. Formatul de culoare implicit.
BAYER (8 bpp) – date de culoare brute în model Bayer direct de la senzor. Utile pentru de-mosaicing personalizat sau pentru stocarea mai multor pixeli în mai puțină memorie înainte de debayering la cerere.
YUV422 (16 bpp) – culoare cu subeșantionare cromatică 4:2:2, doi octeți per pixel. Utilă atunci când doriți algoritmi specifici cromaticii fără a plăti costul complet al RGB.
JPEG / PNG – tampoane comprimate. Cele mai potrivite pentru stocare și transmisie în rețea. Operațiile la nivel de pixel necesită mai întâi
Image.to_grayscale()sauImage.to_rgb565().
Lucrul cu rezultatele¶
Metodele de detectare / extragere de caracteristici de pe Image returnează obiecte peste care puteți itera și pe care le puteți combina – un apel Image.find_blobs() returnează o listă de Blob, un apel Image.find_apriltags() returnează o listă de AprilTag etc. Fiecare clasă de rezultat expune proprietățile geometrice ale detectării (centroid, casetă de încadrare, arie, valoare a codului etc.), astfel încât puteți acționa direct asupra lor sau le puteți transmite înapoi în metodele de desenare (Image.draw_rectangle(), Image.draw_string(), …).
Funcții auxiliare pentru spațiul de culoare¶
Modulul expune de asemenea mici funcții pure pentru conversia valorilor individuale de pixeli între spațiile de culoare binar / tonuri de gri / RGB / LAB / YUV. Acestea sunt utile când trebuie să convertiți în Python valori de prag sau intrări din paletă înainte de a le transmite în operații pe imagini – pentru conversia întregii imagini folosiți metodele to_* ale clasei Image, care sunt mult mai rapide decât apelarea acestor funcții auxiliare într-o buclă.
Clase¶
- class Image – obiectul imagine
- clasa ImageIO – obiectul ImageIO
- class HaarCascade – Descriptor de caracteristici
- clasa Similarity – obiectul Similarity
- class Histogram – obiect Histogram
- clasa Percentile – obiectul Percentile
- class Threshold – Obiectul Threshold
- clasa Statistics – obiectul Statistics
- class Blob – obiect Blob
- clasa Line – obiectul Line
- class Circle – obiect Circle
- clasa Rect – obiectul Rectangle
- clasa QRCode – obiectul QRCode
- class AprilTag – obiect AprilTag
- class DataMatrix – obiect DataMatrix
- class BarCode – obiect BarCode
- class Displacement – obiect Displacement
- class kptmatch – Obiectul de potrivire a punctelor-cheie
Funcții¶
Funcții auxiliare pentru conversia spațiului de culoare¶
Fiecare dintre funcțiile X_to_Y de mai jos efectuează o singură conversie de valoare a pixelului. Toate primesc/returnează valori în intervalele canonice OpenMV:
binary –
int0 – 1.grayscale –
int0 – 255.RGB – tuplu
(r, g, b)de întregi pe 8 biți (fiecare 0 – 255).LAB – tuplu
(l, a, b)cuLîn 0 – 100 șiA/Bîn -128 – 127.YUV – tuplu
(y, u, v)cuYîn 0 – 255 șiU/Vîn -128 – 127.
Pentru conversia întregii imagini folosiți metodele to_* ale clasei Image, care sunt mult mai rapide decât apelarea acestor funcții auxiliare într-o buclă.
- image.binary_to_grayscale(value: int) int¶
Convertește o valoare binară într-o valoare în tonuri de gri.
- image.binary_to_rgb(value: int) Tuple[int, int, int]¶
Convertește o valoare binară într-un tuplu RGB.
- image.binary_to_lab(value: int) Tuple[int, int, int]¶
Convertește o valoare binară într-un tuplu LAB.
- image.binary_to_yuv(value: int) Tuple[int, int, int]¶
Convertește o valoare binară într-un tuplu YUV.
- image.grayscale_to_binary(value: int) int¶
Convertește o valoare în tonuri de gri într-o valoare binară.
- image.grayscale_to_rgb(value: int) Tuple[int, int, int]¶
Convertește o valoare în tonuri de gri într-un tuplu RGB.
- image.grayscale_to_lab(value: int) Tuple[int, int, int]¶
Convertește o valoare în tonuri de gri într-un tuplu LAB.
- image.grayscale_to_yuv(value: int) Tuple[int, int, int]¶
Convertește o valoare în tonuri de gri într-un tuplu YUV.
- image.rgb_to_binary(value: Tuple[int, int, int]) int¶
Convertește un tuplu RGB într-o valoare binară.
- image.rgb_to_grayscale(value: Tuple[int, int, int]) int¶
Convertește un tuplu RGB într-o valoare în tonuri de gri.
- image.rgb_to_lab(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Convertește un tuplu RGB într-un tuplu LAB.
- image.rgb_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Convertește un tuplu RGB într-un tuplu YUV.
- image.lab_to_binary(value: Tuple[int, int, int]) int¶
Convertește un tuplu LAB într-o valoare binară.
- image.lab_to_grayscale(value: Tuple[int, int, int]) int¶
Convertește un tuplu LAB într-o valoare în tonuri de gri.
- image.lab_to_rgb(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Convertește un tuplu LAB într-un tuplu RGB.
- image.lab_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Convertește un tuplu LAB într-un tuplu YUV.
- image.yuv_to_binary(value: Tuple[int, int, int]) int¶
Convertește un tuplu YUV într-o valoare binară.
- image.yuv_to_grayscale(value: Tuple[int, int, int]) int¶
Convertește un tuplu YUV într-o valoare în tonuri de gri.
Descriptori de caracteristici¶
- image.HaarCascade(path: str, stages: int = -1) Cascade¶
Încarcă un Haar Cascade și returnează un descriptor
Cascadepentru utilizare cuImage.find_features().pathpoate fi fie:șirul literal
"frontalface"sau"eye"pentru a încărca unul dintre cele două cascade integrate în ROM-ul firmware-ului, fieo cale din sistemul de fișiere către un fișier binar
.cascadepersonalizat produs de instrumentele de conversie a cascadelor OpenMV.
stagesselectează câte etape de cascadă se evaluează la momentul detectării.-1folosește toate etapele stocate în fișier. Reducerea acestei valori accelerează detectarea cu prețul mai multor rezultate fals-pozitive.
- image.load_descriptor(path: str) kp_desc | lbp_desc¶
Încarcă un descriptor din fișierul de la
pathși îl returnează. Eticheta de tip internă a fișierului selectează ce clasă de descriptor este reconstruită:descriptor de puncte-cheie ORB – salvat de
Image.find_keypoints()urmat deimage.save_descriptor().descriptor LBP – salvat de
Image.find_lbp()urmat deimage.save_descriptor().
- image.save_descriptor(descriptor: kp_desc | lbp_desc, path: str) None¶
Serializează
descriptor(un descriptor de puncte-cheie ORB sau un descriptor LBP) în fișierul de lapathîn formatul de fișier de descriptori OpenMV. Același fișier poate fi reîncărcat ulterior prinimage.load_descriptor().
- image.match_descriptor(descriptor0, descriptor1, threshold: int = 85, filter_outliers: bool = False) int | kptmatch¶
Potrivește doi descriptori de același tip.
Pentru doi descriptori LBP – returnează o distanță Hamming întreagă între ei (mai mică înseamnă o potrivire mai apropiată).
Pentru doi descriptori de puncte-cheie ORB – returnează un
kptmatchcare descrie clusterul de puncte-cheie potrivite, sauNonedacă nicio potrivire nu trece dethreshold.
threshold(0 – 100) stabilește cât de strictă este potrivirea ORB la acceptarea unei perechi de puncte-cheie. Valorile mai mici fac potrivirea mai strictă prin respingerea potrivirilor slabe între cei mai apropiați vecini.filter_outliersactivează respingerea valorilor aberante în stil RANSAC pe ansamblul punctelor-cheie potrivite. Folosiți-o când vă așteptați la o singură transformare rigidă între cele două vederi; dezactivați-o când punctele-cheie potrivite se întind pe mai multe obiecte.
Funcții auxiliare pentru geometria blob-urilor¶
Aceste funcții auxiliare primesc un Blob (așa cum este returnat de Image.find_blobs()) și calculează proprietăți geometrice suplimentare la cerere. Ele se află la nivel de modul – nu pe Blob – astfel încât calea de bază find_blobs() nu plătește pentru ele decât dacă le solicitați.
- image.get_solidity(blob: blob) float¶
Returnează soliditatea (
blob.pixels / convex_hull_area) a luiblob. Float, 0 – 1; 1.0 înseamnă că blob-ul umple complet învelișul său convex.
- image.get_convexity(blob: blob) float¶
Returnează convexitatea (
convex_hull_perimeter / blob.perimeter) a luiblob. Float, 0 – 1; 1.0 este un blob perfect convex.
- image.get_major_axis_line(blob: blob) line¶
Returnează o
Linede-a lungul axei mari a luiblob(cea mai lungă dintre cele două axe principale ale dreptunghiului rotit de arie minimă).
- image.get_minor_axis_line(blob: blob) line¶
Returnează o
Linede-a lungul axei mici a luiblob(cea mai scurtă dintre cele două axe principale ale dreptunghiului rotit de arie minimă).
- image.get_enclosed_ellipse(blob: blob) Tuple[int, int, int, int, int]¶
Returnează un tuplu de 5 elemente
(cx, cy, a, b, rotation)care descrie elipsa înscrisă în dreptunghiul rotit de arie minimă din jurul luiblob:cx/cy– centrul elipsei în pixeli (întreg).a/b– lungimile semiaxelor în pixeli (întreg).rotation– rotația elipsei în grade (întreg).
Acesta este un tuplu simplu, nu un attrtuple, deci câmpurile sunt accesibile doar prin index.
Constante¶
Formate de pixeli¶
Transmiteți oricare dintre următoarele ca argument pixformat al constructorului Image sau al csi.CSI.pixformat().
- image.BINARY: int¶
Bitmap pe 1 bit per pixel. Cel mai mic format – folosit intern de prag și morfologie, rareori capturat direct de la un senzor.
- image.GRAYSCALE: int¶
Tonuri de gri pe 8 biți per pixel (un octet per pixel). Cel mai rapid format pentru majoritatea algoritmilor de viziune artificială (AprilTag, detectarea muchiilor, fluxul optic).
- image.RGB565: int¶
Culoare pe 16 biți per pixel împachetată ca 5 biți roșu / 6 biți verde / 5 biți albastru. Formatul de culoare implicit.
- image.BAYER: int¶
Date Bayer brute pe 8 biți per pixel direct de la senzor. Majoritatea metodelor de procesare a imaginii nu sunt disponibile pe imaginile Bayer; folosiți acest format când doriți să faceți debayering la cerere sau să stocați mai mulți pixeli în mai puțină memorie.
- image.YUV422: int¶
Culoare cu subeșantionare cromatică 4:2:2, doi octeți per pixel, împachetată ca
Y1, U, Y2, Vpe fiecare pereche de pixeli. Doar unele metode de procesare a imaginii funcționează direct pe YUV422.
- image.JPEG: int¶
Tampon JPEG comprimat. Operațiile la nivel de pixel necesită mai întâi
Image.to_grayscale()sauImage.to_rgb565().
- image.PNG: int¶
Tampon PNG comprimat. Operațiile la nivel de pixel necesită mai întâi
Image.to_grayscale()sauImage.to_rgb565().
Palete de culori¶
Transmiteți oricare dintre următoarele către Image.to_rainbow(), Image.to_ironbow(), Image.draw_image() (color_palette=) sau către csi.CSI.color_palette() pentru a colora o imagine în tonuri de gri.
- image.PALETTE_RAINBOW: int¶
Roată de culori curcubeu netedă. Paleta OpenMV implicită pentru imaginile termice.
- image.PALETTE_IRONBOW: int¶
Paletă neliniară de tip „ironbow” care imită aspectul vizorului termic FLIR Lepton.
- image.PALETTE_DEPTH: int¶
Paletă pentru imagini de adâncime. Disponibilă doar pe versiunile cu suport pentru senzor de adâncime (fluxul ToF – de ex. OpenMV Cam AE3 sau orice cameră cu un Pmod ToF atașat).
- image.PALETTE_EVT_DARK: int¶
Paletă pentru vizualizarea cadrelor de la camera de evenimente GENX320 pe un fundal întunecat. Transmiteți-o către
csi.CSI.color_palettepentru ca driverul GENX320 să emită cadre RGB565 colorate în modul histogramă, sau cătreImage.draw_image()color_palette=la colorarea unei imagini de evenimente în tonuri de gri.Disponibilă doar pe versiunile cu suport GENX320 (OpenMV Cam AE3 și Pmod-ul GENX320).
- image.PALETTE_EVT_LIGHT: int¶
Paletă pentru vizualizarea cadrelor de la camera de evenimente GENX320 pe un fundal deschis. Aceeași dispecerizare și disponibilitate ca
PALETTE_EVT_DARK.
Moduri de scalare¶
Transmiteți oricare dintre următoarele ca argument hint către Image.draw_image(), Image.scale() sau metode de scalare similare.
Indicii pentru desenare / draw_image¶
Combinați oricare dintre acestea prin OR pe biți și transmiteți-le ca argument hint al Image.draw_image().
- image.CENTER: int¶
Centrează sursa pe destinație. Orice decalaje x/y explicite devin atunci decalaje față de centru în loc de față de colțul din stânga sus.
- image.EXTRACT_RGB_CHANNEL_FIRST: int¶
La extragerea unui canal RGB prin
Image.draw_image(), extrage canalul înainte de scalare. Fără acest indiciu, canalul este extras după scalare.
- image.APPLY_COLOR_PALETTE_FIRST: int¶
La aplicarea unei palete de culori prin
Image.draw_image(), aplică paleta înainte de scalare. Fără acest indiciu, paleta este aplicată după scalare.
- image.SCALE_ASPECT_KEEP: int¶
Scalează sursa pentru a încăpea în interiorul destinației păstrând raportul de aspect (adaugă benzi negre când rapoartele diferă).
- image.SCALE_ASPECT_EXPAND: int¶
Scalează sursa pentru a umple destinația păstrând raportul de aspect (decupează când rapoartele diferă).
- image.SCALE_ASPECT_IGNORE: int¶
Scalează sursa pentru a umple destinația, ignorând raportul de aspect.
- image.BLACK_BACKGROUND: int¶
Indică rutinei de amestecare alfa că destinația este cunoscută ca fiind neagră, astfel încât poate sări peste recitirea pixelului destinație. Accelerează efectele alfa pe tampoane proaspăt golite.
Subeșantionare JPEG¶
Transmiteți oricare dintre următoarele ca argument subsampling către Image.to_jpeg(), Image.compress() sau Image.save() la scrierea unui JPEG.
- image.JPEG_SUBSAMPLING_AUTO: int¶
Alege automat subeșantionarea cromatică pe baza setării de calitate JPEG.
- image.JPEG_SUBSAMPLING_444: int¶
Forțează subeșantionarea cromatică 4:4:4 (fără compresie cromatică).
Potrivire de șabloane¶
Transmiteți oricare dintre următoarele ca argument search către Image.find_template().
Detectarea muchiilor¶
Transmiteți oricare dintre următoarele ca argument algorithm către Image.find_edges().
- image.EDGE_CANNY: int¶
Detector de muchii Canny – magnitudinea gradientului + suprimarea non-maximelor + histerezis. Calitate mai bună, mai lent.
- image.EDGE_SIMPLE: int¶
Detector de muchii cu filtru trece-sus și prag. Mai rapid, dar produce muchii mai groase și mai zgomotoase decât
EDGE_CANNY.
Detectoare de colțuri ORB¶
Transmiteți oricare dintre următoarele ca argument corner_detector către Image.find_keypoints().
- image.CORNER_FAST: int¶
Detector de colțuri FAST. Mai rapid decât
CORNER_AGAST, dar mai puțin precis.
- image.CORNER_AGAST: int¶
Detector de colțuri AGAST. Mai lent decât
CORNER_FAST, dar produce puncte-cheie mai stabile.
Familii AprilTag¶
Combinați prin OR pe biți orice combinație a următoarelor și transmiteți-o ca argument families către Image.find_apriltags(). Fiecare familie este condiționată de propria opțiune de compilare din firmware; familiile neacceptate sunt absente la rulare, în loc să fie mereu zero.
- image.TAG25H9: int¶
Familia AprilTag
25h9(35 de ID-uri unice, corecție de eroare de până la 3 biți).
- image.TAG36H10: int¶
Familia AprilTag
36h10(2320 de ID-uri unice, corecție de eroare de până la 3 biți).
Simbologii de coduri de bare¶
Valorile raportate în BarCode.type pentru intrările returnate de Image.find_barcodes().
- image.PDF417: int¶
Cod de bare 2D stratificat PDF417. Constanta există pentru completitudine, dar decodorul de coduri de bare nu implementează în prezent PDF417 –
Image.find_barcodes()nu va returna detectări de acest tip.