image — strojové vidění

Modul image je srdcem zásobníku strojového vidění OpenMV. Poskytuje třídu Image – pixelový buffer v paměti, nad nímž pracují všechny rutiny pro kreslení, filtrování, transformace a extrakci příznaků – spolu s podpůrnými objekty výsledků, které tyto rutiny vracejí (Blob, Line, Circle, Rect, QRCode, AprilTag, DataMatrix, BarCode, …) a pomocnými třídami používanými k jejich konfiguraci (Threshold, Histogram, Statistics, HaarCascade, Similarity, Percentile, Displacement, ImageIO).

Získání obrazu

Existují čtyři způsoby, jak dostat Image do RAM:

  • Živé snímání ze senzoru kamery. Zavolejte csi.CSI.snapshot() k zachycení dalšího snímku přímo do snímkového bufferu (frame buffer); vrácená třída Image odkazuje na tento buffer.

  • Ze souboru. Předejte cestu konstruktoru Image (image.Image("/sd/photo.jpg")); podporované formáty na disku jsou BMP, PPM/PGM, JPEG, PNG a nahrávací formát OpenMV ImageIO.

  • Z ndarray. Předejte float32 (h, w) nebo (h, w, 3) ndarray konstruktoru Image. Pixely jsou škálovány z 0.0 -- 255.0 do obrazu GRAYSCALE, respektive RGB565. Použijte to k převedení tenzorového výstupu z ml (nebo libovolného ulab pipeline) zpět do kreslitelného obrazu.

  • Prázdný buffer. Vytvořte Image s danou velikostí a pixelovým formátem (image.Image(320, 240, image.RGB565)), do kterého budete kreslit od začátku, nebo jej použijte jako pracovní plochu pro aritmetiku obrazu.

Pixelové formáty

Každý Image má jeden z následujících pixelových formátů; volba představuje kompromis mezi pamětí, náročností zpracování a tím, jaké algoritmy na něm lze spustit. Použijte BINARY, GRAYSCALE, RGB565, BAYER, YUV422, JPEG nebo PNG jako argument pixformat při vytváření obrazu nebo konfiguraci senzoru kamery:

  • BINARY (1 bpp) – jeden bit na pixel. Nejmenší formát; používán interně rutinami prahování a morfologie, ale jen zřídka zachycován přímo ze senzoru.

  • GRAYSCALE (8 bpp) – jeden bajt na pixel (kanál Y z YUV422). Nejrychlejší formát pro většinu algoritmů počítačového vidění (AprilTag, detekce hran, optický tok).

  • RGB565 (16 bpp) – dva bajty na pixel, 5bitová červená / 6bitová zelená / 5bitová modrá. Výchozí barevný formát.

  • BAYER (8 bpp) – surová barevná data v Bayerově vzoru přímo ze senzoru. Užitečné pro vlastní de-mozaikování nebo pro uložení více pixelů v menší paměti před debayerizací na vyžádání.

  • YUV422 (16 bpp) – barva s chroma podvzorkováním 4:2:2, dva bajty na pixel. Užitečné, pokud chcete algoritmy specifické pro chroma bez nákladů plného RGB.

  • JPEG / PNG – komprimované buffery. Nejvhodnější pro ukládání a síťový přenos. Operace na úrovni pixelů vyžadují nejprve Image.to_grayscale() nebo Image.to_rgb565().

Práce s výsledky

Metody detekce / extrakce příznaků třídy Image vracejí objekty, které lze procházet a kombinovat – volání Image.find_blobs() vrací seznam Blob, volání Image.find_apriltags() vrací seznam AprilTag atd. Každá třída výsledku poskytuje geometrické vlastnosti detekce (těžiště, ohraničující rámeček, plocha, hodnota kódu atd.), takže s nimi můžete pracovat přímo nebo je předat zpět metodám kreslení (Image.draw_rectangle(), Image.draw_string(), …).

Pomocníci pro barevné prostory

