Identification et traitement des cibles

Une fois qu’une image est capturée, l’étape suivante consiste à identifier les cibles de vision dans l’image. Ce document présentera une approche pour identifier les cibles de la saison 2016. Notez que les images utilisées dans cette section ont été prises avec la caméra intentionnellement réglée pour sous-exposer les images, produisant des images très sombres à l’exception des cibles éclairées, voir la section sur les paramètres de caméra pour plus de détails.

Options additionelles

Ce document présente l’approche utilisée dans l’exemple de code fourni dans LabVIEW (pour PC ou roboRIO), C++ et Java. En plus de ces options, les équipes doivent connaître les alternatives suivantes qui permettent le traitement de la vision sur l’ordinateur Driver Station ou sur un ordinateur embarqué:

  1. RoboRealm

  2. Extension de caméra SmartDashboard (programmée en Java, fonctionne avec n’importe autre langage de programmation)

  3. GRIP

Image d’origine

L’image ci-dessous est l’image de départ pour notre exemple. L’image a été prise à l’aide de l’anneau lumineux vert disponible dans FIRST® Choice, combiné avec un anneau supplémentaire d’une taille différente. Des exemples d’images sont fournis avec les exemples de code de vision.

Sample image using a green ring light showing the retroreflective tape.

Qu’est-ce que HSL/HSV?

La teinte de la couleur est généralement visible sur la roue chromatique et contient les couleurs de l’arc-en-ciel, soit le rouge, orange, jaune, vert, bleu, indigo et violet. La teinte est spécifiée en utilisant un angle radial sur la roue, mais en imagerie, le cercle ne contient généralement que 256 unités, en commençant par le rouge à zéro, en passant par l’arc-en-ciel et en revenant au rouge à l’extrémité supérieure. La saturation d’une couleur spécifie la quantité de couleur ou le rapport de la couleur de teinte à une quantité donnée de gris. Un rapport plus élevé signifie plus de couleurs, moins de gris. La saturation zéro n’a pas de teinte et est complètement grise. La luminance ou la valeur indique la quantité de gris avec laquelle la teinte est mélangée. Le noir est 0 et le blanc 255.

L’exemple de code utilise l’espace colorimétrique HSV pour spécifier la couleur de la cible. La principale raison est qu’elle permet facilement d’utiliser la luminosité des cibles par rapport au reste de l’image comme critère de filtrage en utilisant le composant Valeur (HSV) ou Luminance (HSL). Une autre raison d’utiliser le système de couleurs HSV est que l’opération de seuillage utilisée dans l’exemple s’exécute plus efficacement sur le roboRIO lorsqu’elle est effectuée dans l’espace colorimétrique HSV.

Masquage

Dans cette étape initiale, les valeurs des pixels sont comparées aux valeurs de couleur ou de luminosité constantes pour créer un masque binaire illustré ci-dessous en jaune. Cette étape unique élimine la plupart des pixels qui ne font pas partie du ruban rétroréfléchissant d’une cible. Le masquage basé sur la couleur fonctionne bien à condition que la couleur soit relativement saturée, lumineuse et cohérente. Les inégalités de couleur sont généralement plus précises lorsqu’elles sont spécifiées à l’aide de l’espace colorimétrique HSL (teinte, saturation et luminance) ou HSV (teinte, saturation et valeur) que l’espace RVB (rouge, vert et bleu). Cela est particulièrement vrai lorsque la gamme de couleurs est assez large dans une ou plusieurs dimensions.

Notez qu’en plus de la cible, d’autres parties lumineuses de l’image (lumière aérienne et éclairage de la tour) sont également capturées par l’étape de masquage.

Masked version of the image above showing the "bright" parts of the image.

Analyse des particules

Après l’opération de masquage, une opération de rapport de particules est utilisée pour examiner la zone, le rectangle de délimitation et le rectangle équivalent pour les particules. Ceux-ci sont utilisés pour calculer plusieurs termes notés pour aider à choisir les formes les plus rectangulaires. Chaque test décrit ci-dessous génère un score (0-100) qui est ensuite comparé aux limites de score prédéfinies pour décider si la particule est une cible ou non.

Zone de couverture

Le score d’aire est calculé en comparant l’aire de la particule à l’aire de la boîte englobante dessinée autour de la particule. La surface des bandes rétroréfléchissantes est de 80 pouces carrés (~ 516 :math: cm ^ 2). La zone du rectangle qui contient la cible est de 240 pouces carrés (~ 0,15 :math: m ^ 2). Cela signifie que le rapport idéal entre la zone et la zone de la zone de délimitation est de 1/3. Des ratios de surface proches de 1/3 produiront un score proche de 100, car le ratio diverge de 1/3, le score approchera de 0.

Rapport d’aspect

