View  Edit  Attributes  History  Attach  Print  Search


ACCUEIL | DOCUMENTATION | STRATEGIES | TESTS


Librairie JavacvPro | Strategies

Stratégies : Capture Vidéo : Réflexions autour de la capture et du traitement en temps réel d'un flux vidéo à "haute vitesse" (100fps)


Par X. HINAULT - Avril 2012

Exemple de capture à 100 fps + détection balle + tracé trajectoire en temps réel obtenu avec Javacvpro.

Par le terme "haute vitesse", j'entends ici "supérieur à 30 fps", framerate maxi des webcams standards :
en pratique des débits de l'ordre de 60 à 120 fps.

1.  Le point de départ...

  • Après plusieurs optimisations significatives du code de la librairie JavacvPro (Mars 2012), des vitesses de traitement en temps réel de l'ordre de 70fps théoriques sont devenues accessibles.
  • D'autre part, des essais autour du suivi d'objet en mouvement rapide (par ex : une balle de ping-pong en situation de jeu réel) avec une webcam classique (30 fps) ont vite montré leur limite : de nombreuses positions intermédiaires étaient ignorées et le mouvement rapide de l'objet aboutissait à des images "intraitables" en raison d'un flou visuel important lié au mouvement de l'objet...
  • Face à ces constats, je me suis mis à évaluer les possibilités de réaliser des captures vidéo webcam "haute vitesse", en tout cas à X2 ou x3 la vitesse maximale des webcams USB classiques.
  • C'est l'ensemble de mes réflexions autour de ce sujet et les résultats obtenus que je rassemble ici.

2.  Résultats obtenus :

A titre indicatif, j'obtiens à ce jour (Avril 2012) (avec la webcam Eye PS3 de Sony sous Ubuntu) :

  • des captures de flux vidéo webcam brut à 100fps voire même un peu plus en 320x240 dans Processing !
  • des vitesses de suivis d'objets sur flux traité en temps réel par JavacvPro à 80-90 fps dans Processing !

3.  Les webcams USB pour la capture "haute vitesse"

  • J'utilise ici le terme "haute vitesse" pour désigner des captures supérieures à 30 fps. La plupart des webcams du marché atteignent et sont limitées à cette vitesse... et il n'est pas facile de trouver une webcam 60 voir 100 fps à un prix correct.

3.1  Etat des lieux

  • Mes recherches m'ont tout d'abord mené du côté de fabricants industriels, notamment http://www.ids-imaging.com/ qui propose toute une gamme de webcams USB 2.0 à 75fps en diverses résolutions (voir : http://www.ids-imaging.com/frontend/products.php?interface=usb&res=0) L'intérêt potentiel de ce fabricant est la mise à disposition des drivers pour Linux. Après consultation, les prix se sont avérés beaucoup trop élevés pour ce que l'on peut raisonnablement dépenser (<100€) : le premier prix sans l'objectif m'a été proposé à 350€ HT... !
  • J'ai aussi découvert au passage tout un domaine que je ne connaissais pas trop ; celui du "slow motion" ou les "super ralentis". J'ai d'ailleurs découvert des choses tout à fait impressionnantes, notamment une caméra capable de capturer à 1 000 000 fps (oui, vous avez bien lu : 1 million de fps !) Voir notamment : http://www.visionresearch.com/ Je vous conseille un petit tour dans leur galerie : c'est tout simplement impressionnant ! Par contre, côté prix... c'est aussi très impressionnant : compter 150 000 $ pour la camera ! ou alors location à la journée à 3000$ !

