Introduction à GRIP

GRIP est un outil pour développer des algorithmes de vision par ordinateur de manière interactive plutôt que par le biais de codage d’essai et d’erreur. Après avoir développé votre algorithme, vous pouvez exécuter GRIP en mode réduit (headless) sur votre roboRIO, sur un ordinateur portable Driver Station ou sur un coprocesseur connecté sur le port réseau de votre robot. Avec Grip, vous choisissez les opérations de vision pour créer un pipeline graphique qui représente la séquence d’opérations qui sont effectuées pour exécuter l’algorithme de vision.

GRIP est basé sur OpenCV, l’une des bibliothèques de logiciels de vision par ordinateur les plus populaires utilisées pour la recherche, la robotique et les implémentations d’algorithmes de vision. Les opérations disponibles dans GRIP correspondent presque ligne pour ligne avec les opérations disponibles si vous codiez manuellement le même algorithme avec un langage de programmation textuel.

L’interface utilisateur GRIP

../../../../_images/the-grip-user-interface.png

L’interface utilisateur GRIP se compose de 4 parties:

  • Les sources d’images sont les moyens d’obtenir des images dans le pipeline GRIP. Vous pouvez fournir des images via des caméras ou des fichiers joints. Les sources sont presque toujours le début de l’algorithme de traitement d’image.

  • Operation Palette contient les étapes de traitement d’image de la librairie OpenCV que vous pouvez enchaîner dans le pipeline pour former votre algorithme. Cliquer sur une opération dans la palette l’ajoute à la fin du pipeline. Vous pouvez ensuite utiliser les flèches gauche et droite pour déplacer l’opération à l’intérieur du pipeline.

  • Pipeline est la séquence d’étapes qui composent l’algorithme. Chaque étape (opération) dans le pipeline est connectée à une étape précédente de la sortie d’une étape à une entrée à l’étape suivante. Les données circulent généralement de gauche à droite via les connexions que vous créez.

  • Image Preview sont des aperçus du résultat de chaque étape sur laquelle le bouton d’aperçu (Preview) est selectionné. Cela facilite le débogage des algorithmes en pouvant prévisualiser les sorties de chaque étape intermédiaire.

Une application: Trouver le carré jaune

../../../../_images/finding-the-yellow-square.png

Dans cette application, nous essaierons de trouver le carré jaune dans l’image et d’afficher sa position. La configuration est assez simple, juste une caméra Web USB connectée à l’ordinateur qui regarde des objets colorés. Le carré en plastique jaune est la chose que nous souhaitons localiser dans l’image.

Activer la source d’image

../../../../_images/enable-the-image-source.png

La première étape consiste à acquérir une image. Pour utiliser la source, cliquez sur le bouton « Add Webcam » et sélectionnez le numéro de la caméra. Dans ce cas, la caméra USB Logitech qui est apparue sous le nom de Webcam 0 et la caméra du moniteur de l’ordinateur était la Webcam 1. La caméra Web est sélectionnée dans ce cas pour saisir l’image derrière l’ordinateur comme indiqué dans la configuration. Sélectionnez ensuite le bouton de prévisualisation de l’image et l’affichage en temps réel du flux de la caméra sera affiché dans la zone de prévisualisation.

Redimensionner l’image

../../../../_images/resize-the-image.png

Dans ce cas, la résolution de la caméra est trop élevée pour nos besoins, et en fait, l’image entière ne peut même pas être affichée dans la fenêtre d’aperçu. L’opération « Resize » peut être choisie dans la palette d’opérations pour l’ajouter à la fin du pipeline. Pour aider à localiser l’opération de redimensionnement, écrivez « Resize » dans la zone de recherche en haut de la palette. Les étapes sont les suivantes:

  1. Tapez « Resize » dans la boîte de recherche sur la palette

  2. Cliquez sur l’opération de redimensionnement dans la palette. Elle apparaîtra dans le pipeline.

  3. Entrez le facteur d’échelle (redimensionnement) x et y. Dans ce cas, 0,25 a été choisi pour les deux.

  4. Tracer une ligne en provenance de la sortie de l’image webcam vers l’entrée de la fonction « Resize ». Une connexion s’affiche pour indiquer que la sortie de la caméra est envoyée à l’entrée de redimensionnement.

  5. Cliquez sur le bouton « Preview » sur l’opération « Resize ». L’image plus petite sera affichée à côté de l’image originale plus grande. Vous devrez peut-être faire défiler horizontalement pour voir les deux comme indiqué.

  6. Enfin, cliquez sur le bouton « Preview » la source de la webcam, pour fermer celle-ci, car il n’y a aucune raison de regarder à la fois la grande image et la petite image en même temps.

