Remplacement de motifs

 

 

Le but de ce projet est d'ajouter un élément dans une séquence vidéo. Il devra se positionner et se déplacer en fonction des objets de la scène.
VOIR LE RESULTAT      

Table des matières

Introduction sur le remplacement de motifs
Les méthodes utilisées
Split-Merge
Tracking Simple
Tracking évolué
Insertion du motif
Les problèmes rencontrés
Conclusion
Références
Sur l'auteur

Apropos

Le logiciel que je vais présenter a été programmé en C, à l'aide de la librairie Tcl/Tk 8.0. Vous pouvez en télécharger le source.

Introduction sur le remplacement de motifs

Pour s'adapter aux différentes législations concernant la publicité, des techniques vidéos ont été mises au point. Une de ces techniques permet notamment de remplacer en temps réel un motif dans une séquence vidéo. On peut donc, lors d'une retransmission en direct, incruster dans l'image télévisée, une publicité différente suivant que les images sont destinées au public français, américain, russe, ou sud africain ...

Lors d'un match de football ou de tennis, on peut par exemple modifier à l'image et en temps réel, les publicités qui bordent le stade. Le bulletin météorologique utilise depuis longtemps une technique plus simple mais qui revient plus ou mois au même.

Le programme qui est présenté ici, incruste une image sur une séquence vidéo montrant une camionnette qui passe dans une rue. Le motif s'adapte à la position de la camionnette dans l'image.

La technique utilisé est : le suivi de segments.

Les méthodes utilisées

principale.gif (48116 bytes)Avant de commencer toute autre technique, il faut extraire les contours de l'image. (cf image à droite).

Ceci est un pré-traitement qui est fait par un autre programme. On a donc au départ une liste de chaînes de points, représentant les contours de chacune des images que l'on va traiter.

Split-Merge

C'est le premier algorithme qui est réellement inséré dans le programme:

C'est une approximation géométrique des contours. A partir des chaînes de points, nous voulons obtenir des listes de segments qui approximent les contours.

Description de l'algorithme

On se donne un critère epsilon. On considère le segment limité par le début et la fin de la chaîne de points, et on regarde quel est le point de la chaîne le plus éloigné de ce segment. Si la distance du point au segment est supérieure à epsilon, alors on étudie les deux segments début-point et point-fin. Et ainsi par récurrence. C'est l'algorithme split.

split.jpg (4007 bytes)

Ensuite pour diminuer le nombre de segments, on prend les trois premiers points et on regarde si l'on peut en faire un segment (suivant le critère précédent). Si oui, on relie le premier point avec le troisième point et on recommence. Si non, on essaie en commence par le deuxième point. C'est l'algorithme merge.

avant split-merge
après split-merge

Image25.gif (28995 bytes)

Split25.gif (29434 bytes)

Limites

Evidemment cet algorithme n'est pas optimal : il ne donne pas le nombre minimal de segments.
D'autre part il choisit d'une image à l'autre des segments qui ne correspondent pas.

Tracking Simple

On choisit un segment (parmi ceux trouvés par split-merge), on regarde sa vitesse et son accélération, et on suppose qu'elles sont voisines d'une image sur l'autre.

Connaissant la vitesse et l'accélération d'un segment on essaie de deviner quelle sera sa position dans l'image suivante. Ensuite on détermine quel est le segment de l'image suivante (parmi ceux trouvés par split-merge) qui est le plus proche du segment supposé. Si ce segment est suffisamment proche (suivant un critère donné), on décide que c'est bien le segment recherché. On met alors à jour la vitesse et l'accélération du segment dans la nouvelle image, et on recommence.

suivi d'un segment après trois images

Track47.gif (29939 bytes)

Track50.gif (71256 bytes)

Tracking évolué

Cela commence comme le tracking simple, mais maintenant on ne compare plus le segment supposé aux segments trouvés par split-merge. A partir du segment supposé on recherche une chaîne de points voisine, qui pourrait ressembler à un segment. Si on trouve une telle chaîne de points, on en fait un segment (par split-merge dans mon programme) et on décrète que c'est le segment recherché.

Cette méthode donne de meilleurs résultats que la première, car on n'est plus géné par le fait que split-merge ne renvoie pas les mêmes segments d'une image sur l'autre.

Insertion du motif

En suivant (par la méthode décrite ci-dessus), deux segments de la camionnette, on obtient la position dans chaque image, de quatre points de la camionnette.

Ces points sont suffisants pour déterminer l'homographie qui transforme un rectangle en l'image de la face de la camionnette. On alors la position précise de la camionnette dans l'image, et on peut donc incruster notre motif.

Dans le programme fourni, on ne calcule pas l'homographie complètement. Considérant la petite taille de l'image, on se contente d'un changement de repère (la face de la camionnette est alors un parallèlogramme, et non pas un quarilatère quelconque). Ceci permet d'alléger les calculs et d'accélérer le traitement. De toute façon, les resultats du tracking ne sont pas suffisamment bons pour se donner la peine de faire un calcul exact.

insertion du motif

Rempl48.gif (30052 bytes)

Les problèmes rencontrés

Concernant le suivi des segments
Il y a beaucoup de problèmes qui ne sont pas traités par ce programme. Par exemple, la séquence vidéo choisie ne montre pas la camionnette qui entre ou qui sort de la scène.
Parfois d'une image sur l'autre on ne retrouve pas le segment que l'on suit. Le programme considère alors que le segment supposé est le segment recherché. Si cela se reproduit à l'image suivante, il s'arrête.
L'approximation géométrique induit de nombreuses erreurs dans le suivi de segment, et le mieux que l'on puisse faire est d'adapter le critère epsilon, pour avoir un résultat convenable.
La camionnette a une vitesse constante dans cette vidéo, c'est pourquoi introduire l'accélération dans le calcul du segment supposé génère beaucoup d'erreurs (le critère de vraissemblance est de quelques pixels seulement). Le programme permet de retirer le calcul de l'accélération (cela améliore fortement le résultat).
Parfois le segment trouvé n'est que la moitié du segment recherché, on a alors la vitesse d'une de ses extrémités qui est anormalement grande. Le programme réajuste cette vitesse en effectuant une "moyenne" des vitesses des deux extrémités.
Concernant l'insertion du motif
Le motif n'est pas réaliste puisque c'est un parallèlogramme, mais vu les résultats du tracking, on ne gagnerai rien à faire le calcul complet
Pour avoir un meilleur résultat, il faudrait pouvoir suivre plus de deux segments de la camionnette. Or les techniques exposés ci-dessus ne le permettent pas. L'idéal serait de pouvoir suivre quatre segments délimitant la face de la camionnette.

Conclusion

Le résultat n'est pas fameux, mais il illustre bien la difficulté de suivre un objet dans une séquence vidéo. Une séquence en couleurs aurait peut-être été plus facile à étudier ? Rien n'est moins sûr.

Je pense que la méthode du suivi de segments n'est pas très adaptée pour ce type de séquence vidéo. Mais il est sûr qu'elle donne des résultats même dans une scène aussi complèxe que celle-ci. Dans un environnement plus simple et plus géométrique on pourrait atteindre de très bons résultats.

Enfin, ... Je ne conseillerai mon programme à aucune chaîne de télévision ...

Références

Voici le source du programme avec tout ce qui est nécessaire.

Vous pouvez compiler le programme en exécutant c dans le répertoire source.

Sur l'auteur

fait à Palaiseau le 5 janvier 1999

Laurent MIRGUET
X96, 1ère Compagnie
Ecole Polytechnique
91128 PALAISEAU cedex