Nous avons développé des scripts sous MATLAB pour automatiser le pointage des vidéos et obtenir les courbes expérimentales.
Nous travaillons avec des vidéos de dimensions 480x320 afin de ne pas dépasser la capacité de la mémoire vive de l’ordinateur effectuant les calculs.
Chaque script commence par une lecture des vidéos et l’enregistrement de chaque frame dans une matrice en 4 dimensions. Très rapidement, ces matrices sont réduites le plus possible pour ne conserver que les zones pertinentes de la vidéo. Cela est possible facilement car nous travaillons à protocole d’acquisition constant ; les zones du mouvement sont donc toujours identiques d’une vidéo à l’autre. Ensuite, on réduit d’une dimension la matrice en transformant les images couleurs en nuances de gris. A partir de cette étape les deux scripts divergent.
Concernant la translation, on génère une matrice contenant l’arrière plan de l’image, que l’on soustrait à la matrice du mouvement. Ainsi on arrive à isoler seulement les objets en mouvement dans les images. On calcule la valeur seuil sur le résultat de la soustraction grâce à la méthode d’Otsu puis on seuille l’image afin d’obtenir une image binaire. Cette image contient alors des zones de pixels blancs sur fond noir. On garde la zone la plus grande sur chaque image et on récupère les coordonnées de son centre. Ses coordonnées nous renseignent directement sur le mouvement du pendule : c’est la composante verticale qui est affichée sur la courbe. Le pointage des vidéos de translation est plutôt simple et a fourni rapidement d’assez bon résultats.
Pour la rotation, le procédé est plus complexe et a demandé beaucoup plus de temps et de travail avant de fournir des résultats intéressants. Le principe reste le même que pour le pointage manuel. Il faut récupérer les coordonnées des points noirs sous la canette afin de calculer l’angle par rapport à l’axe des abscisses.
Le traitement appliqué à la translation ne convient pas dans ce cas car les points se déplacent trop rapidement d’une frame à l’autre, ce qui conduirait à l’apparition de plusieurs images des points une fois la soustraction faite. Après avoir essayé plusieurs voies, nous avons conclu qu’il fallait tout d’abord isoler la canette du reste de l’image. Pour cela, nous utilisons la fonction de détection de cercles sous MATLAB. Une fois le cercle de chaque image détecté, nous créons un masque qui sélectionne seulement les pixels à l’intérieur du cercle. Il est maintenant théoriquement plus simple de détecter les points noirs dans cette zone réduite. Concrètement, cela reste problématique à cause des conditions d’acquisition des vidéos. En effet, la canette se déplace dans la profondeur de l’image ce qui entraîne la variation de la taille des points ainsi que la variation de l’éclairage sur l’objet.
Finalement, on effectue un seuillage adapté à chaque frame sans prendre en compte les pixels en dehors du cercle (coloré en blanc 255) pour isoler les points noirs. Ensuite on procède de manière analogue à la translation en détectant les deux plus gros objets dans l’image binaire. On différencie chaque point selon un critère de moindre déplacement. Ainsi, on peut créer un vecteur correspondant à ces deux points et remonter à l’angle séparant ce vecteur de l’axe horizontal. On peut tracer l’évolution de cet angle avec le temps. On obtient :
Figure n° 1 : Evolution de l’angle en fonction du temps sans traitement de périodicité
Le graphe obtenu est pour le moins illisible et cela est dû au traitement qui renvoie uniquement un angle compris entre -𝝅 et +𝝅. Or la valeur intéressante pour notre étude est le cumul de l’angle lors de la rotation. En effet lorsque le pendule tourne sur lui-même, il peut effectuer plusieurs tours ce qui correspond à des multiples de 2𝝅. Ainsi il faut prendre en compte cette correction de continuité pour obtenir une évolution pertinente de l’angle. Ainsi après de nombreux essais, on obtient :
Figure n° 2 : Evolution de l’angle en fonction du temps avec traitement de périodicité
Nous avons développé un troisième script pour pouvoir comparer nos résultats expérimentaux avec les prédictions de notre modèle. Ce script utilise les pulsations mesurées expérimentalement pour tracer les courbes théoriques. Les valeurs d’amplitude sont adaptées aux mesures pour avoir la meilleure correspondance possible.
Ces outils nous ont permis d’obtenir les courbes associées aux mouvements. Pour chaque acquisition nous avons édité 3 figures :
Figure n°3 : Evolution théorique et pratique de l’altitude en fonction du temps pour un effet Wilberforce
Ces courbes nous permettent d’avoir une confrontation visuelle rapide entre les prédictions du modèle et les résultats de l’acquisition. Pour obtenir ce résultat nous avons dû trouver la meilleure origine des temps possibles pour que le qu’il y ait une bonne correspondance entre les deux courbes. Cette origine des temps se trouve par tâtonnement après l’exploitation de la vidéo.
Les courbes théoriques sont adaptées au type de mouvement à pointer. L’utilisateur a le choix entre un mouvement symétrique, antisymétrique ou un effet Wilberforce.
Une fois les courbes du mouvement obtenues, nous effectuons une transformée de Fourier discrète de ce signal. Cela nous permet d’identifier les fréquences des oscillations sinusoïdales présentes dans le mouvement global. C’est une mesure quantitative des modes propres du système ainsi que de la valeur des pulsations associées. De plus, cela nous permet de conclure sur la validité de nos expériences en projection sur les modes propres. On pourra s’assurer, ou non, qu’il y a une seule fréquence non nulle présentes dans le signal obtenu. Voici une analyse fréquentielle d’une rotation avec un effet Wilberforce :
Figure n°4 : Analyse fréquentielle du mouvement de rotation pour un effet Wilberforce
On peut remarquer que le rendu n’est pas parfait et que de nombreux points aberrants subsistent, notamment au début de l’acquisition. Ces points sont symptomatiques de la limite de nos conditions d’acquisition. En effet, ces points apparaissent toujours au début du mouvement car c’est à ce moment que le mouvement vertical est le plus prononcé. Ainsi pendant ces premiers instants, la canette peut se situer à de grandes distances de la caméra. Aux faibles résolutions de travail, les points sur la canette ne représentent que quelques pixels sur l’image et il devient difficile de les distinguer du bruit ambiant de l’image. En toute rigueur, ces conditions de détection nécessitent de travailler à plus grandes résolutions. Néanmoins, cela a un impact néfaste sur le temps d’exécution du programme ainsi que sur la mémoire vive utilisée.
L’éclairage a aussi posé problème dans cette expérience. La source lumineuse placé au sol ne permettait pas d’avoir un éclairage homogène sur la face inférieure à tout instant. Lorsque la canette était à son altitude maximum, le cercle apparaît plutôt sombre alors qu’il apparaît très lumineux à l’altitude minimum. Ce hétérogénéité d’éclairage a ajouté une contrainte dans le développement du script mais qui a été gérée de manière satisfaisante.
Si vous souhaitez, vous aussi, effectuer des acquisitions en vue d'un traitement automatisé, voici un protocole qui pourrait vous aider.
Cadre d’acquisition
Marquage du prototype