image — vision industrielle¶
Le module image est au cœur de la pile de vision industrielle d’OpenMV. Il expose la classe Image – le tampon de pixels en mémoire sur lequel opère chaque routine de dessin, de filtrage, de transformation et d’extraction de caractéristiques – ainsi que les objets de résultat renvoyés par ces routines (Blob, Line, Circle, Rect, QRCode, AprilTag, DataMatrix, BarCode, …) et les classes auxiliaires utilisées pour les configurer (Threshold, Histogram, Statistics, HaarCascade, Similarity, Percentile, Displacement, ImageIO).
Acquérir une image¶
Il existe quatre façons de charger une Image en RAM :
Capture en direct depuis le capteur de la caméra. Appelez
csi.CSI.snapshot()pour capturer la trame suivante directement dans le tampon d’image ; l”Imagerenvoyée référence ce tampon.Depuis un fichier. Passez un chemin au constructeur
Image(image.Image("/sd/photo.jpg")) ; les formats sur disque pris en charge sont BMP, PPM/PGM, JPEG, PNG et le format d’enregistrementImageIOd’OpenMV.Depuis un ndarray. Passez un
ndarrayfloat32(h, w)ou(h, w, 3)au constructeurImage. Les pixels sont mis à l’échelle de0.0 -- 255.0vers une image GRAYSCALE ou RGB565 respectivement. Utilisez ceci pour ramener la sortie tensorielle deml(ou de tout pipelineulab) dans une image que l’on peut dessiner.Tampon vide. Construisez une
Imageavec une taille et un format de pixel donnés (image.Image(320, 240, image.RGB565)) pour y dessiner à partir de zéro, ou pour l’utiliser comme surface de travail pour des opérations arithmétiques sur les images.
Formats de pixel¶
Chaque Image possède l’un des formats de pixel suivants ; ce choix arbitre entre la mémoire, le coût de traitement et les algorithmes qui peuvent s’y exécuter. Utilisez BINARY, GRAYSCALE, RGB565, BAYER, YUV422, JPEG ou PNG comme argument pixformat lors de la construction d’une image ou de la configuration du capteur de la caméra :
BINARY (1 bpp) – un bit par pixel. Le format le plus compact ; utilisé en interne par les routines de seuillage et de morphologie mais rarement capturé directement depuis le capteur.
GRAYSCALE (8 bpp) – un octet par pixel (le canal Y de YUV422). Le format le plus rapide pour la plupart des algorithmes de vision par ordinateur (AprilTag, détection de contours, flux optique).
RGB565 (16 bpp) – deux octets par pixel, 5 bits de rouge / 6 bits de vert / 5 bits de bleu. Le format couleur par défaut.
BAYER (8 bpp) – données couleur brutes en mosaïque de Bayer directement issues du capteur. Utile pour un dématriçage personnalisé ou pour stocker plus de pixels dans moins de mémoire avant de débayeriser à la demande.
YUV422 (16 bpp) – couleur avec sous-échantillonnage chromatique 4:2:2, deux octets par pixel. Utile lorsque vous voulez des algorithmes spécifiques à la chrominance sans payer le coût complet du RGB.
JPEG / PNG – tampons compressés. Idéal pour le stockage et la transmission réseau. Les opérations au niveau du pixel nécessitent d’abord
Image.to_grayscale()ouImage.to_rgb565().
Travailler avec les résultats¶
Les méthodes de détection / extraction de caractéristiques de Image renvoient des objets que vous pouvez parcourir et combiner – un appel à Image.find_blobs() renvoie une liste de Blob, un appel à Image.find_apriltags() renvoie une liste d”AprilTag, etc. Chaque classe de résultat expose les propriétés géométriques de la détection (centroïde, boîte englobante, surface, valeur de code, etc.) afin que vous puissiez agir directement dessus ou les repasser aux méthodes de dessin (Image.draw_rectangle(), Image.draw_string(), …).
Fonctions d’aide pour les espaces colorimétriques¶
Le module expose également de petites fonctions pures pour convertir des valeurs de pixel individuelles entre les espaces colorimétriques binaire / niveaux de gris / RGB / LAB / YUV. Elles sont utiles lorsque vous devez convertir des valeurs de seuil ou des entrées de palette en Python avant de les passer à des opérations sur image – pour une conversion d’image entière, utilisez les méthodes to_* de Image, qui sont bien plus rapides que d’appeler ces fonctions d’aide dans une boucle.
Classes¶
- classe Image – Objet image
- classe ImageIO – objet ImageIO
- class HaarCascade – descripteur de caractéristiques
- classe Similarity – objet Similarity
- class Histogram – objet Histogram
- classe Percentile – objet Percentile
- class Threshold – Objet Threshold
- classe Statistics – objet Statistics
- class Blob – objet Blob
- classe Line – objet Line
- class Circle – objet Circle
- classe Rect – objet Rectangle
- classe QRCode – objet QRCode
- class AprilTag – objet AprilTag
- class DataMatrix – objet DataMatrix
- class BarCode – objet BarCode
- class Displacement – objet Displacement
- class kptmatch – Objet de correspondance de points clés
Fonctions¶
Fonctions d’aide pour la conversion d’espaces colorimétriques¶
Chacune des fonctions X_to_Y ci-dessous effectue une seule conversion de valeur de pixel. Elles prennent/renvoient toutes des valeurs dans les plages canoniques d’OpenMV :
binaire –
int0 – 1.niveaux de gris –
int0 – 255.RGB – tuple
(r, g, b)d’entiers 8 bits (chacun 0 – 255).LAB – tuple
(l, a, b)avecLdans 0 – 100 etA/Bdans -128 – 127.YUV – tuple
(y, u, v)avecYdans 0 – 255 etU/Vdans -128 – 127.
Pour une conversion d’image entière, utilisez les méthodes to_* de Image, qui sont bien plus rapides que d’appeler ces fonctions d’aide dans une boucle.
- image.binary_to_grayscale(value: int) int¶
Convertit une valeur binaire en valeur en niveaux de gris.
- image.grayscale_to_binary(value: int) int¶
Convertit une valeur en niveaux de gris en valeur binaire.
- image.grayscale_to_rgb(value: int) Tuple[int, int, int]¶
Convertit une valeur en niveaux de gris en tuple RGB.
- image.grayscale_to_lab(value: int) Tuple[int, int, int]¶
Convertit une valeur en niveaux de gris en tuple LAB.
- image.grayscale_to_yuv(value: int) Tuple[int, int, int]¶
Convertit une valeur en niveaux de gris en tuple YUV.
- image.rgb_to_grayscale(value: Tuple[int, int, int]) int¶
Convertit un tuple RGB en valeur en niveaux de gris.
- image.rgb_to_lab(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Convertit un tuple RGB en tuple LAB.
- image.rgb_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Convertit un tuple RGB en tuple YUV.
- image.lab_to_grayscale(value: Tuple[int, int, int]) int¶
Convertit un tuple LAB en valeur en niveaux de gris.
- image.lab_to_rgb(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Convertit un tuple LAB en tuple RGB.
- image.lab_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Convertit un tuple LAB en tuple YUV.
- image.yuv_to_grayscale(value: Tuple[int, int, int]) int¶
Convertit un tuple YUV en valeur en niveaux de gris.
Descripteurs de caractéristiques¶
- image.HaarCascade(path: str, stages: int = -1) Cascade¶
Charge un Haar Cascade et renvoie un handle
Cascadeà utiliser avecImage.find_features().pathpeut être soit :la chaîne littérale
"frontalface"ou"eye"pour charger l’une des deux cascades intégrées dans la ROM du micrologiciel, ouun chemin de système de fichiers vers un fichier binaire
.cascadepersonnalisé produit par les outils de conversion de cascade d’OpenMV.
stagessélectionne le nombre d’étapes de cascade à évaluer au moment de la détection.-1utilise toutes les étapes stockées dans le fichier. Réduire cette valeur accélère la détection au prix de davantage de faux positifs.
- image.load_descriptor(path: str) kp_desc | lbp_desc¶
Charge un descripteur depuis le fichier situé à
pathet le renvoie. L’étiquette de type interne du fichier sélectionne la classe de descripteur à reconstruire :Descripteur de point clé ORB – sauvegardé par
Image.find_keypoints()suivi deimage.save_descriptor().Descripteur LBP – sauvegardé par
Image.find_lbp()suivi deimage.save_descriptor().
- image.save_descriptor(descriptor: kp_desc | lbp_desc, path: str) None¶
Sérialise
descriptor(un descripteur de point clé ORB ou LBP) vers le fichier situé àpathau format de fichier de descripteur OpenMV. Le même fichier peut être rechargé ultérieurement viaimage.load_descriptor().
- image.match_descriptor(descriptor0, descriptor1, threshold: int = 85, filter_outliers: bool = False) int | kptmatch¶
Met en correspondance deux descripteurs du même type.
Pour deux descripteurs LBP – renvoie une distance de Hamming entière entre eux (plus elle est faible, plus la correspondance est proche).
Pour deux descripteurs de point clé ORB – renvoie un
kptmatchdécrivant le cluster de points clés correspondants, ouNonesi aucune correspondance ne dépassethreshold.
threshold(0 – 100) définit la rigueur de la mise en correspondance ORB lors de l’acceptation d’une paire de points clés. Des valeurs plus basses resserrent la correspondance en rejetant les faibles correspondances par plus proche voisin.filter_outliersactive un rejet des valeurs aberrantes de style RANSAC sur l’ensemble des points clés correspondants. Utilisez-le lorsque vous attendez une transformation rigide unique entre les deux vues ; désactivez-le lorsque les points clés correspondants couvrent plusieurs objets.
Fonctions d’aide pour la géométrie des blobs¶
Ces fonctions d’aide prennent un Blob (tel que renvoyé par Image.find_blobs()) et calculent à la demande des propriétés géométriques supplémentaires. Elles résident au niveau du module – et non sur Blob – de sorte que le chemin de base find_blobs() n’en paie pas le coût à moins que vous ne le demandiez.
- image.get_solidity(blob: blob) float¶
Renvoie la solidité (
blob.pixels / convex_hull_area) deblob. Flottant, 0 – 1 ; 1.0 signifie que le blob remplit entièrement son enveloppe convexe.
- image.get_convexity(blob: blob) float¶
Renvoie la convexité (
convex_hull_perimeter / blob.perimeter) deblob. Flottant, 0 – 1 ; 1.0 correspond à un blob parfaitement convexe.
- image.get_major_axis_line(blob: blob) line¶
Renvoie une
Linele long du grand axe deblob(le plus long des deux axes principaux du rectangle pivoté d’aire minimale).
- image.get_minor_axis_line(blob: blob) line¶
Renvoie une
Linele long du petit axe deblob(le plus court des deux axes principaux du rectangle pivoté d’aire minimale).
- image.get_enclosed_ellipse(blob: blob) Tuple[int, int, int, int, int]¶
Renvoie un 5-tuple
(cx, cy, a, b, rotation)décrivant l’ellipse inscrite dans le rectangle pivoté d’aire minimale autour deblob:cx/cy– centre de l’ellipse en pixels (entier).a/b– longueurs des demi-axes en pixels (entier).rotation– rotation de l’ellipse en degrés (entier).
Il s’agit d’un tuple ordinaire, pas d’un attrtuple, donc les champs ne sont accessibles que par index.
Constantes¶
Formats de pixel¶
Passez l’une des valeurs suivantes comme argument pixformat au constructeur Image ou à csi.CSI.pixformat().
- image.BINARY: int¶
Bitmap à 1 bit par pixel. Le format le plus compact – utilisé en interne par le seuillage et la morphologie, rarement capturé directement depuis un capteur.
- image.GRAYSCALE: int¶
Niveaux de gris à 8 bits par pixel (un octet par pixel). Le format le plus rapide pour la plupart des algorithmes de vision par ordinateur (AprilTag, détection de contours, flux optique).
- image.RGB565: int¶
Couleur à 16 bits par pixel encodée en 5 bits de rouge / 6 bits de vert / 5 bits de bleu. Le format couleur par défaut.
- image.BAYER: int¶
Données Bayer brutes à 8 bits par pixel directement issues du capteur. La plupart des méthodes de traitement d’image ne sont pas disponibles sur les images Bayer ; utilisez ce format lorsque vous voulez débayeriser à la demande ou stocker plus de pixels dans moins de mémoire.
- image.YUV422: int¶
Couleur avec sous-échantillonnage chromatique 4:2:2, deux octets par pixel, encodée en
Y1, U, Y2, Vpar paire de pixels. Seules certaines méthodes de traitement d’image fonctionnent directement sur YUV422.
- image.JPEG: int¶
Tampon JPEG compressé. Les opérations au niveau du pixel nécessitent d’abord
Image.to_grayscale()ouImage.to_rgb565().
- image.PNG: int¶
Tampon PNG compressé. Les opérations au niveau du pixel nécessitent d’abord
Image.to_grayscale()ouImage.to_rgb565().
Palettes de couleurs¶
Passez l’une des valeurs suivantes à Image.to_rainbow(), Image.to_ironbow(), Image.draw_image() (color_palette=) ou à csi.CSI.color_palette() pour coloriser une image en niveaux de gris.
- image.PALETTE_RAINBOW: int¶
Roue chromatique arc-en-ciel lisse. La palette OpenMV par défaut pour l’imagerie thermique.
- image.PALETTE_IRONBOW: int¶
Palette « ironbow » non linéaire qui imite l’apparence du viseur thermique FLIR Lepton.
- image.PALETTE_DEPTH: int¶
Palette d’image de profondeur. Disponible uniquement sur les builds avec prise en charge du capteur de profondeur (le pipeline ToF – p. ex. OpenMV Cam AE3 ou toute caméra avec un Pmod ToF connecté).
- image.PALETTE_EVT_DARK: int¶
Palette pour visualiser les trames de la caméra événementielle GENX320 sur fond sombre. Passez-la à
csi.CSI.color_palettepour que le pilote GENX320 émette des trames RGB565 colorisées en mode histogramme, ou àImage.draw_image()color_palette=lors de la colorisation d’une image événementielle en niveaux de gris.Disponible uniquement sur les builds avec prise en charge du GENX320 (OpenMV Cam AE3 et le Pmod GENX320).
- image.PALETTE_EVT_LIGHT: int¶
Palette pour visualiser les trames de la caméra événementielle GENX320 sur fond clair. Même répartition et même disponibilité que
PALETTE_EVT_DARK.
Modes de mise à l’échelle¶
Passez l’une des valeurs suivantes comme argument hint à Image.draw_image(), Image.scale(), ou à des méthodes de mise à l’échelle similaires.
Indices de dessin / draw_image¶
Combinez par OU binaire l’une de ces valeurs et passez-les comme argument hint de Image.draw_image().
- image.CENTER: int¶
Centre la source sur la destination. Tout décalage x/y explicite devient alors un décalage par rapport au centre au lieu du coin supérieur gauche.
- image.EXTRACT_RGB_CHANNEL_FIRST: int¶
Lors de l’extraction d’un canal RGB via
Image.draw_image(), extrait le canal avant la mise à l’échelle. Sans cet indice, le canal est extrait après la mise à l’échelle.
- image.APPLY_COLOR_PALETTE_FIRST: int¶
Lors de l’application d’une palette de couleurs via
Image.draw_image(), applique la palette avant la mise à l’échelle. Sans cet indice, la palette est appliquée après la mise à l’échelle.
- image.SCALE_ASPECT_KEEP: int¶
Met la source à l’échelle pour qu’elle tienne à l’intérieur de la destination tout en conservant le rapport d’aspect (ajoute des bandes noires lorsque les rapports diffèrent).
- image.SCALE_ASPECT_EXPAND: int¶
Met la source à l’échelle pour qu’elle remplisse la destination tout en conservant le rapport d’aspect (recadre lorsque les rapports diffèrent).
- image.SCALE_ASPECT_IGNORE: int¶
Met la source à l’échelle pour qu’elle remplisse la destination, en ignorant le rapport d’aspect.
- image.BLACK_BACKGROUND: int¶
Indique au chemin de mélange alpha que la destination est connue pour être noire afin qu’il puisse omettre la relecture du pixel de destination. Accélère les effets alpha sur les tampons fraîchement effacés.
Sous-échantillonnage JPEG¶
Passez l’une des valeurs suivantes comme argument subsampling à Image.to_jpeg(), Image.compress(), ou Image.save() lors de l’écriture d’un JPEG.
- image.JPEG_SUBSAMPLING_AUTO: int¶
Choisit automatiquement le sous-échantillonnage chromatique en fonction du réglage de qualité JPEG.
- image.JPEG_SUBSAMPLING_444: int¶
Force un sous-échantillonnage chromatique 4:4:4 (aucune compression de la chrominance).
Mise en correspondance de modèle¶
Passez l’une des valeurs suivantes comme argument search à Image.find_template().
Détection de contours¶
Passez l’une des valeurs suivantes comme argument algorithm à Image.find_edges().
- image.EDGE_CANNY: int¶
Détecteur de contours de Canny – magnitude du gradient + suppression des non-maxima + hystérésis. Meilleure qualité, plus lent.
- image.EDGE_SIMPLE: int¶
Détecteur de contours par filtre passe-haut seuillé. Plus rapide mais produit des contours plus épais et plus bruités que
EDGE_CANNY.
Détecteurs de coins ORB¶
Passez l’une des valeurs suivantes comme argument corner_detector à Image.find_keypoints().
- image.CORNER_FAST: int¶
Détecteur de coins FAST. Plus rapide que
CORNER_AGASTmais moins précis.
- image.CORNER_AGAST: int¶
Détecteur de coins AGAST. Plus lent que
CORNER_FASTmais produit des points clés plus stables.
Familles AprilTag¶
Combinez par OU binaire n’importe quelle combinaison des valeurs suivantes et passez-les comme argument families à Image.find_apriltags(). Chaque famille est conditionnée par sa propre option de build dans le micrologiciel ; les familles non prises en charge sont absentes au moment de l’exécution plutôt que toujours nulles.
Symbologies de code-barres¶
Les valeurs rapportées dans BarCode.type pour les entrées renvoyées par Image.find_barcodes().
- image.PDF417: int¶
Code-barres 2D empilé PDF417. La constante existe par souci d’exhaustivité, mais le décodeur de code-barres n’implémente pas actuellement le PDF417 –
Image.find_barcodes()ne renverra pas de détections de ce type.