Exemples de vision pour la saison 2017

LabVIEW

L’exemple de vision en LabVIEW 2017 est inclus dans les autres exemples LabVIEW. Depuis la fenêtre d’accueil, cliquez sur Support->Find FRC® Examples ou à partir de toute autre fenêtre LabVIEW, cliquez sur Help->Find Examples et localisez le dossier Vision pour trouver 2017 Vision Example. Les images d’exemple sont groupées avec l’exemple.

C++/Java

Nous avons fourni un projet GRIP et la description ci-dessous, ainsi que les exemples d’images, regroupés dans un fichier ZIP qui peut être trouvé sur TeamForge.

Voir Utilisation du code généré dans un programme de robot pour plus de détails sur l’intégration du code généré par GRIP dans votre programme de robot.

Le code généré par le projet GRIP inclus trouvera les contours OpenCV pour les particules vertes dans les images incluses dans le dossier Vision Images de ce ZIP. À partir de là, vous souhaiterez peut-être poursuivre le traitement de ces contours pour évaluer s’ils identifient correctement la cible. Pour faire cela:

  1. Utilisez la méthode « boundingRect » pour dessiner des rectangles de délimitation autour des contours

  2. L’exemple de code LabVIEW calcule 5 ratios distincts pour la cible. Chacun de ces ratios devrait être nominalement égal à 1.0. Pour ce faire, il trie les contours selon leur taille, puis en commençant par le plus grand, calcule ces valeurs pour chaque paire de contours qui peut être éventuellement la bonne cible et s’arrête s’il trouve la bonne cible ou renvoie la meilleure paire trouvée.

Dans les formules ci-dessous, chaque lettre fait référence à une coordonnée du rectangle englobant (H = hauteur, L = gauche, T = haut, B = bas, W = largeur) et l’indice numérique fait référence au numéro de contour (1 est le plus grand contour, 2 est le deuxième plus grand, etc.).

  • La hauteur du haut doit être de 40% de la hauteur totale (4 pouces / 10 pouces):

\[\textit{Group Height} = \frac{H_1}{0.4 (B_2 - T_1)}\]
  • Du haut de la bande inférieure au haut de la bande supérieure doit correspondre à 60% de la hauteur totale (6 pouces / 10 pouces):

\[\textit{dTop} = \frac{T_2 - T_1}{0.6 (B_2 - T_1)}\]
  • La distance entre le bord gauche du contour 1 et le bord gauche du contour 2 doit être petite par rapport à la largeur du 1er contour; puis on ajoute 1 pour faire le rapport centré sur 1:

\[\textit{LEdge} = \frac{L_1 - L_2}{W_1} + 1\]
  • Les largeurs des deux contours doivent être à peu près les mêmes:

\[\textit{Width ratio} = \frac{W_1}{W_2}\]
  • La plus grande bande doit être deux fois plus haute que la plus petite

\[\textit{Height ratio} = \frac{H_1}{2 H_2}\]

Chacun de ces ratios est ensuite transformé en un score de 0 à 100 en calculant:

\[100 - (100 \cdot \mathrm{abs}(1 - \textit{Val}))\]
  1. Pour déterminer la distance, mesurez les pixels du haut du cadre de délimitation supérieur au bas du cadre de délimitation inférieur:

\[\textit{distance} = \frac{\textit{Target height in ft.} (10/12) \cdot \textit{YRes}}{2 \cdot \textit{PixelHeight} \cdot \tan (\textit{viewAngle of camera})}\]

L’exemple LabVIEW utilise la hauteur car les rebords de la cible ronde sont plus sujets au bruit lors de la détection (lorsque l’angle de la caméra s’éloigne de la normale de l’objet, les couleurs se distorsionnent et le vert de l’anneau lumineux s’estompe). L’inconvénient est que la hauteur de pixel de la cible dans l’image est affectée par la distorsion en perspective de l’angle de la caméra. Les correctifs possibles incluent:

  • Essayez d’utiliser plutôt la largeur

  • Mesurer empiriquement la hauteur à différentes distances et créer une table de correspondance ou une fonction de régression

  • Montez la caméra sur un servo-moteur, centrez la cible verticalement dans l’image et utilisez l’angle du servo pour le calcul de la distance (vous devrez déterminer vous-même le calcul trigonométrique approprié ou trouver un professeur de mathématiques pour vous aider!)

  • Corrigez la distorsion de perspective en utilisant OpenCV. Pour ce faire, vous devrez calibrer votre caméra avec OpenCV. Il en résultera une matrice de distorsion et une matrice de caméra. Vous prendrez ces deux matrices et les utiliserez avec la fonction undistortPoints pour mapper les points que vous souhaitez mesurer pour le calcul de la distance aux coordonnées « correctes » (cela utilise moions de ressources CPU que de déformer l’image entière)