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); Image returnată 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 OpenMV ImageIO.

  • Dintr-un ndarray. Transmiteți un ndarray float32 (h, w) sau (h, w, 3) către constructorul Image. Pixelii sunt scalați din 0.0 -- 255.0 într-o imagine GRAYSCALE, respectiv RGB565. Folosiți acest mod pentru a readuce ieșirea tensorială din ml (sau orice flux ulab) într-o imagine pe care se poate desena.

  • Tampon gol. Construiți o Image cu 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() sau Image.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

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 – int 0 – 1.

  • grayscale – int 0 – 255.

  • RGB – tuplu (r, g, b) de întregi pe 8 biți (fiecare 0 – 255).

  • LAB – tuplu (l, a, b) cu L în 0 – 100 și A/B în -128 – 127.

  • YUV – tuplu (y, u, v) cu Y în 0 – 255 și U/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.

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

Convertește un tuplu YUV într-un tuplu RGB.

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

Convertește un tuplu YUV într-un tuplu LAB.

Descriptori de caracteristici

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

Încarcă un Haar Cascade și returnează un descriptor Cascade pentru utilizare cu Image.find_features().

path poate fi fie:

  • șirul literal "frontalface" sau "eye" pentru a încărca unul dintre cele două cascade integrate în ROM-ul firmware-ului, fie

  • o cale din sistemul de fișiere către un fișier binar .cascade personalizat produs de instrumentele de conversie a cascadelor OpenMV.

stages selectează câte etape de cascadă se evaluează la momentul detectării. -1 foloseș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ă:

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 la path în formatul de fișier de descriptori OpenMV. Același fișier poate fi reîncărcat ulterior prin image.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 kptmatch care descrie clusterul de puncte-cheie potrivite, sau None dacă nicio potrivire nu trece de threshold.

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_outliers activează 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 lui blob. 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 lui blob. Float, 0 – 1; 1.0 este un blob perfect convex.

image.get_major_axis_line(blob: blob) line

Returnează o Line de-a lungul axei mari a lui blob (cea mai lungă dintre cele două axe principale ale dreptunghiului rotit de arie minimă).

image.get_minor_axis_line(blob: blob) line

Returnează o Line de-a lungul axei mici a lui blob (cea mai scurtă dintre cele două axe principale ale dreptunghiului rotit de arie minimă).

image.get_enclosing_circle(blob: blob) circle

Returnează un Circle care încadrează blob.

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 lui blob:

  • 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, V pe 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() sau Image.to_rgb565().

image.PNG: int

Tampon PNG comprimat. Operațiile la nivel de pixel necesită mai întâi Image.to_grayscale() sau Image.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_palette pentru ca driverul GENX320 să emită cadre RGB565 colorate în modul histogramă, sau către Image.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.

image.AREA: int

Scaler cu mediere pe arii. Folosit la micșorare; pentru mărire se folosește Nearest-Neighbor.

image.BILINEAR: int

Scaler biliniar. Subeșantionează la micșorare.

image.BICUBIC: int

Scaler bicubic. Calitate mai bună decât BILINEAR, dar mai lent. Subeșantionează la micșorare.

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.VFLIP: int

Răstoarnă vertical sursa în timpul desenării.

image.HMIRROR: int

Oglindește orizontal sursa în timpul desenării.

image.TRANSPOSE: int

Transpune (schimbă x/y) sursa în timpul desenării.

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.

image.ROTATE_90: int

Scurtătură pentru VFLIP | TRANSPOSE (rotire cu 90 de grade în sensul acelor de ceasornic).

image.ROTATE_180: int

Scurtătură pentru HMIRROR | VFLIP (rotire cu 180 de grade).

image.ROTATE_270: int

Scurtătură pentru HMIRROR | TRANSPOSE (rotire cu 270 de grade în sensul acelor de ceasornic).

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ă).

image.JPEG_SUBSAMPLING_422: int

Forțează subeșantionarea cromatică 4:2:2. Recomandată la transmiterea MJPEG către playere video terțe care se comportă defectuos cu 4:2:0.

image.JPEG_SUBSAMPLING_420: int

Forțează subeșantionarea cromatică 4:2:0.

Potrivire de șabloane

Transmiteți oricare dintre următoarele ca argument search către Image.find_template().

image.SEARCH_EX: int

Căutare exhaustivă – evaluează fiecare poziție din ROI. Cea mai lentă, dar garantat găsește cea mai bună potrivire.

image.SEARCH_DS: int

Căutare în diamant – căutare de la grosier la fin care este mult mai rapidă decât SEARCH_EX, dar poate rata optimul global pe șabloane foarte auto-similare.

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.TAG16H5: int

Familia AprilTag 16h5 (30 de ID-uri unice, corecție de eroare pe 0 biți).

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).

image.TAG36H11: int

Familia AprilTag 36h11 (587 de ID-uri unice, corecție de eroare de până la 4 biți). Cea mai des întâlnită familie.

image.TAGCIRCLE21H7: int

Familia AprilTag Circle21h7.

image.TAGCIRCLE49H12: int

Familia AprilTag Circle49h12.

image.TAGCUSTOM48H12: int

Familia AprilTag Custom48h12.

image.TAGSTANDARD41H12: int

Familia AprilTag Standard41h12.

image.TAGSTANDARD52H13: int

Familia AprilTag Standard52h13.

Simbologii de coduri de bare

Valorile raportate în BarCode.type pentru intrările returnate de Image.find_barcodes().

image.EAN2: int

Cod de bare suplimentar EAN-2.

image.EAN5: int

Cod de bare suplimentar EAN-5.

image.EAN8: int

Cod de bare EAN-8.

image.UPCE: int

Cod de bare UPC-E.

image.ISBN10: int

Cod de bare ISBN-10.

image.UPCA: int

Cod de bare UPC-A.

image.EAN13: int

Cod de bare EAN-13.

image.ISBN13: int

Cod de bare ISBN-13.

image.I25: int

Cod de bare Interleaved 2-of-5.

image.DATABAR: int

Cod de bare GS1 DataBar.

image.DATABAR_EXP: int

Cod de bare GS1 DataBar Expanded.

image.CODABAR: int

Cod de bare Codabar.

image.CODE39: int

Cod de bare Code 39.

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.

image.CODE93: int

Cod de bare Code 93.

image.CODE128: int

Cod de bare Code 128.