Modul také poskytuje malé čisté funkce pro převod jednotlivých hodnot pixelů mezi barevnými prostory binary / grayscale / RGB / LAB / YUV. Jsou užitečné, když potřebujete v Pythonu převést prahové hodnoty nebo položky palety před jejich předáním do obrazových operací – pro převod celého obrazu použijte metody to_* třídy Image, které jsou mnohem rychlejší než volání těchto pomocníků ve smyčce.

Třídy

Funkce

Pomocníci pro převod barevných prostorů

Každá z níže uvedených funkcí X_to_Y provádí jeden převod hodnoty pixelu. Všechny přijímají/vracejí hodnoty v kanonických rozsazích OpenMV:

  • binary – int 0 – 1.

  • grayscale – int 0 – 255.

  • RGB – (r, g, b) n-tice 8bitových celých čísel (každé 0 – 255).

  • LAB – (l, a, b) n-tice s L v rozsahu 0 – 100 a A/B v rozsahu -128 – 127.

  • YUV – (y, u, v) n-tice s Y v rozsahu 0 – 255 a U/V v rozsahu -128 – 127.

Pro převod celého obrazu použijte metody to_* třídy Image, které jsou mnohem rychlejší než volání těchto pomocníků ve smyčce.

image.binary_to_grayscale(value: int) int

Převede hodnotu binary na hodnotu grayscale.

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

Převede hodnotu binary na n-tici RGB.

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

Převede hodnotu binary na n-tici LAB.

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

Převede hodnotu binary na n-tici YUV.

image.grayscale_to_binary(value: int) int

Převede hodnotu grayscale na hodnotu binary.

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

Převede hodnotu grayscale na n-tici RGB.

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

Převede hodnotu grayscale na n-tici LAB.

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

Převede hodnotu grayscale na n-tici YUV.

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

Převede n-tici RGB na hodnotu binary.

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

Převede n-tici RGB na hodnotu grayscale.

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

Převede n-tici RGB na n-tici LAB.

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

Převede n-tici RGB na n-tici YUV.

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

Převede n-tici LAB na hodnotu binary.

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

Převede n-tici LAB na hodnotu grayscale.

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

Převede n-tici LAB na n-tici RGB.

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

Převede n-tici LAB na n-tici YUV.

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

Převede n-tici YUV na hodnotu binary.

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

Převede n-tici YUV na hodnotu grayscale.

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

Převede n-tici YUV na n-tici RGB.

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

Převede n-tici YUV na n-tici LAB.

Deskriptory příznaků

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

Načte Haarovu kaskádu a vrátí handle Cascade pro použití s Image.find_features().

path může být buď:

  • doslovný řetězec "frontalface" nebo "eye" k načtení jedné ze dvou kaskád zabudovaných do ROM firmwaru, nebo

  • cesta v souborovém systému k vlastnímu binárnímu souboru .cascade vytvořenému nástroji OpenMV pro převod kaskád.

stages určuje, kolik fází kaskády se má při detekci vyhodnotit. -1 použije každou fázi uloženou v souboru. Snížení této hodnoty zrychlí detekci za cenu většího počtu falešně pozitivních výsledků.

image.load_descriptor(path: str) kp_desc | lbp_desc

Načte deskriptor ze souboru na cestě path a vrátí jej. Interní typový tag souboru určuje, která třída deskriptoru se rekonstruuje:

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

Serializuje descriptor (deskriptor klíčových bodů ORB nebo LBP) do souboru na cestě path ve formátu souboru deskriptorů OpenMV. Stejný soubor lze později znovu načíst pomocí image.load_descriptor().

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

Porovná dva deskriptory stejného typu.

  • Pro dva deskriptory LBP – vrací celočíselnou Hammingovu vzdálenost mezi nimi (nižší znamená bližší shodu).

  • Pro dva deskriptory klíčových bodů ORB – vrací kptmatch popisující shluk shodných klíčových bodů, nebo None, pokud žádná shoda neprojde threshold.

threshold (0 – 100) nastavuje, jak přísné je porovnávání ORB při přijímání páru klíčových bodů. Nižší hodnoty zpřísňují porovnávání odmítáním slabých shod nejbližšího souseda.

