Trouver des blocs de couleur
Tutoriel vidéo 4 - Reconnaissance de couleur : https://singtown.com/learn/49993/
Fonction find_blobs
Le suivi de balle est la fonction la plus utilisée d'OpenMV. Dans le démarrage rapide en 10 minutes,\ nous pouvons trouver le bloc de couleur grâce à la fonction find_blobs. Voyons les détails de find_blobs.
image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, merge=False, margin=0, threshold_cb=None, merge_cb=None)
Il y a de nombreux paramètres ici.
- thresholds est le seuil de couleur. Remarque : ce paramètre est une liste qui peut contenir plusieurs couleurs. Si vous n'avez besoin que d'une seule couleur, alors il n'y a qu'une seule valeur de couleur dans cette liste. Si vous voulez plusieurs seuils de couleur, alors cette liste doit contenir plusieurs seuils de couleur. Remarque : la méthode code peut être appelée sur l'objet bloc de couleur blob renvoyé pour déterminer de quelle couleur est le bloc de couleur.
red = (xxx,xxx,xxx,xxx,xxx,xxx)
blue = (xxx,xxx,xxx,xxx,xxx,xxx)
yellow = (xxx,xxx,xxx,xxx,xxx,xxx)
img=csi0.snapshot()
red_blobs = img.find_blobs([red])
color_blobs = img.find_blobs([red,blue, yellow])
roi est la « région d'intérêt ». Elle a été présentée dans l'utilisation des statistiques.
left_roi = [0,0,160,240]\ blobs = img.find_blobs([red],roi=left_roi)
x_stride est la largeur minimale en pixels dans la direction x du bloc de couleur à rechercher. La valeur par défaut est 2. Si vous ne voulez trouver que des blocs de couleur d'une largeur supérieure à 10 pixels, définissez ce paramètre à 10 :
blobs = img.find_blobs([red],x_stride=10)
y_stride est la largeur minimale en pixels dans la direction y du bloc de couleur à rechercher. La valeur par défaut est 1. Si vous ne voulez trouver que des blocs de couleur d'une largeur supérieure à 5 pixels, définissez ce paramètre à 5 :
blobs = img.find_blobs([red],y_stride=5)
invert inverse la valeur de seuil et utilise la couleur en dehors du seuil comme seuil de recherche
area_threshold est le seuil de superficie. Si la superficie du bloc de couleur encadré est inférieure à cette valeur, il sera filtré
pixels_threshold est le seuil de nombre de pixels, si le nombre de pixels d'un bloc de couleur est inférieur à cette valeur, il sera filtré
merge fusionne, si défini à True, fusionne tous les blobs qui se chevauchent en un seul.\ Remarque : cela fusionnera tous les blobs, quelle que soit leur couleur. Si vous voulez éviter de confondre des blobs de plusieurs couleurs, appelez simplement find_blobs séparément avec différents seuils de couleur.
all_blobs = img.find_blobs([red,blue,yellow],merge=True)
red_blobs = img.find_blobs([red],merge=True)
blue_blobs = img.find_blobs([blue],merge=True)
yellow_blobs = img.find_blobs([yellow],merge=True)
- margin marge, si défini à 1, alors deux blobs seront fusionnés s'ils sont distants d'1 pixel.
seuil
La structure d'un seuil de couleur est la suivante :
red = (minL, maxL, minA, maxA, minB, maxB)
Les valeurs dans le tuple sont respectivement les valeurs maximale et minimale de L A B.
Si vous voulez obtenir ce seuil dans l'image de l'IDE, voir : démarrage rapide en 10 minutes
Dans la nouvelle version de l'IDE, il y a un outil de sélection de seuil plus pratique, voir ci-dessous.
Outil de sélection de seuil de couleur
L'IDE d'OpenMV a ajouté un outil de sélection de seuil, qui facilite grandement le réglage des seuils de couleur.
Exécutez d'abord hello world.py pour afficher le motif dans le tampon
d'image de l'IDE.\
\
Ouvrez ensuite Outils → Vision par ordinateur → Éditeur de seuil\

Cliquez sur Frame Buffer pour obtenir l'image dans l'IDE, et Image File permet de sélectionner un fichier image vous-même.

Faites glisser les six curseurs pour voir les résultats du seuil en temps réel. Le résultat souhaité est de transformer notre couleur cible en blanc et toutes les autres couleurs en noir.

Blobs est une liste
L'objet find_blobs renvoie une liste de plusieurs blobs. (Notez la différence entre blobs et blob. C'est simplement un nom utilisé pour distinguer plusieurs blocs de couleur d'un seul bloc de couleur).\ Une liste est similaire à un tableau en langage C. Une liste blobs contient de nombreux objets blob. Les objets blob sont des blocs de couleur, et chaque objet blob contient des informations sur un bloc de couleur.
blobs = img.find_blobs([red])
Blobs représente de nombreux blocs de couleur.
Vous pouvez utiliser une boucle for pour trouver tous les blocs de couleur.
for blob in blobs:
print(blob.cx)
Pour l'utilisation des boucles for, voir les connaissances de base de Python
Objet bloc de couleur Blob
Blob dispose de plusieurs méthodes :
blob.rect renvoie le cadre extérieur de ce bloc de couleur - un tuple rectangulaire (x, y, w, h), qui peut être utilisé directement dans image.draw_rectangle.
blob.x renvoie la coordonnée x du bord du blob (int), également disponible via blob[0].
blob.y renvoie la coordonnée y du bord du blob (int), également disponible via blob[1].
blob.w renvoie la largeur w du bord du blob (int), également disponible via blob[2].
blob.h renvoie la hauteur h du bord du blob (int), également disponible via blob[3].
blob.pixels renvoie le nombre de pixels du blob (int), également disponible via blob[4].
blob.cx renvoie la coordonnée x du centre du bord du blob (int), également disponible via blob[5].
blob.cy renvoie la coordonnée y du centre du bord du blob (int), également disponible via blob[6].
blob.rotation renvoie l'angle de rotation du blob en radians (float). Si le blob ressemble à un crayon, cette valeur est comprise entre 0 et 180°. Si le blob est un cercle, cette valeur est inutile. Si le blob n'a aucune symétrie du tout, vous obtiendrez 0~360°. Vous pouvez également l'obtenir via blob[7].
blob.code renvoie un nombre de 16 bits, où chaque bit correspond à un seuil. Par exemple :
blobs = img.find_blobs([red, blue, yellow], merge=True)
Si le blob est rouge, son code est 0001, et s'il est bleu, son code est
Remarque : un blob peut être fusionné, donc s'il s'agit d'un blob rouge et bleu, le code du blob est 0011. Cette fonction peut être utilisée pour trouver des codes de couleur. Vous pouvez également l'obtenir via blob[8].
blob.count Si merge=True, plusieurs blobs sont fusionnés en un seul blob, et cette fonction renvoie le nombre de blobs. Si merge=False, la valeur de retour est toujours 1. Vous pouvez également l'obtenir via blob[9].
blob.area renvoie la superficie du cadre extérieur du blob. Elle devrait être égale à (w * h)
blob.density renvoie la densité du blob. C'est égal au nombre de pixels du blob divisé par la superficie du cadre extérieur. Si la densité est faible, cela signifie que la cible n'est pas très bien verrouillée.\ Par exemple, pour reconnaître un cercle rouge, le blob.pixels renvoyé est le nombre de pixels du cercle cible, et blob.area est la superficie du carré circonscrit au cercle.