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.