filter_outliers povoluje odstraňování odlehlých hodnot ve stylu RANSAC napříč sadou shodných klíčových bodů. Použijte jej, když očekáváte jedinou tuhou transformaci mezi dvěma pohledy; zakažte jej, když shodné klíčové body pokrývají více objektů.

Pomocníci pro geometrii blobů

Tito pomocníci přijímají Blob (jak jej vrací Image.find_blobs()) a na vyžádání vypočítají další geometrické vlastnosti. Žijí na úrovni modulu – nikoli na Blob – takže základní cesta find_blobs() za ně neplatí, dokud o ně nepožádáte.

image.get_solidity(blob: blob) float

Vrací solidnost (blob.pixels / convex_hull_area) blobu blob. Float, 0 – 1; 1.0 znamená, že blob plně vyplňuje svou konvexní obálku.

image.get_convexity(blob: blob) float

Vrací konvexitu (convex_hull_perimeter / blob.perimeter) blobu blob. Float, 0 – 1; 1.0 je dokonale konvexní blob.

image.get_major_axis_line(blob: blob) line

Vrací Line podél hlavní osy blobu blob (delší ze dvou hlavních os rotovaného obdélníku s minimální plochou).

image.get_minor_axis_line(blob: blob) line

Vrací Line podél vedlejší osy blobu blob (kratší ze dvou hlavních os rotovaného obdélníku s minimální plochou).

image.get_enclosing_circle(blob: blob) circle

Vrací Circle, který uzavírá blob blob.

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

Vrací 5-tici (cx, cy, a, b, rotation) popisující elipsu vepsanou do rotovaného obdélníku s minimální plochou kolem blobu blob:

  • cx / cy – střed elipsy v pixelech (celé číslo).

  • a / b – délky poloos v pixelech (celé číslo).

  • rotation – rotace elipsy ve stupních (celé číslo).

Toto je obyčejná n-tice, nikoli attrtuple, takže pole jsou přístupná pouze podle indexu.

Konstanty

Pixelové formáty

Předejte kteroukoli z následujících jako argument pixformat konstruktoru Image nebo metodě csi.CSI.pixformat().

image.BINARY: int

Bitmapa s 1 bitem na pixel. Nejmenší formát – používán interně prahováním a morfologií, jen zřídka zachycován přímo ze senzoru.

image.GRAYSCALE: int

Stupně šedi s 8 bity na pixel (jeden bajt na pixel). Nejrychlejší formát pro většinu algoritmů počítačového vidění (AprilTag, detekce hran, optický tok).

image.RGB565: int

Barva s 16 bity na pixel zabalená jako 5 bitů červená / 6 bitů zelená / 5 bitů modrá. Výchozí barevný formát.

image.BAYER: int

Surová data Bayer s 8 bity na pixel přímo ze senzoru. Většina metod zpracování obrazu není na obrazech Bayer dostupná; použijte to, když chcete debayerizovat na vyžádání nebo uložit více pixelů v menší paměti.

image.YUV422: int

Barva s chroma podvzorkováním 4:2:2, dva bajty na pixel, zabalená jako Y1, U, Y2, V na pár pixelů. Pouze některé metody zpracování obrazu pracují přímo na YUV422.

image.JPEG: int

Komprimovaný buffer JPEG. Operace na úrovni pixelů vyžadují nejprve Image.to_grayscale() nebo Image.to_rgb565().

image.PNG: int

Komprimovaný buffer PNG. Operace na úrovni pixelů vyžadují nejprve Image.to_grayscale() nebo Image.to_rgb565().

Barevné palety

Předejte kteroukoli z následujících metodě Image.to_rainbow(), Image.to_ironbow(), Image.draw_image() (color_palette=) nebo metodě csi.CSI.color_palette() k obarvení obrazu ve stupních šedi.

image.PALETTE_RAINBOW: int

Hladké duhové barevné kolo. Výchozí paleta OpenMV pro termální obrazy.

image.PALETTE_IRONBOW: int

Nelineární paleta „ironbow“, která napodobuje vzhled hledáčku termální kamery FLIR Lepton.

image.PALETTE_DEPTH: int

