Accueil du site > Programmation > Étiquetage des composants connectés et segmentation des couleurs avec (...)

Étiquetage des composants connectés et segmentation des couleurs avec CMVision 1.2

samedi 14 mars 2009, par Pierre-Luc Bacon

Toute équipe qui doit embarquer une caméra sur son robot doit le faire à tout coup. Implanter un algorithme effiace d’étiquetage des régions de couleurs (aka "connected component labeling") est souvent une étape complexe qui, si mal réalisée peu entraîner des délais de traitement beaucoup trop important. Un choix s’impose alors : tenter une solution "maison" ou utiliser une solution libre déjà disponible.

OpenCV est souvent choisi dans ce cas. Bien que très perfectionnée, OpenCV a peut-être trop à offrir quand vient le temps d’implanter une solution simple pour un système aux ressources limitées.

CMVision (c++) s’avère être un choix tout indiqué pour répondre au besoin précis d’étiquetage des régions de couleurs. Réalisé par des étudiants du MIT dans le cadre de Robocup, cette librairie utilise plusieurs algorithmes performants pour réaliser cette opération. Les couleurs sont d’abord détectées par un algorithme de seuillage ordinaire à la différence près qu’une astuce permet de déterminer si un pixel appartient à une classe de couleur (jusqu’à 32) en une seule opération binaire plutôt qu’en procédant à 6 comparaisons logiques requises par l’approche "naïve". L’image seuillée est ensuite encodée en séries de pixels adjacents et analysée dans un algorithme de type Union- Find implanté sous forme de listes chaînées.

Utilisation

Un seul constructeur est fourni dans la version 1.2 pour un objet de type "CMVision".

L’utilisateur devra ensuite fournir d’autres paramètres d’initialisation manuellement :

et

Ces méthodes sont celles qui devront le plus souvent être appelées. loadOptions() prend en argument le nom d’un fichier qui contient une liste de seuils pour chacune des couleurs à détecter. Il est formaté comme suit :

La section "colors" contient le triplet RGB associé à la couleur (utile pour le debugging ou pour la partie GUI), la valeur "merge" (non utilisée ici), et un identifiant texte. La section threshold contient quand à elle les seuils min et max pour chacun des 3 canaux de couleur.

Une fois ces quelques méthodes executées, nous sommes déjà en mesure d’effectuer le traitement sur l’image :

Cette méthode est surchargée pour supporter plusieurs arrangement en mémoire possibles de l’image :

image_pixel est un format pré-défini dans cmvision.h qui, selon le "define" utilisé au moment de la compilation, sera défini comme une de ces structures :

Dans la plupart des applications, il sera plus simple de fournir une image de type "unsigned" où chaque pixel est défini un après l’autre par 3 valeurs de canaux consécutives.

Si l’image contient un certains nombre de régions de couleurs tel que précisé dans le fichier de configuration, getRegions() permettra de les acquérir via un pointeur de type "region".

où color_id et le numéro associé à la couleur définie dans le fichier de configuration (la numération est automatique par ordre de définition).

indiquera le nombre de régions détectées.

Le type région est défini ainsi :

Connaissant le nombre de couleurs ainsi que le nombre de régions d’après numRegions(). nous pourrions alors exécuter une boucle pour afficher les informations de la structure "region" pour chaque composant détecté.

Finalement,

peut s’avérer utile pour visualiser les pixels détectés dans la phase de seuillage. Un fichier ppm sera alors créé où chaque pixel prendra la valeur de son identifiant de couleur.

Il n’existe pas de documentation officielle pour la librairie CMVision-1.2. Ainsi, les méthodes présentées ici ne représentent pas réellement toutes celles disponibles. La lecture de cmvision.h suffira bien souvent pour comprendre le fonctionnement de ces autres méthodes.

Exemple

L’exemple suivant utilise les méthodes décrites plus haut de CMVision-1.2, la classe VideoInput, ainsi que les librairies SDL et SDL-gfx (sudo apt-get install libsdl-gfx1.2-dev).

Une fenêtre SDL affichera en temps réel les images capturées par la caméra, les pixels seuillés, et les régions d’intérêts détectées.

Le code de ce programme est disponible au bas de cette page. Pour le compiler, il suffira d’exécuter "make" dans le dossier créé après décompression de l’archive.

Documents joints

Enregistrer au format PDF
Marquer cet article: Delicious Technorati

Répondre à cet articleRépondre à l'auteur:Pierre-Luc BaconRecommander à un ami