image — machine vision¶
De image-module is het hart van de OpenMV machine-vision-stack. Hij stelt de Image-klasse beschikbaar – de pixelbuffer in het geheugen waarop elke teken-, filter-, transformatie- en kenmerkextractieroutine werkt – samen met de bijbehorende resultaatobjecten die door die routines worden geretourneerd (Blob, Line, Circle, Rect, QRCode, AprilTag, DataMatrix, BarCode, …) en de hulpklassen die worden gebruikt om ze te configureren (Threshold, Histogram, Statistics, HaarCascade, Similarity, Percentile, Displacement, ImageIO).
Een afbeelding verkrijgen¶
Er zijn vier manieren om een Image in het RAM te krijgen:
Live opname van de camerasensor. Roep
csi.CSI.snapshot()aan om het volgende frame rechtstreeks in de framebuffer vast te leggen; de geretourneerdeImageverwijst naar die buffer.Vanuit een bestand. Geef een pad door aan de
Image-constructor (image.Image("/sd/photo.jpg")); ondersteunde formaten op schijf zijn BMP, PPM/PGM, JPEG, PNG en het OpenMVImageIO-opnameformaat.Vanuit een ndarray. Geef een float32
(h, w)- of(h, w, 3)-ndarraydoor aan deImage-constructor. De pixels worden van0.0 -- 255.0geschaald naar respectievelijk een GRAYSCALE- of RGB565-afbeelding. Gebruik dit om tensoruitvoer vanml(of een willekeurigeulab-pijplijn) terug te brengen naar een tekenbare afbeelding.Lege buffer. Construeer een
Imagemet een opgegeven grootte en pixelformaat (image.Image(320, 240, image.RGB565)) om vanaf nul in te tekenen, of om te gebruiken als kladoppervlak voor beeldrekenkunde.
Pixelformaten¶
Elke Image heeft een van de volgende pixelformaten; de keuze maakt een afweging tussen geheugen, verwerkingskosten en welke algoritmen erop kunnen draaien. Gebruik BINARY, GRAYSCALE, RGB565, BAYER, YUV422, JPEG of PNG als pixformat-argument bij het construeren van een afbeelding of het configureren van de camerasensor:
BINARY (1 bpp) – één bit per pixel. Het kleinste formaat; intern gebruikt door drempelwaarde- en morfologieroutines, maar zelden rechtstreeks van de sensor vastgelegd.
GRAYSCALE (8 bpp) – één byte per pixel (het Y-kanaal van YUV422). Het snelste formaat voor de meeste computer-vision-algoritmen (AprilTag, randdetectie, optical flow).
RGB565 (16 bpp) – twee bytes per pixel, 5-bits rood / 6-bits groen / 5-bits blauw. Het standaard kleurformaat.
BAYER (8 bpp) – ruwe Bayer-patroon-kleurgegevens rechtstreeks van de sensor. Handig voor aangepaste de-mosaicing of om meer pixels in minder geheugen op te slaan voordat er op aanvraag wordt gedebayerd.
YUV422 (16 bpp) – 4:2:2 chroma-subgesamplede kleur, twee bytes per pixel. Handig wanneer je chroma-specifieke algoritmen wilt zonder de volledige RGB-kosten te betalen.
JPEG / PNG – gecomprimeerde buffers. Het beste voor opslag en netwerkverzending. Bewerkingen op pixelniveau vereisen eerst
Image.to_grayscale()ofImage.to_rgb565().
Werken met resultaten¶
De detectie-/kenmerkextractiemethoden op Image retourneren objecten waarover je kunt itereren en die je kunt combineren – een Image.find_blobs()-aanroep retourneert een lijst van Blob, een Image.find_apriltags()-aanroep retourneert een lijst van AprilTag, enz. Elke resultaatklasse stelt de geometrische eigenschappen van de detectie beschikbaar (zwaartepunt, begrenzingsvak, oppervlakte, codewaarde, enz.) zodat je er rechtstreeks op kunt reageren of ze kunt terugdoorgeven aan tekenmethoden (Image.draw_rectangle(), Image.draw_string(), …).
Hulpfuncties voor kleurruimten¶
De module stelt ook kleine zuivere functies beschikbaar voor het converteren van afzonderlijke pixelwaarden tussen de binaire / grijswaarden / RGB / LAB / YUV kleurruimten. Deze zijn handig wanneer je drempelwaarden of palet-items in Python moet converteren voordat je ze doorgeeft aan beeldbewerkingen – voor conversie van een volledige afbeelding gebruik je de Image to_*-methoden, die veel sneller zijn dan deze hulpfuncties in een lus aan te roepen.
Klassen¶
- class Image – Image-object
- class ImageIO – ImageIO-object
- class HaarCascade – Kenmerkdescriptor
- class Similarity – Similarity-object
- class Histogram – Histogram-object
- class Percentile – Percentile-object
- class Threshold – Threshold-object
- class Statistics – Statistics-object
- class Blob – Blob-object
- class Line – Line-object
- class Circle – Circle-object
- class Rect – Rectangle-object
- class QRCode – QRCode-object
- class AprilTag – AprilTag-object
- class DataMatrix – DataMatrix-object
- class BarCode – BarCode-object
- class Displacement – Displacement-object
- class kptmatch – Sleutelpunt-overeenkomstobject
Functies¶
Hulpfuncties voor kleurruimteconversie¶
Elk van de onderstaande X_to_Y-functies voert een enkele pixelwaardeconversie uit. Ze nemen/retourneren allemaal waarden in de canonieke OpenMV-bereiken:
binary –
int0 – 1.grayscale –
int0 – 255.RGB –
(r, g, b)-tuple van 8-bits gehele getallen (elk 0 – 255).LAB –
(l, a, b)-tuple metLin 0 – 100 enA/Bin -128 – 127.YUV –
(y, u, v)-tuple metYin 0 – 255 enU/Vin -128 – 127.
Voor conversie van een volledige afbeelding gebruik je de Image to_*-methoden, die veel sneller zijn dan deze hulpfuncties in een lus aan te roepen.
- image.binary_to_rgb(value: int) Tuple[int, int, int]¶
Converteer een binaire waarde naar een RGB-tuple.
- image.binary_to_lab(value: int) Tuple[int, int, int]¶
Converteer een binaire waarde naar een LAB-tuple.
- image.binary_to_yuv(value: int) Tuple[int, int, int]¶
Converteer een binaire waarde naar een YUV-tuple.
- image.grayscale_to_rgb(value: int) Tuple[int, int, int]¶
Converteer een grijswaarde naar een RGB-tuple.
- image.grayscale_to_lab(value: int) Tuple[int, int, int]¶
Converteer een grijswaarde naar een LAB-tuple.
- image.grayscale_to_yuv(value: int) Tuple[int, int, int]¶
Converteer een grijswaarde naar een YUV-tuple.
- image.rgb_to_binary(value: Tuple[int, int, int]) int¶
Converteer een RGB-tuple naar een binaire waarde.
- image.rgb_to_grayscale(value: Tuple[int, int, int]) int¶
Converteer een RGB-tuple naar een grijswaarde.
- image.rgb_to_lab(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Converteer een RGB-tuple naar een LAB-tuple.
- image.rgb_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Converteer een RGB-tuple naar een YUV-tuple.
- image.lab_to_binary(value: Tuple[int, int, int]) int¶
Converteer een LAB-tuple naar een binaire waarde.
- image.lab_to_grayscale(value: Tuple[int, int, int]) int¶
Converteer een LAB-tuple naar een grijswaarde.
- image.lab_to_rgb(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Converteer een LAB-tuple naar een RGB-tuple.
- image.lab_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Converteer een LAB-tuple naar een YUV-tuple.
- image.yuv_to_binary(value: Tuple[int, int, int]) int¶
Converteer een YUV-tuple naar een binaire waarde.
- image.yuv_to_grayscale(value: Tuple[int, int, int]) int¶
Converteer een YUV-tuple naar een grijswaarde.
Kenmerkdescriptoren¶
- image.HaarCascade(path: str, stages: int = -1) Cascade¶
Laad een Haar Cascade en retourneer een
Cascade-handle voor gebruik metImage.find_features().pathkan een van beide zijn:de letterlijke string
"frontalface"of"eye"om een van de twee in de firmware-ROM ingebakken cascades te laden, ofeen bestandssysteempad naar een aangepast
.cascade-binair bestand geproduceerd door de OpenMV cascade-converter-tools.
stagesselecteert hoeveel cascade-stadia er tijdens detectie worden geëvalueerd.-1gebruikt elk in het bestand opgeslagen stadium. Het verlagen van deze waarde versnelt detectie ten koste van meer fout-positieven.
- image.load_descriptor(path: str) kp_desc | lbp_desc¶
Laad een descriptor uit het bestand op
pathen retourneer deze. De interne typetag van het bestand selecteert welke descriptorklasse wordt gereconstrueerd:ORB-sleutelpuntdescriptor – opgeslagen door
Image.find_keypoints()gevolgd doorimage.save_descriptor().LBP-descriptor – opgeslagen door
Image.find_lbp()gevolgd doorimage.save_descriptor().
- image.save_descriptor(descriptor: kp_desc | lbp_desc, path: str) None¶
Serialiseer
descriptor(een ORB-sleutelpunt- of LBP-descriptor) naar het bestand oppathin het OpenMV-descriptorbestandsformaat. Hetzelfde bestand kan later opnieuw worden geladen viaimage.load_descriptor().
- image.match_descriptor(descriptor0, descriptor1, threshold: int = 85, filter_outliers: bool = False) int | kptmatch¶
Vergelijk twee descriptoren van hetzelfde type.
Voor twee LBP-descriptoren – retourneert een gehele Hamming-afstand tussen beide (lager is een nauwere overeenkomst).
Voor twee ORB-sleutelpuntdescriptoren – retourneert een
kptmatchdie het cluster van overeenkomende sleutelpunten beschrijft, ofNoneals geen enkele overeenkomst doorthresholdkomt.
threshold(0 – 100) stelt in hoe streng ORB-matching is bij het accepteren van een sleutelpuntpaar. Lagere waarden maken de matching strakker door zwakke nearest-neighbour-overeenkomsten af te wijzen.filter_outliersschakelt RANSAC-achtige uitschieterverwijdering in over de verzameling overeenkomende sleutelpunten. Gebruik het wanneer je een enkele starre transformatie tussen de twee weergaven verwacht; schakel het uit wanneer de overeenkomende sleutelpunten meerdere objecten beslaan.
Hulpfuncties voor blobgeometrie¶
Deze hulpfuncties nemen een Blob (zoals geretourneerd door Image.find_blobs()) en berekenen op aanvraag aanvullende geometrische eigenschappen. Ze bevinden zich op modulescope – niet op Blob – zodat het basale find_blobs()-pad er niet voor betaalt tenzij je erom vraagt.
- image.get_solidity(blob: blob) float¶
Retourneert de soliditeit (
blob.pixels / convex_hull_area) vanblob. Float, 0 – 1; 1.0 betekent dat de blob zijn convexe omhulling volledig vult.
- image.get_convexity(blob: blob) float¶
Retourneert de convexiteit (
convex_hull_perimeter / blob.perimeter) vanblob. Float, 0 – 1; 1.0 is een perfect convexe blob.
- image.get_major_axis_line(blob: blob) line¶
Retourneert een
Linelangs de hoofdas vanblob(de langste van de twee hoofdassen van de roterende rechthoek met minimale oppervlakte).
- image.get_minor_axis_line(blob: blob) line¶
Retourneert een
Linelangs de nevenas vanblob(de kortste van de twee hoofdassen van de roterende rechthoek met minimale oppervlakte).
- image.get_enclosed_ellipse(blob: blob) Tuple[int, int, int, int, int]¶
Retourneert een 5-tuple
(cx, cy, a, b, rotation)die de ellips beschrijft die is ingeschreven in de roterende rechthoek met minimale oppervlakte rondblob:cx/cy– middelpunt van de ellips in pixels (geheel getal).a/b– halve-aslengten in pixels (geheel getal).rotation– rotatie van de ellips in graden (geheel getal).
Dit is een gewone tuple, geen attrtuple, dus de velden zijn alleen toegankelijk via index.
Constanten¶
Pixelformaten¶
Geef een van de volgende waarden door als pixformat-argument aan de Image-constructor of aan csi.CSI.pixformat().
- image.BINARY: int¶
Bitmap met 1 bit per pixel. Het kleinste formaat – intern gebruikt door drempelwaarde en morfologie, zelden rechtstreeks van een sensor vastgelegd.
- image.GRAYSCALE: int¶
Grijswaarden met 8 bits per pixel (één byte per pixel). Het snelste formaat voor de meeste computer-vision-algoritmen (AprilTag, randdetectie, optical flow).
- image.RGB565: int¶
Kleur met 16 bits per pixel, gepakt als 5 bits rood / 6 bits groen / 5 bits blauw. Het standaard kleurformaat.
- image.BAYER: int¶
Ruwe Bayer-gegevens met 8 bits per pixel rechtstreeks van de sensor. De meeste beeldverwerkingsmethoden zijn niet beschikbaar op Bayer-afbeeldingen; gebruik dit wanneer je op aanvraag wilt debayeren of meer pixels in minder geheugen wilt opslaan.
- image.YUV422: int¶
4:2:2 chroma-subgesamplede kleur, twee bytes per pixel, gepakt als
Y1, U, Y2, Vper pixelpaar. Slechts sommige beeldverwerkingsmethoden werken rechtstreeks op YUV422.
- image.JPEG: int¶
Gecomprimeerde JPEG-buffer. Bewerkingen op pixelniveau vereisen eerst
Image.to_grayscale()ofImage.to_rgb565().
- image.PNG: int¶
Gecomprimeerde PNG-buffer. Bewerkingen op pixelniveau vereisen eerst
Image.to_grayscale()ofImage.to_rgb565().
Kleurenpaletten¶
Geef een van de volgende waarden door aan Image.to_rainbow(), Image.to_ironbow(), Image.draw_image() (color_palette=) of aan csi.CSI.color_palette() om een grijswaardenafbeelding in te kleuren.
- image.PALETTE_RAINBOW: int¶
Vloeiend regenboogkleurenwiel. Het standaard OpenMV-palet voor thermische beelden.
- image.PALETTE_IRONBOW: int¶
Niet-lineair “ironbow”-palet dat het uiterlijk van de FLIR Lepton thermische zoeker nabootst.
- image.PALETTE_DEPTH: int¶
Dieptebeeldpalet. Alleen beschikbaar op builds met diepte-sensorondersteuning (de ToF-pijplijn – bijv. de OpenMV Cam AE3 of een willekeurige cam met een aangesloten ToF Pmod).
- image.PALETTE_EVT_DARK: int¶
Palet voor het visualiseren van GENX320-eventcameraframes op een donkere achtergrond. Geef het door aan
csi.CSI.color_paletteom de GENX320-driver ingekleurde RGB565-frames in histogrammodus te laten uitvoeren, of aanImage.draw_image()color_palette=bij het inkleuren van een grijswaarden-eventafbeelding.Alleen beschikbaar op builds met GENX320-ondersteuning (de OpenMV Cam AE3 en de GENX320 Pmod).
- image.PALETTE_EVT_LIGHT: int¶
Palet voor het visualiseren van GENX320-eventcameraframes op een lichte achtergrond. Dezelfde dispatch en beschikbaarheid als
PALETTE_EVT_DARK.
Schaalmodi¶
Geef een van de volgende waarden door als hint-argument aan Image.draw_image(), Image.scale() of vergelijkbare schaalmethoden.
Hints voor tekenen / draw_image¶
Combineer een willekeurige set hiervan met bit-OR en geef ze door als het hint-argument van Image.draw_image().
- image.CENTER: int¶
Centreer de bron op de bestemming. Eventuele expliciete x/y-offsets worden dan offsets vanaf het midden in plaats van vanaf de linkerbovenhoek.
- image.EXTRACT_RGB_CHANNEL_FIRST: int¶
Bij het extraheren van een RGB-kanaal via
Image.draw_image(), extraheer het kanaal vóór het schalen. Zonder deze hint wordt het kanaal na het schalen geëxtraheerd.
- image.APPLY_COLOR_PALETTE_FIRST: int¶
Bij het toepassen van een kleurenpalet via
Image.draw_image(), pas het palet vóór het schalen toe. Zonder deze hint wordt het palet na het schalen toegepast.
- image.SCALE_ASPECT_KEEP: int¶
Schaal de bron om binnen de bestemming te passen met behoud van de beeldverhouding (letterboxt wanneer de verhoudingen verschillen).
- image.SCALE_ASPECT_EXPAND: int¶
Schaal de bron om de bestemming te vullen met behoud van de beeldverhouding (snijdt bij wanneer de verhoudingen verschillen).
- image.SCALE_ASPECT_IGNORE: int¶
Schaal de bron om de bestemming te vullen, waarbij de beeldverhouding wordt genegeerd.
JPEG-subsampling¶
Geef een van de volgende waarden door als subsampling-argument aan Image.to_jpeg(), Image.compress() of Image.save() bij het wegschrijven van een JPEG.
- image.JPEG_SUBSAMPLING_AUTO: int¶
Kies chroma-subsampling automatisch op basis van de JPEG-kwaliteitsinstelling.
Template matching¶
Geef een van de volgende waarden door als search-argument aan Image.find_template().
Randdetectie¶
Geef een van de volgende waarden door als algorithm-argument aan Image.find_edges().
- image.EDGE_CANNY: int¶
Canny-randdetector – gradiëntmagnitude + non-max-suppressie + hysterese. Hogere kwaliteit, trager.
- image.EDGE_SIMPLE: int¶
Drempelwaarde-hoogdoorlaatfilter-randdetector. Sneller maar produceert dikkere, ruisigere randen dan
EDGE_CANNY.
ORB-hoekdetectoren¶
Geef een van de volgende waarden door als corner_detector-argument aan Image.find_keypoints().
- image.CORNER_FAST: int¶
FAST-hoekdetector. Sneller dan
CORNER_AGASTmaar minder nauwkeurig.
- image.CORNER_AGAST: int¶
AGAST-hoekdetector. Trager dan
CORNER_FASTmaar produceert stabielere sleutelpunten.
AprilTag-families¶
Combineer een willekeurige combinatie van de volgende waarden met bit-OR en geef ze door als het families-argument aan Image.find_apriltags(). Elke familie wordt afgeschermd door zijn eigen build-optie in de firmware; niet-ondersteunde families zijn tijdens runtime afwezig in plaats van altijd-nul.
Barcode-symbologieën¶
De waarden die worden gerapporteerd in BarCode.type voor items die worden geretourneerd door Image.find_barcodes().
- image.PDF417: int¶
PDF417 2D-gestapelde barcode. De constante bestaat voor de volledigheid, maar de barcodedecoder implementeert PDF417 momenteel niet –
Image.find_barcodes()zal geen detecties van dit type retourneren.