Paleta pro hloubkové obrazy. Dostupná pouze na sestaveních s podporou hloubkového senzoru (pipeline ToF – např. OpenMV Cam AE3 nebo libovolná kamera s připojeným ToF Pmod).

image.PALETTE_EVT_DARK: int

Paleta pro vizualizaci snímků z event kamery GENX320 na tmavém pozadí. Předejte ji metodě csi.CSI.color_palette, aby ovladač GENX320 vydával obarvené snímky RGB565 v režimu histogramu, nebo metodě Image.draw_image() color_palette= při obarvování obrazu událostí ve stupních šedi.

Dostupná pouze na sestaveních s podporou GENX320 (OpenMV Cam AE3 a GENX320 Pmod).

image.PALETTE_EVT_LIGHT: int

Paleta pro vizualizaci snímků z event kamery GENX320 na světlém pozadí. Stejné odeslání a dostupnost jako PALETTE_EVT_DARK.

Režimy škálování

Předejte kteroukoli z následujících jako argument hint metodě Image.draw_image(), Image.scale() nebo podobným metodám škálování.

image.AREA: int

Škálovač s průměrováním ploch. Používá se při zmenšování; pro zvětšování se používá Nearest-Neighbor.

image.BILINEAR: int

Bilineární škálovač. Při zmenšování provádí podvzorkování.

image.BICUBIC: int

Bikubický škálovač. Vyšší kvalita než BILINEAR, ale pomalejší. Při zmenšování provádí podvzorkování.

Nápovědy pro kreslení / draw_image

Spojte kteroukoli z těchto pomocí bitového OR a předejte jako argument hint metody Image.draw_image().

image.VFLIP: int

Při kreslení zdroj svisle převrátit.

image.HMIRROR: int

Při kreslení zdroj vodorovně zrcadlit.

image.TRANSPOSE: int

Při kreslení zdroj transponovat (zaměnit x/y).

image.CENTER: int

Vystředit zdroj na cíli. Případné explicitní posuny x/y se pak stanou posuny od středu místo od levého horního rohu.

image.EXTRACT_RGB_CHANNEL_FIRST: int

Při extrakci RGB kanálu pomocí Image.draw_image() extrahovat kanál před škálováním. Bez této nápovědy se kanál extrahuje po škálování.

image.APPLY_COLOR_PALETTE_FIRST: int

Při aplikaci barevné palety pomocí Image.draw_image() aplikovat paletu před škálováním. Bez této nápovědy se paleta aplikuje po škálování.

image.SCALE_ASPECT_KEEP: int

Škálovat zdroj tak, aby se vešel dovnitř cíle při zachování poměru stran (přidá černé pruhy, pokud se poměry liší).

image.SCALE_ASPECT_EXPAND: int

Škálovat zdroj tak, aby vyplnil cíl při zachování poměru stran (ořízne, pokud se poměry liší).

image.SCALE_ASPECT_IGNORE: int

Škálovat zdroj tak, aby vyplnil cíl, ignoruje poměr stran.

image.BLACK_BACKGROUND: int

Sdělit cestě alfa míchání, že cíl je známo, že je černý, takže může přeskočit zpětné čtení cílového pixelu. Zrychluje alfa efekty na čerstvě vymazaných bufferech.

image.ROTATE_90: int

Zkratka pro VFLIP | TRANSPOSE (otočení o 90 stupňů ve směru hodinových ručiček).

image.ROTATE_180: int

Zkratka pro HMIRROR | VFLIP (otočení o 180 stupňů).

image.ROTATE_270: int

Zkratka pro HMIRROR | TRANSPOSE (otočení o 270 stupňů ve směru hodinových ručiček).

Podvzorkování JPEG

Předejte kteroukoli z následujících jako argument subsampling metodě Image.to_jpeg(), Image.compress() nebo Image.save() při zápisu JPEG.

image.JPEG_SUBSAMPLING_AUTO: int

Vybrat chroma podvzorkování automaticky na základě nastavení kvality JPEG.

image.JPEG_SUBSAMPLING_444: int

Vynutit chroma podvzorkování 4:4:4 (žádná komprese chroma).

image.JPEG_SUBSAMPLING_422: int