Rechecher uniquement les parties jaunes de l’image

../../../../_images/find-only-the-yellow-parts-of-the-image.png

L’étape suivante consiste à supprimer tout pixel de l’image qui ne correspond pas à la teinte de jaune du morceau de plastique choisi. Pour ce faire, le seuillage HSV est choisi pour définir les limites supérieure et inférieure des valeurs HSV, permettant d’isoler les pixels à inclure dans l’image binaire résultante. Notez que la cible est blanche tandis que tout pixel ne satisfaisant pas le seuillage sera en noir. Comme précédemment :

  1. Écrivez HSV dans la zone de recherche pour trouver l’opération HSV Threshold.

  2. Cliquez sur l’opération dans la palette et elle apparaîtra à la fin du pipeline.

  3. Connectez la prise dst (sortie) de l’opération de redimensionnement à l’entrée de HSV Threshold.

  4. Activez Preview sur HSV Threshold pour que le résultat de l’opération s’affiche dans la fenêtre d’aperçu.

  5. Ajustez les paramètres Teinte, Saturation et Valeur (Hue, Saturation, Value), pour que seulement l’objet cible soit affiché dans la fenêtre d’aperçu.

Limiter l’effet des éléments extérieurs

../../../../_images/get-rid-of-the-noise.png

Cela semble bien jusqu’à présent, mais parfois il y a du bruit provenant d’autres objets qui ne peuvent pas être complètement filtrées. Une technique pour réduire la détection de ces pixels occasionnels, qui s’avèrent être du bruit, consiste à effectuer une opération d’érosion. L’érosion supprimera les petits groupuscules de pixels qui ne font pas partie de la zone d’intérêt.

Masquer uniquement la zone jaune de l’image d’origine

../../../../_images/mask-just-the-yellow-area.png

Ici, une nouvelle image est générée en prenant l’image d’origine et en la masquant avec les résultats de l’érosion. Cela ne laisse que le carton jaune comme on le voit dans l’image d’origine avec rien d’autre. Ceci permet de visualiser facilement ce qui devait être trouvé, par l’entremise de la série de filtres dans notre pipeline.

Trouver la zone jaune (blob)

../../../../_images/find-the-yellow-area.png

La dernière étape consiste en fait à détecter la carte jaune à l’aide d’un détecteur de Blobs. Cette opération recherche un regroupement de pixels ayant une surface minimale. Dans ce cas, les seuls pixels non noirs proviennent de la carte jaune une fois le filtrage effectué. Vous pouvez voir qu’un cercle est dessiné autour de la partie détectée de l’image. Dans la version finale de GRIP (surveillez les mises à jour durant la saison), vous pourrez envoyer des paramètres sur le blob détecté à votre programme de robot en utilisant les NetworkTables.

Statut du GRIP

Comme vous pouvez le voir sur cet exemple, il est très facile et rapide de pouvoir faire une reconnaissance d’objet simple à l’aide de GRIP. Bien qu’il s’agisse d’un exemple très simple, il illustre les principes de base de l’utilisation de GRIP et de l’extraction de fonctionnalités en général. Au cours des prochaines semaines, l’équipe du projet publiera des mises à jour sur GRIP à mesure que de nouvelles fonctionnalités seront ajoutées. Actuellement, GRIP prend en charge les caméras (caméra Ethernet Axis et caméras Web) et les entrées d’image. Il n’y a pas encore de disposition pour la sortie bien que NetworkTables et ROS (Robot Operating System) soient prévus.

Vous pouvez soit télécharger une version prédéfinie du code à partir de la section «Releases» de la page GitHub (https://github.com/WPIRoboticsProjects/GRIP) ou vous pouvez cloner le référentiel source et le créer vous-même. Les instructions sur la construction de GRIP sont sur la page du projet. Il existe également une documentation supplémentaire sur le wiki du projet.

Alors, utilisez GRiP et faites nous part de vos commentaires ici sur le forum. Si vous trouvez des bogues, vous pouvez les publier ici ou en tant que problème de projet GitHub sur la page du projet.