Histoire de rester réaliste et humble, il faut savoir qu'il existe tout un champ scientifique autour des impulsions lumineuses ultra-brèves par laser, de l'ordre de la femto-seconde ( 10exp-15 sec soit millionième de milliardième de seconde) et même de l'atto-seconde (10exp-18sec soit milliardième de milliardième de seconde !). Ces impulsions ont permis de littéralement filmer des phénomènes ultra-radpides au niveau atomique ou moléculaire. Voir ici par exemple : http://www.futura-sciences.com/fr/news/t/physique-1/d/exploit-on-a-filme-des-noyaux-datomes_9962/

  • Ensuite, j'ai lorgné du côté des appareils photos numériques : certains modèles annonce du 1000 fps tout de même mais en toute petite résolution. Par contre, la capture se fait en différé et le traitement vidéo en direct est impossible. Un modèle à coût acceptable : Casio Exilim EX-ZR100 (dans les 250€ - jusqu'à 1000 fps quand même - bien pour du slow motion)
  • Donc, j'ai poursuivi mes recherches, interrogé à droite à gauche, et je suis tombé sur certains modèles de webcam utilisables sous Linux annonçant 60fps ou plus :
    • Philips SPC900-NC,
    • Sony PlayStation3 Eye = mon choix, suite à une suggestion de Julien (merci!)
    • Logitech QuickCam Pro 9000
  • J'ai constaté au passage que peu de monde semble opérationnel sur cette question de la capture par webcam à plus de 30 fps en vue d'un traitement d'image sur flux vidéo en temps réel... Pourquoi ? Quelques esquisses de réponses... :
    • Parce que tant que l'on ne dispose pas d'une librairie de traitement d'image capable d'atteindre ces vitesses, la question ne se pose pas.. C'est d'ailleurs la possibilité théorique d'atteindre des débits de traitements de l'ordre de 70 fps avec JavacvPro qui m'a conduit à regarder de ce côté...
    • Parce que si l'on veut faire autre chose que du traitement d'image en temps réel, atteindre des flux de 60 ou 100 fps pose très vite des problèmes de stockage des fichiers qui grossissent x2 ou x3... donc pas d'intérêt évident. Ce qui est recherché, c'est l'amélioration de la définition, pas de la vitesse de capture...
    • Parce que l'intérêt d'une capture rapide n'apparaît pas de manière évidente... mais l'intérêt est très réel comme je le montrerai plus loin.

3.2  La webcam Eye PS3 de Sony

  • C'est la webcam de la PS3 : elle capture jusqu'à 120 fps en 320x240 et à 60 fps en 640x480.
  • Elle fonctionne "plug and play" sous Ubuntu, mais nécessite un patch pour le driver afin d'accéder aux vitesses les plus rapides.
  • Facile à trouver d'occasion à 15-20€ seulement !
  • L'objectif permet de modifier l'angle d'ouverture.
  • Voir : Installer la webcam Eye PS3 de Sony sous Ubuntu

3.3  Alternative

  • Resterait potentiellement le domaine de webcam "ethernet" que je n'ai pas exploré, mais il semble difficile à ce jour d'atteindre des débits de traitement d'image sur flux réel au delà de 110-120 fps en raison des durées minimales des étapes incompressibles qui prendront quoiqu'il en soit 5 à 7ms...

4.  Intérêt de la capture "haute-vitesse"

4.1  Obtenir davantage de positions intermédiaires

  • Lorsque l'on suit par exemple une balle de ping-pong en situation de jeu et que l'on veut détecter précisément certains moments, tel que l'impact sur la table, la rapidité de capture permet d'obtenir davantage de positions intermédiaires : en fait 3 fois plus pour une capture à 90 fps. Il en découle un plus grande précision des trajectoires et la détection des positions utiles d'un objet en mouvement.
  • Prenons l'exemple d'une balle qui va suivre le mouvement théorique d'une parabole : si on représente sur le même graphique les positions toutes les 11 ms, et que l'on indique les captures de position à 30 fps et 90 fps, on obtient :
  • Si l'on ne garde que les positions 30 fps, on obtient :
  • A l'inverse, si l'on dessine toutes les positions à 90 fps, on obtient :
  • Le gain de précision est évident et significatif : à 90 fps, on multiplie par 3 le nombre de positions capturées et on augmente d'autant la détection des positions utiles.

4.2  Améliorer la netteté de la capture d'image des objets en mouvement

  • Un des problèmes majeurs en capture à 30 fps, lorsque l'on suit des objets en mouvement rapide, c'est l'obtention d'image floutée, en raison du mouvement de l'objet : ceci dégrade inévitablement la qualité de la détection de l'objet et donc du suivi. Voici par exemple, une frame obtenue en capture à 30 fps :

Capture avec une Hercules Dualpix Exchange à 30fps

  • Voici, à présent une capture semblable mais à 100 fps :

Capture avec une Eye PS3 Sony à 100 fps

  • Comme qui dirait, "il n'y a pas photo " ! A 100 fps, malgré un mouvement rapide de l'objet, l'image est nette et il n'y a quasiment aucun flouté de l'objet en mouvement. Ceci veut dire que pour tout suivi d'objet avec mouvement de l'objet ou de la webcam, on aura intérêt à utiliser une fréquence de capture élevée afin de limiter les effets de floutage lié au mouvement !
  • Il en résulte également qu'à 100 fps, le suivi d'objet en mouvement rapide sera meilleur qu'à 30 fps, la détection de l'objet par traitement s'avérant beaucoup plus fiable et stable. La problématique à cette vitesse sera de réaliser un traitement dans les temps impartis, à savoir en moins de 10 ms : JavacvPro permet d'atteindre une telle rapidité de traitement comme nous le détaillerons ci-dessous.
  • Note : ces captures ont été réalisées avec ce programme : Processing – GSVidéo : Datalogging d'images à 100fps (Eye PS3)

