Les images obtenues par la caméra sont filtrées pour mettre en évidence un objet grâce à ses caractéristiques (couleurs ou géométrie). On apprécie la distance caméra-objet au moyen d'un calibrage préalable. La position de l'objet dans le plan image de la caméra et la distance caméra-objet permettent de calculer les angles de rotation à appliquer aux servomoteurs pour que l'objet et l'axe optique de la caméra soient alignés. La scène comprenant la caméra, les servomoteurs et l'objet est reconstituée simultanément dans un espace en trois dimensions.
On cherche à détecter un objet sphérique de couleur jaune. La bibliothèque OpenCV nous permet d'effectuer tous les traitements nécessaires : on convertit l'image RGB obtenue dans un espace HSV pour s'affranchir de la luminosité puis on binarise l'image en ciblant le jaune. L'image obtenue ressemble à une tâche noire sur fond blanc (et non l'inverse : ceci en prévision des traitements à venir qui se font sur les pixels noirs plutôt que sur les blancs).
Il se peut que la couleur recherchée apparaisse dans d'autres points de l'image qui ne correspondent pas à l'objet. Ces parasites peuvent être éliminés grâce à une ouverture morphologique qui consiste en une succession de deux opérateurs morphologique : une érosion et une dilatation. On obtient une seule et unique surface correspondant à l'objet à détecter.
Le barycentre de la surface obtenue peut être assimilé au centre de l'objet, il est obtenu par la moyenne des coordonnées de chacun des points équi-pondérés de la surface. La distance caméra-objet peut être obtenue soit par une calibration de la caméra, soit en calculant le diamètre de la surface et en le comparant à des mesures préalables. Cette dernière méthode est plus facile à mettre en place mais la précision est moindre et les distortions de l'image dûes aux paramètres intrinsèques de la caméra ne sont pas prise en compte. Les coordonnées 3D de l'objet ainsi approximées seront moins précises.
La caméra est montée sur deux servomoteurs, Pan et Tilt. Les servomoteurs sont pilotés au moyen de la carte de contrôle de servomoteurs SSC-32 de la société LYNXMOTION. La communication se fait par le port Série suivant le protocole RS-232. Elle est très rapide, 155 200 bauds et la commande est précise à 1µS/0.09°.
L'écriture sur le registre du port Série en C est très fastidieuse aussi ai-je préféré utiliser le langage Python qui dispose d'un module dédié. Le programme (en C) d'acquisition des images et de calcul des coordonnées transmet les données au programme Python par sockets. Ce dernier formate une chaîne de caractères et l'écrit sur le registre du port Série. Le microcontrôleur de la carte saura l'interpréter.
La commande des servomoteurs est une commande PWM : le temps d'état haut détermine l'angle à adopter. Les coordonnées reçues du programme d'acquisition servent à calculer un angle de rotation qui est converti en millisecondes. Par exemple, « 1500 millisecondes » correspond à 0°, c'est-à-dire la position médiane du servomoteur.
La chaîne envoyée à la carte de contrôle est formatée comme suit : « # Numéro-servo PAngle SVitesse-de-rotation ». L'exemple précédent donnera : « # 1P1500 S750 » pour une vitesse moyenne.
Parallèlement, les coordonnées 3D de l'objet et les mesures des angles de rotation des servomoteurs sont envoyées à un dernier programme qui modélise la scène. L'association des bibliothèques OpenGL et SDL en C permet de dessiner simplement des objets 3D texturés. Cependant, la reconstitution doit être la plus rapide possible car l'acquisition et les divers calculs sur les images sont plus rapides que le calcul de la scène. L'aspect temps réel dépend de la synchronisation des programmes.
Back to top