image — strojni vid

Modul image srce je OpenMV-ovog sustava za strojni vid. Izlaže klasu Image – međuspremnik piksela u memoriji nad kojim radi svaka rutina za crtanje, filtriranje, transformaciju i izvlačenje značajki – zajedno s pratećim objektima rezultata koje te rutine vraćaju (Blob, Line, Circle, Rect, QRCode, AprilTag, DataMatrix, BarCode, …) te pomoćnim klasama koje se koriste za njihovo konfiguriranje (Threshold, Histogram, Statistics, HaarCascade, Similarity, Percentile, Displacement, ImageIO).

Dohvaćanje slike

Postoje četiri načina da se Image dovede u RAM:

  • Snimanje uživo sa senzora kamere. Pozovite csi.CSI.snapshot() da uhvatite sljedeću sličicu izravno u međuspremnik slike; vraćeni Image referencira taj međuspremnik.

  • Iz datoteke. Proslijedite putanju konstruktoru Image (image.Image("/sd/photo.jpg")); podržani formati na disku su BMP, PPM/PGM, JPEG, PNG i OpenMV-ov format zapisa ImageIO.

  • Iz ndarray-a. Proslijedite float32 (h, w) ili (h, w, 3) ndarray konstruktoru Image. Pikseli se skaliraju iz raspona 0.0 -- 255.0 u sliku formata GRAYSCALE odnosno RGB565. Koristite ovo da izlaz tenzora iz ml (ili bilo kojeg ulab cjevovoda) vratite u sliku po kojoj se može crtati.

  • Prazan međuspremnik. Konstruirajte Image zadane veličine i formata piksela (image.Image(320, 240, image.RGB565)) za crtanje od nule ili kao radnu površinu za aritmetiku nad slikom.

Formati piksela

Svaka Image ima jedan od sljedećih formata piksela; izbor predstavlja kompromis između memorije, troška obrade i toga koji algoritmi mogu raditi nad njom. Koristite BINARY, GRAYSCALE, RGB565, BAYER, YUV422, JPEG ili PNG kao argument pixformat pri konstruiranju slike ili konfiguriranju senzora kamere:

  • BINARY (1 bpp) – jedan bit po pikselu. Najmanji format; koristi se interno u rutinama za pragiranje i morfologiju, ali se rijetko snima izravno sa senzora.

  • GRAYSCALE (8 bpp) – jedan bajt po pikselu (Y kanal formata YUV422). Najbrži format za većinu algoritama strojnog vida (AprilTag, detekcija rubova, optički tok).

  • RGB565 (16 bpp) – dva bajta po pikselu, 5-bitno crveno / 6-bitno zeleno / 5-bitno plavo. Zadani format boje.

  • BAYER (8 bpp) – sirovi podaci boje u Bayer uzorku izravno sa senzora. Korisno za prilagođeno de-mozaikiranje ili za pohranu više piksela u manje memorije prije debayeriranja po potrebi.

  • YUV422 (16 bpp) – 4:2:2 kromatski poduzorkovana boja, dva bajta po pikselu. Korisno kada želite algoritme specifične za krominanciju bez plaćanja punog troška RGB-a.

  • JPEG / PNG – komprimirani međuspremnici. Najbolji za pohranu i mrežni prijenos. Operacije na razini piksela najprije zahtijevaju Image.to_grayscale() ili Image.to_rgb565().

Rad s rezultatima

Metode za detekciju / izvlačenje značajki na Image vraćaju objekte po kojima možete iterirati i kombinirati ih – poziv Image.find_blobs() vraća popis Blob, poziv Image.find_apriltags() vraća popis AprilTag i tako dalje. Svaka klasa rezultata izlaže geometrijska svojstva detekcije (centroid, granični okvir, površina, vrijednost koda itd.) tako da možete izravno djelovati na njih ili ih proslijediti natrag metodama za crtanje (Image.draw_rectangle(), Image.draw_string(), …).

Pomoćnici za prostore boja

Modul također izlaže male čiste funkcije za pretvaranje pojedinačnih vrijednosti piksela između binarnog / sivotonskog / RGB / LAB / YUV prostora boja. Korisne su kada trebate u Pythonu pretvoriti vrijednosti praga ili stavke palete prije nego što ih proslijedite operacijama nad slikom – za pretvorbu cijele slike koristite to_* metode klase Image, koje su mnogo brže od pozivanja ovih pomoćnika u petlji.

