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řídaImageodkazuje 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 OpenMVImageIO.Z ndarray. Předejte float32
(h, w)nebo(h, w, 3)ndarraykonstruktoruImage. Pixely jsou škálovány z0.0 -- 255.0do obrazu GRAYSCALE, respektive RGB565. Použijte to k převedení tenzorového výstupu zml(nebo libovolnéhoulabpipeline) zpět do kreslitelného obrazu.Prázdný buffer. Vytvořte
Images 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()neboImage.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¶
- třída Image – objekt obrazu
- třída ImageIO – objekt ImageIO
- class HaarCascade – deskriptor příznaků
- třída Similarity – objekt Similarity
- class Histogram – objekt Histogram
- třída Percentile – objekt Percentile
- třída Threshold – objekt Threshold
- třída Statistics – objekt Statistics
- class Blob – objekt Blob
- třída Line – objekt Line
- class Circle – objekt Circle
- třída Rect – objekt Rectangle
- třída QRCode – objekt QRCode
- class AprilTag – objekt AprilTag
- class DataMatrix – objekt DataMatrix
- class BarCode – objekt BarCode
- class Displacement – objekt Displacement
- třída kptmatch – objekt shody klíčových bodů
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 –
int0 – 1.grayscale –
int0 – 255.RGB –
(r, g, b)n-tice 8bitových celých čísel (každé 0 – 255).LAB –
(l, a, b)n-tice sLv rozsahu 0 – 100 aA/Bv rozsahu -128 – 127.YUV –
(y, u, v)n-tice sYv rozsahu 0 – 255 aU/Vv 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.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_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.
Deskriptory příznaků¶
- image.HaarCascade(path: str, stages: int = -1) Cascade¶
Načte Haarovu kaskádu a vrátí handle
Cascadepro použití sImage.find_features().pathmůže být buď:doslovný řetězec
"frontalface"nebo"eye"k načtení jedné ze dvou kaskád zabudovaných do ROM firmwaru, nebocesta v souborovém systému k vlastnímu binárnímu souboru
.cascadevytvořenému nástroji OpenMV pro převod kaskád.
stagesurčuje, kolik fází kaskády se má při detekci vyhodnotit.-1použ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ě
patha vrátí jej. Interní typový tag souboru určuje, která třída deskriptoru se rekonstruuje:Deskriptor klíčových bodů ORB – uložený pomocí
Image.find_keypoints()následovanéhoimage.save_descriptor().Deskriptor LBP – uložený pomocí
Image.find_lbp()následovanéhoimage.save_descriptor().
- 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ěpathve 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í
kptmatchpopisující shluk shodných klíčových bodů, neboNone, pokud žádná shoda neprojdethreshold.
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_outlierspovoluje 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) blobublob. 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) blobublob. Float, 0 – 1; 1.0 je dokonale konvexní blob.
- image.get_major_axis_line(blob: blob) line¶
Vrací
Linepodél hlavní osy blobublob(delší ze dvou hlavních os rotovaného obdélníku s minimální plochou).
- image.get_minor_axis_line(blob: blob) line¶
Vrací
Linepodél vedlejší osy blobublob(kratší ze dvou hlavních os rotovaného obdélníku s minimální plochou).
- 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 blobublob: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, Vna 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()neboImage.to_rgb565().
- image.PNG: int¶
Komprimovaný buffer PNG. Operace na úrovni pixelů vyžadují nejprve
Image.to_grayscale()neboImage.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_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í.
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.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.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.
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.
Porovnávání šablon¶
Předejte kteroukoli z následujících jako argument search metodě Image.find_template().
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é.
Symbologie čárových kódů¶
Hodnoty hlášené v BarCode.type pro položky vrácené metodou Image.find_barcodes().
- 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.