Ce morceau de code utilise OpenCV pour détecter la position d'un marqueur dans chaque image capturée par le périphérique vidéo. Sur la base des dimensions physiques du marqueur, cela pose également une estimation. Pour chaque marqueur défini, les données sont disponibles via UDP, sous forme de texte brut. Il renvoie la translation de rotation de l'objet par rapport à la caméra, et les coordonnées XY du barycentre 2D de l'objet apparaissant sur l'image de la caméra. Si un marqueur n'est pas visible, les nombres renvoyés seront un NaN.
Veuillez noter que ce code n'utilise PAS d'informations temporelles pour le suivi.
Au lieu de cela, il essaie de détecter le marqueur et d'estimer sa pose dans chaque image capturée.
.ini
. Vous avez besoin d'un environnement Python standard avec cv2
et des modules numpy
disponibles. Bien que le code ait été développé à l'aide de Python 2.7 et OpenCV 3.4.1 sur un Mac, il devrait également fonctionner avec Python 3 et d'autres plates-formes. Voici quelques étapes pour créer un marqueur : 1., Prenez une photo de votre objet et recadrez-la. Idéalement, la résolution doit être compatible avec votre appareil photo. 2. Modifiez le fichier de configuration et assurez-vous qu'il contient les lignes suivantes :
[General]
Vous pouvez laisser à peu près tout pareil dans la section générale, mais vous devrez calibrer votre appareil photo ! Découvrez comment calibrer ici. Lors de l'ajout d'un nouveau marqueur, vous devrez affiner les paramètres, alors assurez-vous que l'image de la caméra sera visible.
camera_show_picture = 1
Sinon, un nouveau marqueur est ajouté en tant que nouvelle section dans le fichier de configuration.
L'en-tête est le nom convivial du marqueur
[My custom marker]
Spécifiez le nom du fichier et les dimensions physiques du marqueur :
marker_file_name = <File name in the same directory or full path>
marker_width = <Units are in mm.>
marker_height = <Units are in mm.>
Lors de la configuration d'un nouveau marqueur, vous devrez modifier les paramètres suivants :
marker_minimum_matching_distance = <Decrease it from 50>
marker_minimum_number_of_matches = <Set this to at least 4>
pose_estimation_running_average = <more than 1>
La marker_minimum_matching_distance
est inversement proportionnelle à la qualité de la correspondance des caractéristiques entre l'image du marqueur et la caméra. Si la valeur est trop élevée, les entités situées à l'extérieur du marqueur seront mises en correspondance, et si la valeur est trop basse, aucune correspondance ne sera effectuée du tout.
Le marker_minimum_number_of_matches
est requis pour l’estimation de la pose. Au moins 4 points correspondants sont nécessaires pour calculer les coordonnées translation
et les angles rotation
. Cependant, plus la transformation nécessite de correspondances, plus l’estimation sera précise. Si la valeur est trop élevée, l’estimation de pose ne fonctionnera que dans une poignée d’images.
Enfin, pose_estimation_running_average
définit le nombre de données de position de trames qui doivent être moyennées. Augmentez ce nombre si les positions renvoyées sont trop « saccadées ». Cependant, plus il y a de trames moyennées ensemble, plus le décalage sera important.
De plus, chaque canal colour
peut être n'importe quel nombre naturel compris entre 0
et 255
. Les éléments marker_feature_colour_*
permettent d'afficher l'emplacement des correspondances de bonne qualité entre l'image du marqueur et l'image de la caméra. Les paramètres marker_indicator_colour_*
déterminent la couleur d'un seul indicateur, qui affiche les coordonnées calculées par les valeurs moyennes des correspondances affichées. Idéalement, cet indicateur devrait toujours être à l'intérieur du marqueur et est renvoyé dans le paquet UDP en tant que centroid
.
marker_feature_colour_R = <0...255>
marker_feature_colour_G = <0...255>
marker_feature_colour_B = <0...255>
marker_indicator_colour_R = <0...255>
marker_indicator_colour_G = <0...255>
marker_indicator_colour_B = <0...255>
python tracker_main.py
Bonne chance!