Klase

Funkcije

Pomoćnici za pretvorbu prostora boja

Svaka od X_to_Y funkcija u nastavku obavlja pojedinačnu pretvorbu vrijednosti piksela. Sve uzimaju/vraćaju vrijednosti u kanonskim OpenMV rasponima:

  • binarno – int 0 – 1.

  • sivi tonovi – int 0 – 255.

  • RGB – (r, g, b) tuple 8-bitnih cijelih brojeva (svaki 0 – 255).

  • LAB – (l, a, b) tuple s L u rasponu 0 – 100 i A/B u rasponu -128 – 127.

  • YUV – (y, u, v) tuple s Y u rasponu 0 – 255 i U/V u rasponu -128 – 127.

Za pretvorbu cijele slike koristite to_* metode klase Image, koje su mnogo brže od pozivanja ovih pomoćnika u petlji.

image.binary_to_grayscale(value: int) int

Pretvara binarnu vrijednost u sivotonsku vrijednost.

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

Pretvara binarnu vrijednost u RGB tuple.

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

Pretvara binarnu vrijednost u LAB tuple.

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

Pretvara binarnu vrijednost u YUV tuple.

image.grayscale_to_binary(value: int) int

Pretvara sivotonsku vrijednost u binarnu vrijednost.

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

Pretvara sivotonsku vrijednost u RGB tuple.

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

Pretvara sivotonsku vrijednost u LAB tuple.

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

Pretvara sivotonsku vrijednost u YUV tuple.

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

Pretvara RGB tuple u binarnu vrijednost.

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

Pretvara RGB tuple u sivotonsku vrijednost.

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

Pretvara RGB tuple u LAB tuple.

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

Pretvara RGB tuple u YUV tuple.

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

Pretvara LAB tuple u binarnu vrijednost.

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

Pretvara LAB tuple u sivotonsku vrijednost.

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

Pretvara LAB tuple u RGB tuple.

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

Pretvara LAB tuple u YUV tuple.

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

Pretvara YUV tuple u binarnu vrijednost.

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

Pretvara YUV tuple u sivotonsku vrijednost.

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

Pretvara YUV tuple u RGB tuple.

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

Pretvara YUV tuple u LAB tuple.

Deskriptori značajki

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

Učitava Haar Cascade i vraća rukovatelj Cascade za uporabu s Image.find_features().

path može biti:

  • doslovni niz "frontalface" ili "eye" za učitavanje jedne od dviju kaskada ugrađenih u ROM ugrađenog programa (firmware), ili

  • putanja u datotečnom sustavu do prilagođene binarne .cascade datoteke koju proizvode OpenMV-ovi alati za pretvorbu kaskada.

stages odabire koliko stupnjeva kaskade treba vrednovati pri detekciji. -1 koristi svaki stupanj pohranjen u datoteci. Smanjenje ove vrijednosti ubrzava detekciju po cijenu više lažnih pozitiva.

image.load_descriptor(path: str) kp_desc | lbp_desc

Učitava deskriptor iz datoteke na putanji path i vraća ga. Interna oznaka tipa u datoteci odabire koja se klasa deskriptora rekonstruira:

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

Serijalizira descriptor (ORB deskriptor ključnih točaka ili LBP deskriptor) u datoteku na putanji path u OpenMV formatu datoteke deskriptora. Ista se datoteka kasnije može ponovno učitati pomoću image.load_descriptor().

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

Uspoređuje dva deskriptora istog tipa.

  • Za dva LBP deskriptora – vraća cjelobrojnu Hammingovu udaljenost između njih (manje znači bliže podudaranje).

  • Za dva ORB deskriptora ključnih točaka – vraća kptmatch koji opisuje klaster podudarenih ključnih točaka, ili None ako nijedno podudaranje ne prolazi threshold.

threshold (0 – 100) postavlja koliko je strogo ORB podudaranje pri prihvaćanju para ključnih točaka. Niže vrijednosti pooštravaju podudaranje odbacujući slaba podudaranja najbližeg susjeda.