Vynutit chroma podvzorkování 4:2:2. Doporučeno při streamování MJPEG do videopřehrávačů třetích stran, které mají problémy se 4:2:0.

image.JPEG_SUBSAMPLING_420: int

Vynutit chroma podvzorkování 4:2:0.

Porovnávání šablon

Předejte kteroukoli z následujících jako argument search metodě Image.find_template().

image.SEARCH_EX: int

Vyčerpávající hledání – vyhodnotí každou pozici v ROI. Nejpomalejší, ale zaručeně najde nejlepší shodu.

image.SEARCH_DS: int

Diamantové hledání – hledání od hrubého k jemnému, které je mnohem rychlejší než SEARCH_EX, ale může minout globální optimum u vysoce sebepodobných šablon.

Detekce hran

Předejte kteroukoli z následujících jako argument algorithm metodě Image.find_edges().

image.EDGE_CANNY: int

Cannyho detektor hran – velikost gradientu + potlačení nemaximálních hodnot + hystereze. Vyšší kvalita, pomalejší.

image.EDGE_SIMPLE: int

Prahovaný detektor hran s horní propustí. Rychlejší, ale produkuje silnější a šumovější hrany než EDGE_CANNY.

Detektory rohů ORB

Předejte kteroukoli z následujících jako argument corner_detector metodě Image.find_keypoints().

image.CORNER_FAST: int

Detektor rohů FAST. Rychlejší než CORNER_AGAST, ale méně přesný.

image.CORNER_AGAST: int

Detektor rohů AGAST. Pomalejší než CORNER_FAST, ale produkuje stabilnější klíčové body.

Rodiny AprilTag

Spojte libovolnou kombinaci následujících pomocí bitového OR a předejte jako argument families metodě Image.find_apriltags(). Každá rodina je podmíněna vlastní volbou sestavení ve firmwaru; nepodporované rodiny za běhu chybí, namísto aby byly vždy nulové.

image.TAG16H5: int

Rodina AprilTag 16h5 (30 jedinečných ID, 0bitová korekce chyb).

image.TAG25H9: int

Rodina AprilTag 25h9 (35 jedinečných ID, až 3bitová korekce chyb).

image.TAG36H10: int

Rodina AprilTag 36h10 (2320 jedinečných ID, až 3bitová korekce chyb).

image.TAG36H11: int

Rodina AprilTag 36h11 (587 jedinečných ID, až 4bitová korekce chyb). Nejběžnější rodina.

image.TAGCIRCLE21H7: int

Rodina AprilTag Circle21h7.

image.TAGCIRCLE49H12: int

Rodina AprilTag Circle49h12.

image.TAGCUSTOM48H12: int

Rodina AprilTag Custom48h12.

image.TAGSTANDARD41H12: int

Rodina AprilTag Standard41h12.

image.TAGSTANDARD52H13: int

Rodina AprilTag Standard52h13.

Symbologie čárových kódů

Hodnoty hlášené v BarCode.type pro položky vrácené metodou Image.find_barcodes().

image.EAN2: int

Doplňkový čárový kód EAN-2.

image.EAN5: int

Doplňkový čárový kód EAN-5.

image.EAN8: int

Čárový kód EAN-8.

image.UPCE: int

Čárový kód UPC-E.

image.ISBN10: int

Čárový kód ISBN-10.

image.UPCA: int

Čárový kód UPC-A.

image.EAN13: int

Čárový kód EAN-13.

image.ISBN13: int

Čárový kód ISBN-13.

image.I25: int

Čárový kód Interleaved 2-of-5.

image.DATABAR: int

Čárový kód GS1 DataBar.

image.DATABAR_EXP: int

Čárový kód GS1 DataBar Expanded.

image.CODABAR: int

Čárový kód Codabar.

image.CODE39: int

Čárový kód Code 39.

image.PDF417: int

2D vrstvený čárový kód PDF417. Konstanta existuje pro úplnost, ale dekodér čárových kódů v současnosti PDF417 neimplementuje – Image.find_barcodes() nevrátí detekce tohoto typu.

image.CODE93: int

Čárový kód Code 93.

image.CODE128: int

Čárový kód Code 128.