5.  Optimisations potentielles attendues avec la capture "haute-vitesse"

5.1  Augmenter la rapidité des "tracking" d'objet

  • Si l'on dispose de davantage de positions intermédiaires, on pourra augmenter la qualité des tracking d'objet par motorisation : c'est à chaque nouvelle frame que l'on pourra potentiellement repositionner la webcam qui assure le suivi. Et par conséquent, le nombre de frame par seconde augmentant, la rapidité du positionnement en sera augmentée.

5.2  Améliorer le suivi d'objets multiples

  • Un autre intérêt potentiel dans l'obtention de davantage de position intermédiaire est de pouvoir suivre simultanément plusieurs objets mobiles avec une plus grande efficacité. En effet, toute la difficulté dans le cas du suivi d'objets multiples en mouvement est de savoir à quelle trajectoire appartient tel objet détecté : plus le nombre de positions préalables pris en compte est grand et plus la prévision des positions suivantes est améliorée. On peut ainsi de la sorte envisager de suivre plusieurs objets similaires dans une même image par analyse des trajectoires, sous réserve que cette analyse ne viennent pas impacter les délais de traitement (voir ci-dessous).

6.  Stratégie de capture et de traitement d'image à 100 fps

6.1  Rappel : les délais type de traitement d'une image à 30 fps avec JavacvPro

  • En résolution 320x240, avec une luminosité satisfaisante, on obtient une durée totale de 15ms dont (10ms fixes) avec les délais suivants :
    • capture et mémorisation dans PImage : 1ms
    • chargement dans buffer JavacvPro: 3ms
    • traitement d'image JavacvPro = temps utile : variable ( 4ms pour un traitement simple)
    • transfert vers Processing : 7ms - 75% des temps fixes !
    • affichage final Processing : 1ms
    • NB : le temps utile potentiel à 30 fps est de 33ms - 11 ms = 22 ms, ce qui est largement suffisant pour des séquences de traitement enchaînant plusieurs traitement de base durant chacun quelques millisecondes.

6.2  La problématique de la capture et du traitement d'image à 100 fps avec Javacvpro

  • La problématique principale à 100fps, c'est qu'il faut réaliser la capture et le traitement de l'image en moins de 1000ms / 100 fps = 10 ms !
  • Dans ce laps de temps, on est censé réaliser :
    • capture et mémorisation dans PImage : 1ms
    • chargement dans buffer JavacvPro: 3ms
    • traitement d'image JavacvPro = temps utile : 0 ms !! ( 4ms pour un traitement simple)
    • transfert vers Processing : 7ms - 75% des temps fixes !
    • affichage final Processing : 1ms

NB : le temps utile potentiel à 100 fps est de 10ms - 11 ms = -1 ms, ce qui veut dire qu'il est potentiellement impossible d'arriver à capturer et réaliser le traitement d'une image en 10ms....

6.3  Ma solution avec Javacvpro

  • Si on y réfléchit bien, lorsqu'on réalise du suivi d'objet, ce qui importe c'est de récupérer les informations utiles issues du traitement d'image (la position du centre de la balle, le rectangle encadrant) et pas forcément de réafficher l'image traitée... Du coup, on peut court-circuiter l'étape de récupération du buffer Opencv dans le PImage et se contenter d'afficher les informations utiles directement sur l'image brute de capture : on réduit ainsi les temps fixe de 75%, qui passe alors de 11ms à 4ms environ. On dégage ainsi 6 ms pour réaliser le traitement d'image et la récupération des informations utiles dans Processing !
  • Le graphique des délais de traitement d'une image devient :
  • On dispose donc ainsi de 6ms pour réaliser un filtrage de couleur + Seuillage/binarisation + recherche de blobs... : en pratique, JavacvPro permet de réaliser ces opérations en 8ms environ sur une image 320x240... et permet d'obtenir un traitement d'image à 90 fps en temps réel !
  • Voici un frame obtenu lors d'un traitement d'image en temps réel : on obtient bien 90 fps, traitement inclus !
  • La même chose avec tracé de la trajectoire (voir objet Trajectory) : on retrouve parfaitement la parabole attendue grâce à toutes les positions détectées !
  • Noter que la capture de l'image pour enregistrement ralenti un peu la vitesse maximale atteinte qui est bel et bien de 90 fps sans enregistrement simultané.