filter_outliers omogućuje odbacivanje stršećih vrijednosti u stilu RANSAC-a kroz skup podudarenih ključnih točaka. Koristite ga kada očekujete jednu krutu transformaciju između dvaju pogleda; isključite ga kada podudarene ključne točke obuhvaćaju više objekata.

Pomoćnici za geometriju mrlje

Ovi pomoćnici uzimaju Blob (kako ga vraća Image.find_blobs()) i po potrebi izračunavaju dodatna geometrijska svojstva. Smješteni su na razini modula – a ne na Blob – tako da osnovni find_blobs() put ne plaća njihovu cijenu osim ako to ne zatražite.

image.get_solidity(blob: blob) float

Vraća čvrstoću (blob.pixels / convex_hull_area) za blob. Float, 0 – 1; 1.0 znači da mrlja u potpunosti ispunjava svoju konveksnu ljusku.

image.get_convexity(blob: blob) float

Vraća konveksnost (convex_hull_perimeter / blob.perimeter) za blob. Float, 0 – 1; 1.0 je savršeno konveksna mrlja.

image.get_major_axis_line(blob: blob) line

Vraća Line duž glavne osi za blob (dulje od dviju glavnih osi rotiranog pravokutnika minimalne površine).

image.get_minor_axis_line(blob: blob) line

Vraća Line duž sporedne osi za blob (kraće od dviju glavnih osi rotiranog pravokutnika minimalne površine).

image.get_enclosing_circle(blob: blob) circle

Vraća Circle koja obuhvaća blob.

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

Vraća 5-člani tuple (cx, cy, a, b, rotation) koji opisuje elipsu upisanu u rotirani pravokutnik minimalne površine oko blob:

  • cx / cy – središte elipse u pikselima (cijeli broj).

  • a / b – duljine poluosi u pikselima (cijeli broj).

  • rotation – rotacija elipse u stupnjevima (cijeli broj).

Ovo je običan tuple, a ne attrtuple, pa su polja dostupna samo putem indeksa.

Konstante

Formati piksela

Proslijedite bilo koju od sljedećih vrijednosti kao argument pixformat konstruktoru Image ili metodi csi.CSI.pixformat().

image.BINARY: int

Bitmapa s 1 bitom po pikselu. Najmanji format – koristi se interno za pragiranje i morfologiju, rijetko se snima izravno sa senzora.

image.GRAYSCALE: int

Sivi tonovi s 8 bita po pikselu (jedan bajt po pikselu). Najbrži format za većinu algoritama strojnog vida (AprilTag, detekcija rubova, optički tok).

image.RGB565: int

Boja s 16 bita po pikselu pakirana kao 5 bita crvene / 6 bita zelene / 5 bita plave. Zadani format boje.

image.BAYER: int

Sirovi Bayer podaci s 8 bita po pikselu izravno sa senzora. Većina metoda obrade slike nije dostupna na Bayer slikama; koristite ovo kada želite debayerirati po potrebi ili pohraniti više piksela u manje memorije.

image.YUV422: int

4:2:2 kromatski poduzorkovana boja, dva bajta po pikselu, pakirana kao Y1, U, Y2, V po paru piksela. Samo neke metode obrade slike rade izravno na YUV422.

image.JPEG: int

Komprimirani JPEG međuspremnik. Operacije na razini piksela najprije zahtijevaju Image.to_grayscale() ili Image.to_rgb565().

image.PNG: int

Komprimirani PNG međuspremnik. Operacije na razini piksela najprije zahtijevaju Image.to_grayscale() ili Image.to_rgb565().

Palete boja

Proslijedite bilo koju od sljedećih vrijednosti metodama Image.to_rainbow(), Image.to_ironbow(), Image.draw_image() (color_palette=) ili csi.CSI.color_palette() za obojenje sivotonske slike.

image.PALETTE_RAINBOW: int

Glatki kotač duginih boja. Zadana OpenMV paleta za termalne snimke.

image.PALETTE_IRONBOW: int

Nelinearna „ironbow” paleta koja oponaša izgled tražila termalne kamere FLIR Lepton.

image.PALETTE_DEPTH: int

Paleta za dubinske slike. Dostupna samo na verzijama s podrškom za senzor dubine (ToF cjevovod – npr. OpenMV Cam AE3 ili bilo koja kamera s priključenim ToF Pmod).

image.PALETTE_EVT_DARK: int

