Voilà le détail de l'algorithme :

1. D'abord on fait l'acquisition du flux de la webcam, on l'attache à un clip, on le passe en N&B avec un ColorMatrixFilter pour ne garder que la luminance et on ramène cette luminance à des valeurs comprises entre 0..128 en divisant par 2 chaque valeur.

2. On va maintenant calculer la dérivée temporelle de chaque pixel, c'est à dire la différence entre notre image à l'instant t et la précedente de l'instant t - 1 que l'on aura pris soin de stocker dans un BitmapData. En l'occurence pour nous il va être plus simple de calculer l'opposé : on copie la référence t - 1 dans un BitmapData, on booste tous les pixels de 128 pour obtenir des valeurs comprises entre 128..255, et on ajoute par dessus la capture de l'instant t en blendMode "substract". On obtient une image où un gris 128 est la couleur neutre, et où les pixels blancs et noirs indiquent un changement de chaque pixel vers plus ou moins de luminance.

- =

3. On va maintenant calculer la dérivée spatiale de chaque pixel, en appliquant sur chaque pixel une matrice de convolution de Sobel grace à la méthode applyFilter de BitmapData.

4. Enfin le calcul pour determiner le déplacement pour un pixel. On regarde le dt, le dx et le dy moyens dans une zone autour du pixel (pour filtrer le bruit), ramenés à des valeurs comprises entre -1..1, puis on approxime le déplacement du pixel vx = dx /dt et vy = dy /dt. On s'en sert en exemple pour tester le déplacement de 5 points sous la balle, et la faire rebondir en conséquence.

5. On stocke l'image actuelle pour qu'elle serve de référence à la boucle suivante...
Bien entendu on a pas besoin d'afficher les BitmapData comme je le fais ici, seul le clip contenant le flux vidéo en N&B est nécessaire, mais il peut être caché en dehors du Stage.

... et j'en profite pour souhaiter un Bon Anniversaire Dick !

max.