Le score du ratio d’aspect est basé sur le calcul (Largeur de particule / Hauteur de particule). La largeur et la hauteur de la particule sont déterminées en utilisant ce que l’on appelle le « rectangle équivalent ». Le rectangle équivalent est le rectangle avec des longueurs latérales \(x\) et \(y\)\(2x+2y\) est égal au périmètre de particules et \(x \cdot y\) est égal à la zone de particules. Le rectangle équivalent est utilisé pour le calcul du ratio d’aspect car il est moins affecté par l’inclinaison du rectangle que par l’utilisation du cadre de sélection. Lorsque vous utilisez le rectangle du cadre de sélection pour les proportions, à mesure que le rectangle est incliné, la hauteur augmente et la largeur diminue.

La cible mesure 20 « (508 mm) de largeur sur 12 » (304,8 mm) de hauteur, pour un rapport de 1,6. Le rapport hauteur / largeur détecté est comparé à ce rapport idéal. Le score du rapport hauteur / largeur est normalisé pour renvoyer 100 lorsque le rapport correspond au rapport cible et diminue linéairement lorsque le rapport varie en dessous ou au-dessus.

Moment d’inertie

Cette mesure calcule le moment d’inertie des particules autour de son centre de masse. Elle fournit une représentation de la distribution des pixels dans la particule. Le score idéal pour ce test est de ~ 0,28. Voir: Moment d’inertie

Profils X/Y

A graph and LabVIEW plot showing X/Y Profiles.

Ce score décrit si la particule correspond au profil approprié dans les directions X et Y. Il est calculé en utilisant les moyennes des lignes et des colonnes à travers le cadre de délimitation extraites de l’image d’origine et en les comparant à un masque de profil. Le score varie de 0 à 100 en fonction du nombre de valeurs dans les moyennes de ligne ou de colonne qui se situent entre les valeurs limites supérieure et inférieure.

Mesures

Si une particule a un score suffisamment élévé pour être considérée comme une cible, il est logique de calculer certaines mesures du monde réel telles que la position et la distance. L’exemple de code comprend ces mesures de base, alors examinons les mathématiques impliquées pour mieux les comprendre.

Position

La position cible est identifiée à la fois par la particule et le cadre de sélection, mais toutes les coordonnées sont en pixels. 0,0 étant en haut et à gauche de l’écran et les bords droit et inférieur déterminés par la résolution de la caméra. Il s’agit d’un système utile pour les mathématiques des pixels, mais pas vraiment utile pour conduire un robot; alors changeons-le en quelque chose qui pourrait être plus utile.

Pour convertir un point du système de pixels à un environnement plus compatible pour un robot, nous pouvons utiliser la formule ci-dessous.

Les coordonnées résultantes sont proches de ce que vous pouvez souhaiter, mais l’axe Y est inversé. Cela pourrait être corrigé en multipliant le point par [1, -1] (Remarque: cela n’est pas été fait dans l’exemple de code). Ce système de coordonnées est utile car il a une origine centrée et l’échelle est similaire aux sorties du joystick et aux entrées RobotDrive.

\[A_{x,y} = \left(P_{x,y} - \frac{\textit{resolution}_{x,y}}{2}\right) / \frac{\textit{resolution}_{x,y}}{2}\]
Two images one of a pixel based axis and another from -1 to 1 that can be directly used with motors for aiming.

Champ de vision

Vous pouvez utiliser des constantes connues et la position de la cible sur le plan de coordonnées pour déterminer votre distance, lacet (yaw) et tangage (pitch) par rapport à la cible. Cependant, pour les calculer, vous devez déterminer votre FOV (champ de vision). Afin de déterminer empiriquement le champ de vision vertical, réglez votre caméra à une distance définie d’une surface plane et mesurez la distance entre la rangée de pixels la plus haute et la plus basse.

\[\frac{1}{2}FOV_{vertical}=tan\left(\frac{\frac{1}{2}distance_{y}}{distance_{z}}\right)\]

Vous pouvez trouver le champ de vision horizontal en utilisant la même méthode, mais en utilisant la distance entre la première et la dernière colonne de pixels.

Tangage (Pitch) et Lacet (Yaw)

Trouver le tangage et le lacet de la cible par rapport à votre robot est simple une fois que vous connaissez vos FOV et l’emplacement de votre cible dans le système de coordonnées de visée.

\[pitch=\frac{A_y}{2}FOV_{vertical}\]
\[yaw=\frac{A_x}{2}FOV_{horizontal}\]

Distance

Si votre cible est à une hauteur sensiblement différente de celle de votre robot, vous pouvez utiliser des constantes connues, telles que la hauteur physique de la cible et de votre caméra, ainsi que l’angle de montage de votre caméra, pour calculer la distance entre votre caméra et la cible.

\[distance=\frac{height_{target}-height_{camera}}{tan(angle_{camera}+pitch)}\]

Une autre option consiste à créer une table de correspondance de la zone à la distance ou à estimer la constante de variation inverse de la zone et de la distance. Cependant, cette méthode est moins précise.

Note

Pour de meilleurs résultats pour les méthodes d’estimation d’angle et de distance ci-dessus, vous pouvez étalonner votre caméra à l’aide d’OpenCV pour éliminer les distorsions susceptibles d’affecter la précision en reprojetant les pixels de la cible à l’aide de la matrice d’étalonnage.