Paleta za vizualizaciju sličica GENX320 event-kamere na tamnoj pozadini. Proslijedite je csi.CSI.color_palette kako bi GENX320 upravljački program emitirao obojene RGB565 sličice u histogramskom načinu rada, ili metodi Image.draw_image() putem color_palette= pri obojenju sivotonske event-slike.

Dostupno samo na verzijama s podrškom za GENX320 (OpenMV Cam AE3 i GENX320 Pmod).

image.PALETTE_EVT_LIGHT: int

Paleta za vizualizaciju sličica GENX320 event-kamere na svijetloj pozadini. Isto otpremanje i dostupnost kao PALETTE_EVT_DARK.

Načini skaliranja

Proslijedite bilo koju od sljedećih vrijednosti kao argument hint metodama Image.draw_image(), Image.scale() ili sličnim metodama skaliranja.

image.AREA: int

Skaler s usrednjavanjem područja. Koristi se pri smanjivanju; za povećavanje se koristi Nearest-Neighbor.

image.BILINEAR: int

Bilinearni skaler. Poduzorkuje pri smanjivanju.

image.BICUBIC: int

Bikubni skaler. Veće kvalitete od BILINEAR, ali sporiji. Poduzorkuje pri smanjivanju.

Naputci za crtanje / draw_image

Bitovno-ILI (Bit-OR) bilo koje od ovih i proslijedite kao argument hint metode Image.draw_image().

image.VFLIP: int

Okomito zrcali izvor tijekom crtanja.

image.HMIRROR: int

Vodoravno zrcali izvor tijekom crtanja.

image.TRANSPOSE: int

Transponira (zamjenjuje x/y) izvor tijekom crtanja.

image.CENTER: int

Centrira izvor na odredištu. Sva eksplicitna x/y odstupanja tada postaju odstupanja od središta umjesto od gornjeg lijevog kuta.

image.EXTRACT_RGB_CHANNEL_FIRST: int

Pri izvlačenju RGB kanala putem Image.draw_image(), izvlači kanal prije skaliranja. Bez ovog naputka kanal se izvlači nakon skaliranja.

image.APPLY_COLOR_PALETTE_FIRST: int

Pri primjeni palete boja putem Image.draw_image(), primjenjuje paletu prije skaliranja. Bez ovog naputka paleta se primjenjuje nakon skaliranja.

image.SCALE_ASPECT_KEEP: int

Skalira izvor da stane unutar odredišta uz zadržavanje omjera slike (dodaje crne rubove kada se omjeri razlikuju).

image.SCALE_ASPECT_EXPAND: int

Skalira izvor da ispuni odredište uz zadržavanje omjera slike (obrezuje kada se omjeri razlikuju).

image.SCALE_ASPECT_IGNORE: int

Skalira izvor da ispuni odredište, zanemarujući omjer slike.

image.BLACK_BACKGROUND: int

Govori putu alfa-stapanja da je odredište poznato kao crno pa može preskočiti učitavanje odredišnog piksela. Ubrzava alfa-efekte na svježe očišćenim međuspremnicima.

image.ROTATE_90: int

Prečac za VFLIP | TRANSPOSE (rotacija za 90 stupnjeva u smjeru kazaljke na satu).

image.ROTATE_180: int

Prečac za HMIRROR | VFLIP (rotacija za 180 stupnjeva).

image.ROTATE_270: int

Prečac za HMIRROR | TRANSPOSE (rotacija za 270 stupnjeva u smjeru kazaljke na satu).

JPEG poduzorkovanje

Proslijedite bilo koju od sljedećih vrijednosti kao argument subsampling metodama Image.to_jpeg(), Image.compress() ili Image.save() pri zapisivanju JPEG-a.

image.JPEG_SUBSAMPLING_AUTO: int

Automatski odabire kromatsko poduzorkovanje na temelju postavke kvalitete JPEG-a.

image.JPEG_SUBSAMPLING_444: int

Prisiljava 4:4:4 kromatsko poduzorkovanje (bez kompresije krominancije).

image.JPEG_SUBSAMPLING_422: int

Prisiljava 4:2:2 kromatsko poduzorkovanje. Preporučuje se pri strujanju MJPEG-a prema video reproduktorima trećih strana koji se loše ponašaju s 4:2:0.

