Brevet FR2733338A1 — publié le 19961025

La présente invention concerne un procédé d'obtention d'un mouvement de type solide indéformable d'un ensemble de marqueurs disposés sur des éléments anatomiques, notamment du corps humain. L'obtention de ce mouvement consiste à enregistrer le mouvement de l'élément anatomique du sujet considéré, puis à transformer les images enregistrées en données exploitables. Le résultat de ces transformations peut être utilisé pour étudier notamment le comportement mécanique du corps humain au cours de ses évolutions, particulièrement dans le domaine de la robotique anthropomorphique, ou pour étudier les mouvements de la peau et des masses musculaires par rapport aux structures osseuses rigides au cours de différents mouvements du sujet. Ces résultats peuvent également être utilisés dans le domaine médical pour déterminer le caractère pathologique d'un mouvement en comparaison d'un mouvement sain, ou dans le domaine de l'étude des mouvements respiratoires par l'observation des variations de volume de la cage thoracique, et d'une manière générale dans le domaine de la biomécanique c'est-à-dire de l'étude des mouvements d' éléments anatomiques. Pour l'enregistrement du mouvement, des marqueurs sous forme de pastilles visibles par des caméras peuvent être placés de manière externe sur la peau de l'élément anatomique du sujet, mais aussi de manière interne dans cet élément. Le sujet évolue ensuite devant plusieurs caméras qui enregistrent les trajectoires spatiales discrètes de ces marqueurs de manière aussi précise que possible. Les séquences d'images ainsi obtenues sont ensuite traitées numériquement pour exprimer les coordonnées des différents marqueurs considérés dans un même repère et permettre les différents calculs conduisant à l'obtention du mouvement de type solide indéformable. L'enregistrement du mouvement de l'ensemble des marqueurs considérés devrait correspondre au mouvement de type solide indéformable des structures osseuses rigides de l'élément anatomique considéré. Or, en pratique, les mouvements des marqueurs ne sont pas directement représentatifs du mouvement des structures osseuses. En effet, les masses molles que constituent les muscles, la peau et de manière générale les tissus mous ou certaines structures anatomiques sur lesquelles sont positionnés les marqueurs, se déplacent par rapport aux structures osseuses au cours du mouvement, de sorte que le mouvement enregistré est différent du mouvement qu'auraient les marqueurs s'ils étaient liés rigidement à ces structures osseuses. Les mouvements parasites des marqueurs qui en résultent viennent notablement réduire la précision de l'enregistrement du mouvement en ce qui concerne son caractère solide indéformable, et donc les possibilités d'exploitation des données expérimentales ainsi obtenues. La présente invention vise à remédier à cet inconvénient majeur. Elle a pour but de déterminer une configuration de référence de type solide indéformable de l'ensemble des marqueurs considérés, pouvant être utilisée sur la totalité du mouvement considéré. Cette configuration de référence permet d'épurer les mouvements des marqueurs préalablement enregistrés, des perturbations dues aux déplacements des tissus mous ou des structures anatomiques mobiles du sujet sur lesquels sont positionnés les marqueurs, afin de rendre le mouvement enregistré conforme au mouvement d'ensemble de type solide indéformable qu'auraient les marqueurs s'ils étaient liés rigidement aux structures osseuses du sujet. A cette fin, le procédé qu'elle concerne consiste 1) à placer au moins trois marqueurs sous forme de pastilles sur ou dans l'élément anatomique du sujet, les marqueurs étant visibles par des caméras appropriées 2) à faire évoluer le sujet devant les caméras 3) à enregistrer les trajectoires spatiales discrètes de ces marqueurs 4) à traiter numériquement les images de l'enregistrement du mouvement de manière à exprimer au cours du temps les coordonnées des différents marqueurs dans un même repère et à obtenir des trajectoires permettant le bon déroulement des différentes étapes du procédé 5) à choisir un sens de parcours de l'enregistrement du mouvement 6) à sélectionner une séquence d'images successives de l'enregistrement du mouvement, et à la positionner à l'extrémité initiale de l'enregistrement du mouvement spécifiée par le sens de parcours 7) à déterminer les trois marqueurs non alignés les plus stables en position les uns par rapport aux autres, sur l'ensemble de la séquence d'images sélectionnée 8) à classer les trois marqueurs déterminés à l'étape 7 selon un ordre de stabilité décroissante, établie sur l'ensemble de la séquence d'images sélectionnée, des angles du triangle dont ils constituent les sommets 9) à affecter à l'image située au centre de cette séquence, ainsi qu'aux images correspondant à la première moitié de la séquence lorsque celle-ci est située à l'extrémité initiale de l'enregistrement du mouvement et aux images correspondant à la deuxième moitié de la séquence lorsque celle-ci est située à l'extrémité finale de l'enregistrement du mouvement par rapport au sens de parcours, les trois marqueurs déterminés à l'étape 7 et classés à l'étape 8 10) à décaler la séquence d'une image dans le sens de parcours de l'enregistrement du mouvement 11) à répéter les opérations des étapes 7 à 9, puis 10 jusqu'à ce qu'il ne soit plus possible d'effectuer une nouvelle opération de l'étape 10, la séquence d'images étant alors située à l'extrémité finale de l'enregistrement du mouvement par rapport au sens de parcours ;; 12) à choisir un sens de parcours de l'enregistrement du mouvement 13) à sélectionner une séquence d'images successives de l'enregistrement du mouvement dont la taille est de préférence plus grande que celle de la séquence sélectionnée à l'étape 6, de l'ordre de trois fois plus grande, et à la positionner à l'extrémité initiale de l'enregistrement du mouvement spécifiée par le sens de parcours 14) à calculer par dénombrement sur les images de cette séquence les fréquences de tous ou d'une partie seulement des marqueurs, de préférence uniquement ceux ayant été affectés, selon les opérations de l'étape 9, aux images recouvertes par la séquence 15) à affecter à chaque marqueur considéré à l'étape 14 un poids égal au rapport entre sa fréquence et la somme de toutes les fréquences calculées à l'étape 14 16) à ajouter à l'ensemble des marqueurs considérés, à l'image située au centre de la séquence ainsi qu'aux images correspondant à la première moitié de la séquence lorsque celle-ci est située à l'extrémité initiale de l'enregistrement du mouvement et aux images correspondant à la deuxième moitié de la séquence lorsque celle-ci est située à l'extrémité finale de l'enregistrement par rapport au sens de parcours, un marqueur fictif dont la position est le barycentre des positions des marqueurs considérés à l'étape 14, affectés de leurs poids calculés à l'étape 15 17) à décaler d'une image la séquence dans le sens de parcours de l'enregistrement du mouvement 18) à répéter les opérations des étapes 14 à 16, puis 17 jusqu'à ce qu'il ne soit plus possible d'effectuer une nouvelle opération de l'étape 17, la séquence d'images étant alors située à l'extrémité finale de l'enregistrement du mouvement par rapport au sens de parcours 19) à choisir un sens de parcours de l'enregistrement du mouvement 20) à sélectionner une séquence d'images successives de l'enregistrement du mouvement dont la longueur est de préférence égale à celle de la séquence sélectionnée à l'étape 6, et à la positionner à l'extrémité initiale de l'enregistrement du mouvement spécifiée par le sens de parcours ; 21) à considérer les trois marqueurs, déterminés à l'étape 7, de l'image située au centre de la séquence dans l'ordre où ils ont été classés à l'étape 8 22) à construire de manière analogue pour toutes les images recouvertes par la séquence un repère orthonormé direct de la manière suivante : l'origine est le premier marqueur des trois marqueurs considérés à l'étape 21, le vecteur premier axe du repère est le vecteur unitaire colinéaire au vecteur ayant pour origine le premier marqueur et pour extrémité le second marqueur, le vecteur troisième axe du repère est le vecteur unitaire colinéaire au vecteur obtenu par produit vectoriel du vecteur premier axe du repère et du vecteur ayant pour origine le premier marqueur et pour extrémité le troisième marqueur, le vecteur deuxième axe du repère étant le vecteur unitaire obtenu par produit vectoriel du vecteur troisième axe et du vecteur premier axe ; 23) à translater, à chaque image recouverte par la séquence, l'origine du repère construit à l'étape 22 en la position du marqueur fictif calculée à l'étape 16 ;; 24) à exprimer, à chaque image recouverte par la séquence, les coordonnées des marqueurs considérés dans le repère issu des opérations effectuées aux étapes 22 et 23 25) à calculer, sur la totalité des images recouvertes par la séquence, la configuration spatiale de référence de type solide indéformable de l'ensemble des marqueurs considérés par une opération de moyenne des coordonnées de ces marqueurs calculées à l'étape 24 26) à identifier, à l'image située au centre de la séquence, ainsi qu'aux images correspondant à la première moitié de la séquence lorsque celle-ci est située à l'extrémité initiale de l'enregistrement du mouvement et aux images correspondant à la deuxième moitié de la séquence lorsque celle-ci est située à l'extrémité finale de l'enregistrement du mouvement par rapport au sens de parcours, le repère dans lequel les coordonnées moyennes des marqueurs considérés calculées à l'étape 25 sont exprimées, qui est la trace sur la séquence d'images de tous les repères considérés à l'étape 24, avec le repère issu des opérations effectuées aux étapes 22 et 23 à l'image considérée 27) à décaler la séquence d'une image dans le sens de parcours de l'enregistrement du mouvement 28) à répéter les opérations des étapes 21 à 26, puis 27 jusqu'à ce qu'il ne soit plus possible d'effectuer une nouvelle opération de l'étape 27, la séquence d'images étant alors située à l'extrémité finale de l'enregistrement du mouvement par rapport au sens de parcours ;; 29) à substituer les nouvelles trajectoires des marqueurs considérés, sommets des configurations de référence de type solide indéformable de la totalité des étapes 25 effectuées précédemment, issues des opérations de la totalité des étapes 26 effectuées précédemment, aux trajectoires des marqueurs de l'enregistrement du mouvement considéré à l'étape 5 ; 30) à éliminer, pour chaque image de l'enregistrement du mouvement, le marqueur fictif introduit à l'étape 16 31) à augmenter progressivement les tailles des séquences d'images considérées aux étapes 6, 13 et 20 ;; 32) à répéter les opérations des étapes 5 à 30, puis 31 jusqu'à obtenir des tailles de séquences d'images toutes égales à la taille de l'enregistrement du mouvement considéré, de préférence dès la première répétition, la dernière séquence des étapes 5 à 30 s'effectuant avec des séquences d'images de la taille de l'enregistrement du mouvement considérer. La sélection de séquences d'images relativement courtes aux étapes 6,13 et 20 par rapport à la séquence d'images décrivant la totalité de l'enregistrement du mouvement considéré, lors des premières répétitions des étapes 5 à 30, permet non seulement de prendre en compte les éventuelles variations de la détermination des trois marqueurs les plus stables effectuée à l'étape 7, dues aux propriétés locales du mouvement considéré, mais aussi d'assurer la continuité horizontale du procédé par l'obtention à l'étape 25 d'une configuration spatiale moyenne de type solide indéformable des marqueurs considérés peu différente d'une image à l'autre de l'enregistrement du mouvement.La répétition du processus, réalisée à l'étape 32 avec des tailles de séquences d'images croissantes jusqu'à égaler celle de la séquence d'images décrivant la totalité de l'enregistrement du mouvement considéré, permet d'assurer la continuité verticale du procédé par l'obtention progressive, dite "solidification", de la configuration de référence de type solide indéformable valable sur la totalité de l'enregistrement du mouvement. Lors du dernier enchaînement des étapes 5 à 30, le calcul de moyenne des coordonnées des marqueurs à l'étape 25 s'effectue sur la totalité des images de l'enregistrement du mouvement considéré ; la configuration moyenne résultante est la configuration de référence de type solide indéformable de l'ensemble des marqueurs considérés pouvant être utilisée sur la totalité de l'enregistrement du mouvement. L'animation de cette configuration de référence par la succession des opérations des étapes 26 permet d'obtenir, à l'étape 29, des trajectoires de marqueurs correspondant aux trajectoires initiales des marqueurs considérées à l'étape 4, épurées des perturbations dues aux déplacements des tissus mous ou de certaines structures anatomiques mobiles du sujet, sur lesquels sont positionnés les marqueurs. Ces trajectoires sont les trajectoires des marqueurs considérés du mouvement conforme au mouvement d'ensemble de type solide indéformable qu'auraient les marqueurs s'ils étaient liés rigidement aux structures osseuses du sujet. De préférence, le procédé visé ci-dessus est mis en oeuvre par le programme informatique dont le code source est annexé à la présente description de l'invention, et fait partie intégrante de cette description. DESCRIPTIF DU PROGRAMME Les fichiers contenant les différentes variables, fonctions et procédures nécessaires à la compilation du programme sont exposés ci-dessous. Les fonctions et procédures contenues dans ces fichiers font l'objet d'un descriptif visant à expliciter succinctement leur rôle et fonctionnement dans le programme. Le programme est écrit en langage C. 1) FICHIER "MAKEFILE" Ce fichier est utilisé par le compilateur afin d'obtenir le code exécutable du programme appelé "SOLIDIFIE". Les principaux fichiers sources constituant la totalité du programme sont nommés : "VARIABLES.H", "SOLIDIFICATION. C", "INITIALISATION.C", "CALCUL.C" et "SAUVEGARDE. C". 2) FICHIER "VARIABLES.H" Dans une première partie, ce fichier contient les bibliothèques C prédéfinies "STDIO.H", "STRING.H" et "MATH.H" dont l'adjonction au programme est nécessaire à son fonctionnement. Dans une deuxième partie, les constantes, les types et les variables globales du programme sont déclarés. Un usage abondant des structures pointeurs est fait afin de gérer dynamiquement la mémoire de l'ordinateur pour rendre le programme adaptatif au problème considéré par l'utilisateur. 3) FICHIER "SOLIDIFICATION.C" Ce fichier contient le programme principal "MAIN". Dans une première partie, les différentes procédures utilisées dans le programme principal et définies dans d'autres fichiers sont déclarées. Ce programme principal permet d'enchaîner les différentes étapes du processus selon un ordonnancement correct. Il gère aussi certains choix laissés à l'utilisateur, tels que recommencer avec une autre partie des données du fichier courant ou avec un autre fichier de données. Une allocation dynamique de mémoire des composantes d'un tableau tampon de coordonnées de marqueurs, permettant d'éviter l'écrasement de données au cours du processus, est effectuée. 4) FICHIER "INITIALISATION.C" Ce fichier contient les différentes procédures d'initialisation des tables de données et paramètres nécessaires au fonctionnement du programme, à savoir - Procédure "Initialise~Nom~Fichier" : elle permet à l'utilisateur d'initialiser le chemin d'accès au répertoire de travail, ainsi que les noms des fichiers de données et de sauvegarde, d'extension respectives ".p3d" et ".sld" ; - Procédure "Initialise~Marqueurs" : elle permet l'initialisation du nombre d'images de l'enregistrement du mouvement, du nombre de marqueurs utilisés lors du protocole expérimental, de la table contenant les noms de ces marqueurs et de la table des trajectoires discrètes de ces marqueurs à partir du fichier de données d'extension ".p3d" dont le format est imposé par le type de machine d'analyse du mouvement utilisée.L'allocation dynamique de mémoire concernant les tables de noms et de trajectoire des marqueurs est effectuée ici. - Procédure "Initialise~Solide~Parametres" : elle permet à l'utilisateur d'initialiser la partie courante des données à traiter sous la forme d'un ensemble de marqueurs, parmi la totalité, appartenant à un même solide. Dans un premier temps, la mémoire de leur table de numéro d'ordre de lecture dans le fichier de données, ainsi que celle de la table d'indicateurs de sauvegarde des marqueurs appartenant au solide courant en fin de processus de "solidification", est allouée dynamiquement dans un deuxième temps ces tables sont initialisées par l'utilisateur.D'autres allocations dynamiques de mémoire concernant des tables nécessaires au fonctionnement du programme et relatives au solide considéré sont effectuées, ainsi que l'initialisation de paramètres ou de variables notamment par l'utilisateur en ce qui concerne la longueur de la séquence sur laquelle s'effectue le processus de solidification lors de la première étape. - Procédure "Initialise~Etape~Suivante" : la re-initialisation de variables ou paramètres s'effectue ici afin de permettre le bon déroulement de la deuxième étape du processus de solidification ; des désallocations mémoires de certaines tables s'effectuent ici pour les mêmes raisons. 5) FICHIER "CALCUL.C" Ce fichier contient les fonctions et procédures de calcul concernant le processus de solidification proprement dit, autrement dit les algorithmes principaux du procédé, à savoir - Fonction "Norme" : elle renvoie la norme euclidienne du vecteur tridimensionnel passé en argument ; - Procédure "Produit~Vectoriel" : elle effectue le produit vectoriel V3=Vl^V2 sur les vecteurs tridimensionnels passés en argument ; - Fonction "Moyenne" : elle renvoie la moyenne de données contenues dans la table "Pointeur~Réel" passée en argument, calculée de l'indice Numéro jusqu'à l'indice Numéro+Intervalle-l - Fonction "Ecart~Type" : elle renvoie l'écart-type non biaisé de données de manière analogue à la fonction moyenne ; - Procédure "Determine~Meilleurs~Triangles" ; elle effectue l'initialisation de la table contenant les inter-distances des marqueurs du solide courant tout au long du mouvement, ainsi que le paramètre "Delta~Indice", alloue dynamiquement la mémoire d'une table d'indices de trois marqueurs, puis initialise cette table en déterminant les trois marqueurs ayant globalement les inter-distances les plus stables à l'aide de critères adimensionnels calculés au voisinage de l'image considérée - Procédure "Classe~Marqueurs~Triangles" : elle classe à chaque image les trois marqueurs déterminés par la procédure précédente selon un critère adimensionnel d'indéformabilité angulaire, calculé au voisinage de l'image considérée - Procédure "Calcule~Trajectoire~Reference" : elle calcule la trajectoire de référence d'un marqueur fictif additionnel selon un procédé barycentrique, dont la pondération s'effectue à l'aide d'un rapport de fréquences de choix des marqueurs stables au voisinage de l'image considérée, et stocke cette trajectoire à la première position de la table contenant les trajectoires des marqueurs ; - Procédure "Calcule~Repere~Inverse" : elle calcule à l'image considérée la partie rotation de la matrice homogène correspondant à la transformation de passage du repère absolu au repère relatif calculé à partir de trois marqueurs dont les indices sont spécifiés par le paramètre "Indice~Triangle" et pris dans la table contenant les marqueurs stables déterminés et classés à l'aide des procédures précédemment exposées ; - Procédure "Solidifie~Marqueurs" : elle calcule, sur la séquence de solidification centrée sur l'image considérée, la configuration moyenne solide des marqueurs fictifs correspondant aux marqueurs du solide courant par une opération de moyenne de leurs coordonnées exprimées dans des repères relatifs construits de manière analogue et spécifiée par le paramètre "Indice~Triangle" - Procédure "Calcule~Coordonnees~Marqueurs~Fictifs" : elle calcule à l'image considérée et spécifiée par les paramètres "Indice~Triangle" et "Indice~Image", les coordonnées absolues exprimées dans le repère fixe des marqueurs fictifs constituant la configuration moyenne solide déterminée à l'aide de la procédure précédente ; le stockage a lieu dans le tampon de coordonnées des marqueurs, afin d'éviter l'écrasement de données dans la table contenant les trajectoires des marqueurs encore utiles au processus. 6) FICHIER "SAUVEGARDE.C" Ce fichier contient les procédures permettant la mise à jour au cours du processus de la table contenant les trajectoires des marqueurs, la sauvegarde globale de ces trajectoires en fin de processus, et les procédures principales de désallocation mémoire, à savoir - Procédure "Actualise~Marqueurs" : elle permet l'actualisation de la table contenant les trajectoires des marqueurs à une image donnée, spécifiée par le paramètre "Indice-Image", à partir des coordonnées absolues des marqueurs constituant la configuration moyenne solide préalablement obtenue par solidification et stockée dans la table tampon de coordonnées des marqueurs ; cette actualisation s'effectue à partir du programme principal "MAIN" avec un temps de retard sur le processus de solidification en cours, afin d'éviter l'écrasement de données utiles - Procédure "Sauve~marqueurs" : elle permet de sauver les trajectoires finales des marqueurs du solide considéré, spécifiées par un indice de sauvegarde égal à 1, dans le fichier de sauvegarde d'extension ".sld", dont le format arbitraire est décidé ici ; - Procédure "Libere~Memoire~Solide~Parametre" elle effectue la désallocation mémoire de différentes tables ayant servi à traiter l'ensemble des marqueurs du solide considéré ; - Procédure "Libere~Mémoire~Marqueurs" : elle effectue la désallocation mémoire de la table de nom et de la table contenant les trajectoires de la totalité des marqueurs. Fichier "makefile" n 1 solidifie: initialisation.o calcul.o sauvegarde.o solidification.o S(CC) -o solidifie initialisation.o calcul.o sauvegarde.o solidification.o -lm -lc initialisation.o: variables.h initialisation.c S(CC) -c initialisation.c calcul.o: variables.h calcul.c $(CC) -c calcul.c sauvegarde.o: variables.h sauvegarde.c $(CC) -c sauvegarde.c solidification.o: variables.h solidification.c S(CC) -c solidification.c Fichier "variables.h" n01 /*This file contain types declaration and global constant and variables*/ &num;include &num;include &num;include &num; define Infini 1E10 &num; define Lettres~Max 100 typedef int *Pointeurs~Entier; typedef int Table~Indices[3); typedef Table Indices *Pointeurs~Table~Indices; typedef char Noms [Lettres~Max]; typedef Noms *Pointeurs~Nom; typedef float *Pointeurs~Reel; typedef Pointeurs~Reel *Pointeurs~Distance; typedef float Points!3); typedef Points *Pointeurs Point; typedef Pointeurs~Point *Pointeurs~Marqueur; typedef float Vecteur[4]; typedef Vecteur Matrice[3]; int Nbr~Images,Nbr Marqueurs, NbrMeSolide, Dunension, Intervalle,Milieu,Delta~Indice; Pointeurs~Entier Table~Numeros,Table~Sauv; Pointeurs~Table~Indices Indices Triangles; Noms Nom-Fichier~Source,Nom~Ficher~Sauvegarde; Pointeurs~Nom Table~Noms; Pointeurs~Distance Table~Distances; Pointeurs~Point Solide; Pointeurs~Marqueur Table~Marqueurs, Tampon~Table~Marqueurs; Fichier "solidification.c" n 1 /*Main programme with different choice and procedures*/ &num;include "variables.h" void Initialise Nom Fichier(); void Initialise~Marqueurs(); void INitialise~Solide~Parametres(); void Determine~Meilleurs~Triangles(); void Classe~Marqueurs~Triangles(); void Calcu.la TrajectoTre Reference(); void Solidifie~Marqueurs(); void Calcule~Coordonnees~Marqueurs~Fictifs(); void Actualise~Marqueurs(); void Initialise~Etape~Suivante(); void Libere Memoire Solide Parametres(); void Sauve-Marqueurs(); void Libere-Memoire~Marqueurs(); main() { int I,J,K,L,Numero~Solide,Choix; FILE *Fich Mg; do @ printf("\n\n\n Solidification procedure. \n\n"); Initialise~Nom~Fichier(Nom~Fichier~Source,Nom~Fichier~Sauvegarde); Initialise~Marqueurs( & br~Images, & br~Marqueurs, & able~Noms, & able~Marqueurs); Numero~Solide-1; do { printf("\n\nSolid %d.\n",Numero~Solide); Initialise~Solide~Parametres( & br~Mq~Solide, & able~Mumeros, & able~Sauv, & olide, & imension, & ntervalle, & ilieu, & able~Distances, & ampon~Table~Marqueurs); for (I=0;I { Determine~Meilleurs~Trinagles( & able~Distances, & elta~Indice, & ndices~Triangles); Classe~Marqueurs~Triangles( & ndices~Triangles); Calcule~Trajectoire~Reference( & able~Marqueurs); for (J=0;J *(Tampon~Table~Marqueurs+J)=(Pointeurs Point) calloc(Milieu+1,sizeof(Points)); Solidifie~Marqueurs(0, & olide); for (J=0;J Calcule~Coordonnees~Marqueurs~Fictifs(0,J, hTampon~TableMarqueurs) ; for (J=1;J Actualise~Marqueurs(J-1, & able~Marqueurs); Solidifie~Marqueurs(J, & olide); Calcule~Coordonnees~Marqueurs~Fictifs(J,J+Milieu, & ampon~Table~Marqueurs); } for (JtNbr Images-Milieu+l;J Actualise~Marqueurs(J-Milieu-1, & able~Marqueurs);; Calcule~Coordonnees~Marqueurs~Fictifs(Delta~Indice-1,J, Fichier "solidification.c" n02 & ampon~Table~Marqueurs); } for (J=0;J Actualise~Marqueurs(Nbr~Images-Milieu-1+J, & able~Marqueurs); for (K=0;K for (L;O;L (*(*(Tampon~Table~Marqueurs+K))) [L]= (*(*(Tampon~Table~Marqueurs+K)+J+1))[L]; } Actualise~Marqueurs(Nbr~Images-1, & able~Marqueurs); Initialise~Etape~Suivante( & ntervalle, & ilieu, & ndices~Triangles, & ampon~Table~Marqueurs); Libere~Memoire~Solide~Parametres( & able~Numeros, & able~Sauv, & olide, & able~Distances, & ampon~Table~Marqueurs); printf("\n\nDo you want to start again with another solid ?(y/n): "); fflush(stdin); Choix-getchar(); Numero Solide±l; while (Choix!-'n'); printf("\n\nDo you want to start again with another file 7. (y/n): '); fflush(stdin); Choix-getchar(); Sauve~Marqueurs(Nom~Fichier~Sauvegarde); Libere~Memoire~Marqueurs( & able~Noms, & able~Marqueurs); } whlle (Choix!-'n'); Ficher "initialisation.c" n 1 @*This file contain some procedure about initialization parameter, .. . &num;include "variables.h" /* Path and name file initialization */ void Initialise Nom Fichier (Nom Fichier~Source,Nom Fichier Sauvegarde) Noms Nom~Fichier~Source,Nom~Fichier~Sauvegarde; Noms Tampon~Nom; FILE *Fichier; do printf("\n\nEnter the path of work's directory.\n"); printf("Path: "); scanf("%s",Nom Fichier Source); strcat(Nom~Fichier~Source,"/"); printf("Enter the name of file .p3d to treat without extension.\n"); printf("Name: "); scanf("%s",Tampon~Nom); strcat(Nom Fichier Source,Tampon Nom); strcpy(Nom-Fichier~Sauvegarde,Nom~Fichier~Source); strcat(Nom FichierZSource,". p3d"); strcat(Nom~Ficher~Sauvegarde,".sld"); while ((FichierPfopen(Nom Fichier Source,"r"))I=NULL); fclose(Fichier); /* Marker's sample initialization by reading in file */ void Initialise~Marqueurs(Nbr~Images,Nbr~Marqueurs,Table~Noms, Table~Marqueurs) int "Nbr~Images,*Nbr~Marqueurs; Pointeurs Nom *Table Noms; Pointeurs~Marqueur *Table~Marqueurs; int I,J,K; char Chainel[Lettres~Max],Chaine2[Lettres~Max]; FILE *Fichier; Fichier-fopen(Nom Fichier Source,"r"); for (I=0;I for (I=0;I *Nbr~Images=1;; while (!strcmp(Chaine1,Chaine2)) { strcpy(Chaine1,Chaine2); *Nbr Images+=1; for (I=0;I *Nbr~Marqueurs=1; while (fscanf(Fichier,"%s", & haine2) !=EOF) if (!strcmp(Chaine2,":")) *Nbr~Marqueurs+=1; *TableNoms=(Pointeurs~Nom) calloc(*NbrMarqueurs,sizeof(Noms)); *TableMarqueurs=(PointeursMarqueur) Fichier "initialisation.c" n02 calloc(*Nbr~Marqueurs+l,sizeof(Pointeurs~Point)); for (I=O;I calloc(*Nbr~Images,sizeof(Points)); fseek(Fichier,0,SEEK~SET); for (I=l;I for (J=O;J fscanf(Fichier,"%s",*Table~Noms+I-1); for (J=0;;Jlt;*Nbr~Images;J++) { for (K=0;K for (K=0;K fscanf(Fichier,"%f", & *(*(*Table~Marqueurs+I)+J))[K]); } } fclose(Fichier); } /* Solid and parameters initialization */ void Initialise~Solide~Parametres(Nbr~Mq~Solide,Table~Numeros,Table~Sauv, Solide, Dimension, Intervalle, Milieu, Table Distances,Tampon TableMarqueurs) int *Nbr MeSoliàe, *Dimension, *Intervalle, fMilieu; Pointeurs~Entier *Table~Numeros,*Table~Sauv; Pointeurs~Point *Solide; Pointeurs~Distance *Table~Distances; Pointeurs~Marqueur *Tampon~Table~Marqueurs; int I; printf("\nEnter its number of marker: ); do scanf("%d",Nbr~Mq~Solide); While ((*Nbr~Mq~Solide Nbr~Marqueurs)); *Table~Numeros=(Pointeurs~Entier) calloc(*Nbr~Mq~Solide,sizeof(int)); *Table~Sauv=(Pointeurs~Entier) calloc(*Nbr~Mq~Solide,sizeof(int)); printf("Enter their index in the file, and their save "); printf("indicator (0/1)./n"); for (I=0;I printf("Marker %d ,I+1); scanf("%d %d",*Table~Numeros+I,*Table~Sauv+I); } *Solide=(Pointeurs~Point) calloc(*Nbr~Mq~Solide,sizeof(Points)); *Dimension=*Nbr~Mq~Solide*(*Nbr~Mq~Solide-1)/2; printf("\nEnter the size of the first "); printf("phase solidification's interval: "); do scanf("%d",Intervalle); while ((*Intervalle Nbr~Images)); *Milieu=*Intervalle/2; *Intervalle=2* (*Milieu); *Tableoistances=(Pointeurs~Distance) calloc(*Dimension,sizeof(Pointeurs~Reel)) for (I=O;I *(*Table~Distances+I)= (Pointeurs~Reel) calloc(Nbr Images,sizeof(float)); *Tampon~Table~Marqueurs=(Pointeurs~Marqueur) Fichier "initialisation.c" n03 calloc(*Nbr~Mq~Solide,sizeof(Pointeurs~Point)); } /* Second parameter's initialization to continue the process */ void Initialise~Etape~Suivant(Intervalle,Milieu,Indices~Triangles, Tampon~Table~Marqueurs) int *Intervalle, *Milieu; Pointeurs~Table~Indices *Indices Triangles; Pointeurs~Marqueur *TamponTableMa rqueurs ; int I; *Intervalle=Nbr Images; *Milieu=*Intervalle/2;; *Intervalle=2* (*Milieu); free(*Indices Triangles); for (I=0;I free(*(*Tampon~Table~Marqueurs+I)); Fichier "calcul.c" n 1 &num;include "variables.h" /* Calculus procedures */ float Norme(V) Vecteur V; int I; float Tampon; Tampon=O; for (I=O;I Tampon=(float) sqrt(Tampon); return(Tampon); void Produit~Vectoriel(Vl,V2,V3) Vecteur Vl,V21V3; V3[0]=Vl[l]*V2[2]-Vl[2]*V2[1]; V3[1]=Vl[2]*V2[0]-Vl[O]*V2[2]; V3[2]-Vl[O]*V2[l]-Vl[l]*V2[0]; float Moyenne(Numero,Intervalle,Pointeur~Reel) int Numero,Intervalle; Pointeurs Reel *Pointeur~Reel; int I; float Tampon; Tampon-O; for (I=0;I return(Tampon/Intervalle); float Ecart Type(Numero, Intervalle,Pointeur Reel,Moyenne) int Numero,Intervalle; float Moyenne; Pointeurs~Reel *Pointeur~Reel; int I; float Tampon; Tampon=O; for (I=O;I Tampon+=(float) pow(*(*Pointeur~Reel~Numero+I)-Moyenne,2); Tampon=(float) sqrt(Tampon/(Intervalle-1)); return(Tampon); /* Determination of the three anatomical markers */ void Determine Meilleurs Triangles(Table Distances,Delta Indice, Indices~Triangles) int *Delta Indice; Pointeurs~Table~Indices *Indices~Triangles; Pointeurs~Distance *Table Distances; Fichier "calcul.c" n 2 int I,J,K,L,M,Tampon~Indice,Indice; float Tampon,Distance~Moyenne,Critere,Critere~Minimal; for (I=0;I Tampon~Indice=O; for (J=1;J Tampon~Indice-=I+1; for (J=I+1;J { Indice=Tampon~Indice+J; for (K=0;K { *(*(*Table~Distances+Indice)+K)=O; for (L=O;L *(*(*Table~Distances+Indice)+K)+=(float) pow((*(*(Table Marqueurs+*(Table Numeros+J))+K)) [L]- (*(*(Table~Marqueurs+*(Table~Numeros+I))+K))[L],2); *(*(*Table~Distances+Indice)+K)=(float) sqrt(*(*(*Table~Distances+Indice)+K)); } } } *Delta~Indice=Nbr~Images-Intervalle+1; *Indices~Triangles=(Pointeurs Table Indices) calloc(*Delta~Indice,sizeof(Table~Indices)); if (Nbr~Mq~Solide==3) for (I-O;I for (J-O;J for (I=0;I { Critere Minimal-Infini; for (J=0;J Tampon~Indice-O; for (K=1;K for (K=J+1;K Indice=Tampon~Indice+K; Distance~MoyennesMoyenne(I,Intervalle,*Table-Distances+Indice); TamponECart Type(I,Intervalle, *Table Distances+Indice, - Distance Moyenne)/DistanceMoyenne; for (L=K+1;L { Critere=Tampon; Indice=Tampon~Indice+L; Distance~Moyenne=Moyenne(I,Intervalle,*Table~Distances+Indice); Critere+=Ecart~Type(I,Intervalle,*Table~Distances+Indice, DistanceMoyenne)/DistanceMoyenne; Indice=O; for (M=1;M Indice+=L-K-l; ; Distance Moyenne=Moyenne(IIntervalle*Table-Distances+Indice); Critere+=Ecart~Type(I,Intervalle,*Table~Distances+Indice, DistanceMoyenne)/DistanceMoyenne; if (Critere Fichier "calcul.c" n03 Critere~Minimal=Critere; (*(*Indices~Triangles+I))[O]=J; (*(*Indices~Triangles+I))[1]=K; (*(*Indices~Triangles+I))[2]=L:: } } } } } } /* Classification of the anatomical markers */ void Classe Marqueurs~Triangles(Indices~Triangles) Pointeurs~Table~Indices *Indices~Triangles; int I,J,K,L,M,Indices~Distance[3],Tampon~Indices[3],Indice; float Tampon,Angle~Moyen; float Critere~Angulaire[3]; Pointeurs~Reel Angles [3); for (I=0;I Angles[I]=(Pointeurs~Reel) calloc(Intervalle,sizeof(float)); for (I=0;I { Indices~Distance [O]=O; for (J=1;J Indices~Distance[0]+=(*(*Indices~Triangles+I))[2] -(*(*Indices~Triangles+I))[l]-l; Indices~Distance[2]=0; for (J=1;J Indices~Distance[2]+=Nbr~Mq~Solide-J;; Indices~Distance[1]=Indices~Distance[2] +(*(*Indices~Triangles+I))[2] -(*(*Indices~Triangles+I))[0]-1; Indices~Distance[2]+=(*(*Indices~Triangles+I))[1] -(*(*Indices~Triangles+I))[0]-1; for (J=0;J { if (J L=J+1; else L=O; if (L M=L+1; else M=O; L=Indices~Distance[L]; M=Indices~Distance[M]; for (K=0;K { Indice=I+K; Tampon=(float) pow(*(*(Table Distances+L)+lndice),2) +pow(*(*(Table Distances+M)+Indice),2); Tampon-=(float) pow +Indice),2); Tampon/=2*(*(*(Table~Distances+L)+Indice)* (*(*(Tableoistances+M)+Indice))); *(Angles[J]+K)=(float) acos(Tampon); for (J=O;J Fichier "calcul.c" n 4 Angle Moyen=Moyenne(O,Intervalle, & ngles[J]);; Critere~Angulaire[J]=Ecart~Type(0,Intervalle, & ngles[J], Angle~Moyen)/Angle~Moyen; } if (Critere~Angulaire[0] J=O; K=l; else J=l; K=O; Tampon~Indices[0]=(*(*Indices~Triangles+I))[J]; Tampon Indices[l=(*(*Indices-Triangles+I)) [K]; if (Critere~Angulaire[2] > Critere~Angulaire[K]) Tampon~Indices[2]=(*(*Indices~Triangles+I))[2]; else Tampon Indices[2]=Tampon~Indices[l]; if (Critere Angulaire[2] Tampon~Indices[1]=Tampon~Indices[0]; Tampon~Indices[0]=(*(*Indices~Triangles+I))[2]; else Tampon~Indices[1]=(*(*Indices~Triangles+I))[2]; for (J O;J (*(*Indices~Triangles+I))[J]=Tampon~Indices[J]; for (I-O;I void Calcule Trajectoire Reference (TableMarqueurs) Pointeurs~Marqueur *Table~Marqueurs; int I, J, K,Etendue,Etendue~Utile,Moitie, Indicel, Indice2, Indice3; Pointeurs~Entier Frequences; Etendue=3*Intervalle; if (Etendue > Nbr~Images) Etendue=2*(Nbr~Images/2); Moitie=Etendue/2; Indicel=Nbr~Images-Milieu+1; Frequences=(Pointeurs~Entier) calloc(NbrMeSolide,sizeof(int)); for (I=O;I Indice2=I-Moitie; if (Indice2 Indice2=O; Indice3=Indice2+Etendue+l; if (Indice3 > Nbr~Images) Indice3=Nbr~Images; for (J=0;J Etendue Utile=Indice3-Indice2; if (Indice2 Fichier "calcul.c" no5 for (J=O;J *(Frequences+(*(Indices~Triangles)) [J)+=Milieu-Indice2: Indice2=Milieu; if (Indice3 > =Indicel) for (J=0;J *(Frequences+(*(Indices~Triangles+Delta~Indice-l))[J])+= Indice3-Indicel; Indice3=Indicel; } if (Indice3 > Indice2) { Indice2-=Milieu; Indice3-=Milieu; for (J=Indice2;J for (K=O;K for (J=0;J { (*(*(*Tabel~Marqueurs)+I))[J]=0; for (K=0;K if (*(Frequences+K)!=0) (*(*(*Table~Marqueurs)+I))[J]+=*(Frequences+K)* (*(*(*Table~Marqueurs+*(Table~Numeros+K))+I))[J]; (*(*(*TableMarqueurs)+I)) [J]/13*Etendue Utile; } free(Frequences); } /* Inverse anatomical frame calculus */ void Calcule~Repere~Inverse(Indice~Triangle,Indice~Image,Inverse~T) int Indice~Triangle,Indice~Image; Matrice Inverse~T;; int I,J; float Tampon; for (I=0;I for (J=O;J (*(Indices~Triangles+Indice~Triangle))[I+1]))+Indice~Image))[J] -(*(*(Table~Marqueurs+*(Table~Numeros+ (*(Indices~Triangles+Indice~Triangle))[0]))+Indice~Image))[J]; Produit~Vectoriel(Inverse~T[0],Inverse~T[1],Inverse-T[2]); Produit~Vectoriel(Inverse~T[2],Inverse~T[0],Inverse~T[1]); for (I=0;I Tampon=Norme(Inverse~T[I]); for (J=O;J int Indice Triangle; Pointeurs~Point *Solide; Fichier "calcul.c" n06 int I,J,K,L,Indice~Image; Matrice Inverse~T; for (I=0;;I for (J=0;J for (I=0;I { Indice~Image=Indice~Triangle+I; Calcule~Repere~Inverse(Indice~Triangle,Indice~Image,Inverse~T); for (J=O;J Inverse~T[J][3]=0; for (K=O;K Inverse~T[J][3]-=Inverse~T[J][K]*(*(*Table~Marqueurs+ Indice~Image)) [K]; for (J=0;J for (K=O;K for (L=0;L (*(*Solide+J))[K]+=Inverse~T[K][L]* (*(*(Table~Marqueurs+*(Table~Numeros+J))+Indice~Image))[L]; (*(*Solide+J))[K]+=Inverse~T[K][3]; for (I=0;I for (J=O;J Tampon~Table~Marqueurs) int Indice~Triangle,Indice~Image; Pointeurs~Marqueur *Tampon~Table~Marqueurs; int I,J,K; Matrice Inverse~T,T; Calcule~Repere~Inverse(Indice~Triangle,Indice~Image,Inverse~T); for (I O;I for (J-O;J T[I][3]=(*(*Table~Marqueurs+Indice~Image))[I]; } for (I=0;I { for (J=0;J for (K=0;K (*(*(*Tampon~Table~Marqueurs+I)+J))[K]= (*(*(*Tampon Table Marqueurs+I)+J+1)) [K]; for (J=0;J { (*(*(*Tampon~Table~Marqueurs+I)+Milieu))[J]=0; for (K=0;K (*(*(*Tampon~Table~Marqueurs+I)+Milieu))[J]+= T[J][K]*(*(Solide+I))[K]; (*(*(*Tampon~Table~Marqueurs+I)+Milieu))[J]+=T[J][3]; } } Fichier "sauvegarde.c" n 1 /*This file contains some procedure about safeguard and free memory*/ &num;include variables h /* Marker's sample actualization */ void Actualise~Marqueurs(Indice~Image,Table Marqueurs) int Indice~Image; Pointeurs~Marqueur *Table~Marqueurs; { int I,J; for (I=0;I if (*(Table~Sauv+I)) for (J=O;J (*(*(*Table~Marqueurs+*(Table~Numeros+I))+Indice~Image))[J]= (*(*(Tampon~Table~Marqueurs+I)))[J]; } /* Safeguard of marker's sample in file */ void SauveMarqueurs (NomFichier Sauvegarde) Noms Nom~Fichier~Sauvegarde; int I,J,K;; FILE *Fichier; Ficher=fopen(Nom~Fichier~Sauvegarde,"w"); fprintf(Fichier,"Markers~Number: %d\n",Nbr~Marqueurs); fprintf(Fichier,"Images~Number: %d\n",Nbr~Images); for (I=1;I fprintf(Fichier,"\n%s\n",*(Table~Noms+I-1)); for (J=0;J for (K=0;K fprintf(Fichier," %-.6f",(*(*(Table~Marqueurs+I)+J))[K]); fprintf(Fichier,"\n"); } } fclose(Fichier); /* Free memory of different samples */ void Libere~Memoire~Solide~Parametres(Table~Numeros,Table~Sauv,Solide, Table~Distances,Tampon~Table~Marqueurs) Pointeurs~Entier *Table~Numeros,*Table~Sauv; Pointeurs~Point *Solide; Pointeurs~Distance *Table~Distances; Pointeurs~Marqueur *Tampon~Table~Marqueurs; { int I; free(*Table~Numeros); free(*Table~Sauv); free(*Solide); for (I=0;I free (*Table~Distances); Fichier "sauvegarde.c" n 2 free(*Tampon Table Marqueurs); /* Free memory of marker's sample */ void Libere Memoire Marqueurs(Table Noms,Table Marqueurs) Pointeurs~Nom *Table Noms; Pointeurs~Marqueur *Table~Marqueurs; int I; free(*Table~Noms); for (I=0;I free(*Table~Marqueurs); REVENDICATIONS 1 - Procédé d'obtention d'un mouvement de type solide indéformable d'un ensemble de marqueurs disposés sur des éléments anatomiques, notamment du corps humain, caractérisé en ce qu'il consiste 1) à placer au moins trois marqueurs sous forme de pastilles sur ou dans l'élément anatomique du sujet, les marqueurs étant visibles par des caméras appropriées 2) à faire évoluer le sujet devant les caméras 3) à enregistrer les trajectoires spatiales discrètes de ces marqueurs 4) à traiter numériquement les images de l'enregistrement du mouvement de manière à exprimer au cours du temps les coordonnées des différents marqueurs dans un même repère et à obtenir des trajectoires permettant le bon déroulement des différentes étapes du procédé 5) à choisir un sens de parcours de l'enregistrement du mouvement 6) à sélectionner une séquence d'images successives de l'enregistrement du mouvement, et à la positionner à l'extrémité initiale de l'enregistrement du mouvement spécifiée par le sens de parcours 7) à déterminer les trois marqueurs non alignés les plus stables en position les uns par rapport aux autres, sur l'ensemble de la séquence d'images sélectionnée 8) à classer les trois marqueurs déterminés à l'étape 7 selon un ordre de stabilité décroissante, établie sur l'ensemble de la séquence d'images sélectionnée, des angles du triangle dont ils constituent les sommets 9) à affecter à l'image située au centre de cette séquence, ainsi qu'aux images correspondant à la première moitié de la séquence lorsque celle-ci est située à l'extrémité initiale de l'enregistrement du mouvement et aux images correspondant à la deuxième moitié de la séquence lorsque celle-ci est située à l'extrémité finale de l'enregistrement du mouvement par rapport au sens de parcours, les trois marqueurs déterminés à l'étape 7 et classés à l'étape 8 10) à décaler la séquence d'une image dans le sens de parcours de l'enregistrement du mouvement 11) à répéter les opérations des étapes 7 à 9, puis 10 jusqu'à ce qu'il ne soit plus possible d'effectuer une nouvelle opération de l'étape 10, la séquence d'images étant alors située à l'extrémité finale de l'enregistrement du mouvement par rapport au sens de parcours 12) à choisir un sens de parcours de l'enregistrement du mouvement 13) à sélectionner une séquence d'images successives de l'enregistrement du mouvement dont la taille est de préférence plus grande que celle de la séquence sélectionnée à l'étape 6, de l'ordre de trois fois plus grande, et à la positionner à l'extrémité initiale de l'enregistrement du mouvement spécifiée par le sens de parcours 14) à calculer par dénombrement sur les images de cette séquence les fréquences de tous ou d'une partie seulement des marqueurs, de préférence uniquement ceux ayant été affectés, selon les opérations de l'étape 9, aux images recouvertes par la séquence 15) à affecter à chaque marqueur considéré à l'étape 14 un poids égal au rapport entre sa fréquence et la somme de toutes les fréquences calculées à l'étape 14 16) à ajouter à l'ensemble des marqueurs considérés, à l'image située au centre de la séquence ainsi qu'aux images correspondant à la première moitié de la séquence lorsque celle-ci est située à l'extrémité initiale de l'enregistrement du mouvement et aux images correspondant à la deuxième moitié de la séquence lorsque celle-ci est située à l'extrémité finale de l'enregistrement par rapport au sens de parcours, un marqueur fictif dont la position est le barycentre des positions des marqueurs considérés à l'étape 14, affectés de leurs poids calculés à l'étape 15 17) à décaler d'une image la séquence dans le sens de parcours de l'enregistrement du mouvement 18) à répéter les opérations des étapes 14 à 16, puis 17 jusqu'à ce qu'il ne soit plus possible d'effectuer une nouvelle opération de l'étape 17, la séquence d'images étant alors située à l'extrémité finale de l'enregistrement du mouvement par rapport au sens de parcours 19) à choisir un sens de parcours de l'enregistrement du mouvement 20) à sélectionner une séquence d'images successives de l'enregistrement du mouvement dont la longueur est de préférence égale à celle de la séquence sélectionnée à l'étape 6, et à la positionner à l'extrémité initiale de l'enregistrement du mouvement spécifiée par le sens de parcours 21) à considérer les trois marqueurs, déterminés à l'étape 7, de l'image située au centre de la séquence dans l'ordre ou ils ont été classés à l'étape 8 22) à construire de manière analogue pour toutes les images recouvertes par la séquence un repère orthonormé direct de la manière suivante : l'origine est le premier marqueur des trois marqueurs considérés à l'étape 21, le vecteur premier axe du repère est le vecteur unitaire colinéaire au vecteur ayant pour origine le premier marqueur et pour extrémité le second marqueur, le vecteur troisième axe du repère est le vecteur unitaire colinéaire au vecteur obtenu par produit vectoriel du vecteur premier axe du repère et du vecteur ayant pour origine le premier marqueur et pour extrémité le troisième marqueur, le vecteur deuxième axe du repère étant le vecteur unitaire obtenu par produit vectoriel du vecteur troisième axe et du vecteur premier axe 23) à translater, à chaque image recouverte par la séquence, l'origine du repère construit à l'étape 22 en la position du marqueur fictif calculée à l'étape 16 ; 24) à exprimer, à chaque image recouverte par la séquence, les coordonnées des marqueurs considérés dans le repère issu des opérations effectuées aux étapes 22 et 23 25) à calculer, sur la totalité des images recouvertes par la séquence, la configuration spatiale de référence de type solide indéformable de l'ensemble des marqueurs considérés par une opération de moyenne des coordonnées de ces marqueurs calculées à l'étape 24 26) à identifier, à l'image située au centre de la séquence, ainsi qu'aux images correspondant à la première moitié de la séquence lorsque celle-ci est située à l'extrémité initiale de l'enregistrement du mouvement et aux images correspondant à la deuxième moitié de la séquence lorsque celle-ci est située à l'extrémité finale de l'enregistrement du mouvement par rapport au sens de parcours, le repère dans lequel les coordonnées moyennes des marqueurs considérés calculées à l'étape 25 sont exprimées, qui est la trace sur la séquence d'images de tous les repères considérés à l'étape 24, avec le repère issu des opérations effectuées aux étapes 22 et 23 à l'image considérée 27) à décaler la séquence d'une image dans le sens de parcours de l'enregistrement du mouvement 28) à répéter les opérations des étapes 21 à 26, puis 27 jusqu'à ce qu'il ne soit plus possible d'effectuer une nouvelle opération de l'étape 27, la séquence d'images étant alors située à l'extrémité finale de l'enregistrement du mouvement par rapport au sens de parcours 29) à substituer les nouvelles trajectoires des marqueurs considérés, sommets des configurations de référence de type solide indéformable de la totalité des étapes 25 effectuées précédemment, issues des opérations de la totalité des étapes 26 effectuées précédemment, aux trajectoires des marqueurs de l'enregistrement du mouvement considéré à l'étape 5 30) à éliminer, pour chaque image de l'enregistrement du mouvement, le marqueur fictif introduit à l'étape 16 31) à augmenter progressivement les tailles des séquences d'images considérées aux étapes 6, 13 et 20 32) à répéter les opérations des étapes 5 à 30, puis 31 jusqu'à obtenir des tailles de séquences d'images toutes égales à la taille de l'enregistrement du mouvement considéré, de préférence dès la première répétition, la dernière séquence des étapes 5 à 30 s'effectuant avec des séquences d'images de la taille de l'enregistrement du mouvement considéré.