image.JPEG_SUBSAMPLING_420: int

Prisiljava 4:2:0 kromatsko poduzorkovanje.

Podudaranje predložaka

Proslijedite bilo koju od sljedećih vrijednosti kao argument search metode Image.find_template().

image.SEARCH_EX: int

Iscrpno pretraživanje – vrednuje svaku poziciju u ROI-ju. Najsporije, ali zajamčeno pronalazi najbolje podudaranje.

image.SEARCH_DS: int

Dijamantno pretraživanje – pretraživanje od grubog prema finom koje je mnogo brže od SEARCH_EX, ali može propustiti globalni optimum na vrlo samosličnim predlošcima.

Detekcija rubova

Proslijedite bilo koju od sljedećih vrijednosti kao argument algorithm metode Image.find_edges().

image.EDGE_CANNY: int

Canny detektor rubova – magnituda gradijenta + potiskivanje ne-maksimuma + histereza. Veće kvalitete, sporiji.

image.EDGE_SIMPLE: int

Detektor rubova s pragiranim visokopropusnim filtrom. Brži, ali proizvodi deblje i šumovitije rubove od EDGE_CANNY.

ORB detektori kutova

Proslijedite bilo koju od sljedećih vrijednosti kao argument corner_detector metode Image.find_keypoints().

image.CORNER_FAST: int

FAST detektor kutova. Brži od CORNER_AGAST, ali manje precizan.

image.CORNER_AGAST: int

AGAST detektor kutova. Sporiji od CORNER_FAST, ali proizvodi stabilnije ključne točke.

AprilTag obitelji

Bitovno-ILI (Bit-OR) bilo koju kombinaciju sljedećih i proslijedite kao argument families metode Image.find_apriltags(). Svaka obitelj uvjetovana je vlastitom opcijom izgradnje u ugrađenom programu (firmware); nepodržane obitelji odsutne su tijekom izvođenja, umjesto da su uvijek nula.

image.TAG16H5: int

AprilTag obitelj 16h5 (30 jedinstvenih ID-ova, 0-bitni ispravak pogrešaka).

image.TAG25H9: int

AprilTag obitelj 25h9 (35 jedinstvenih ID-ova, do 3-bitni ispravak pogrešaka).

image.TAG36H10: int

AprilTag obitelj 36h10 (2320 jedinstvenih ID-ova, do 3-bitni ispravak pogrešaka).

image.TAG36H11: int

AprilTag obitelj 36h11 (587 jedinstvenih ID-ova, do 4-bitni ispravak pogrešaka). Najčešća obitelj.

image.TAGCIRCLE21H7: int

AprilTag obitelj Circle21h7.

image.TAGCIRCLE49H12: int

AprilTag obitelj Circle49h12.

image.TAGCUSTOM48H12: int

AprilTag obitelj Custom48h12.

image.TAGSTANDARD41H12: int

AprilTag obitelj Standard41h12.

image.TAGSTANDARD52H13: int

AprilTag obitelj Standard52h13.

Simbologije crtičnog koda

Vrijednosti prijavljene u BarCode.type za stavke koje vraća Image.find_barcodes().

image.EAN2: int

EAN-2 dopunski crtični kod.

image.EAN5: int

EAN-5 dopunski crtični kod.

image.EAN8: int

EAN-8 crtični kod.

image.UPCE: int

UPC-E crtični kod.

image.ISBN10: int

ISBN-10 crtični kod.

image.UPCA: int

UPC-A crtični kod.

image.EAN13: int

EAN-13 crtični kod.

image.ISBN13: int

ISBN-13 crtični kod.

image.I25: int

Interleaved 2-of-5 crtični kod.

image.DATABAR: int

GS1 DataBar crtični kod.

image.DATABAR_EXP: int

GS1 DataBar Expanded crtični kod.

image.CODABAR: int

Codabar crtični kod.

image.CODE39: int

Code 39 crtični kod.

image.PDF417: int

PDF417 2D složeni crtični kod. Konstanta postoji radi potpunosti, ali dekoder crtičnog koda trenutno ne implementira PDF417 – Image.find_barcodes() neće vraćati detekcije ovog tipa.

image.CODE93: int

Code 93 crtični kod.

image.CODE128: int

Code 128 crtični kod.