From Référence Librairie javadocPro

Main: JavacvProStrategiesCaptureVideoOptimisation


Librairie JavacvPro | Strategies

Stratégies : Capture Vidéo : Eléments d'optimisation de la capture d'un flux vidéo


Par X. HINAULT - Mars 2012

Sur cette page... (Masquer)

  1. 1. L'objectif
  2. 2. Les contraintes temporelles à atteindre
  3. 3. La luminosité ambiante
  4. 4. Résolution de l'image
  5. 5. Utilisation de l'évènement captureEvent()
  6. 6. Eviter de répéter l'appel de la fonction get() de l'objet GSCapture
  7. 7. Eviter le "réaffichage" de l'image traitée ou l'affichage du buffer principal JavacvPro
  8. 8. Limiter la taille totale de la fenêtre Processing
  9. 9. Le mode d'exécution compilé ou interprété
  10. 10. Conclusions pour un résultat optimal :
  11. 11. Programme type de test des délais des différentes étapes

1.  L'objectif

2.  Les contraintes temporelles à atteindre

Certaines webcams telle que la Eye PS3 sont capable de capturer à 100fps ou plus... Dans cette situation, la notion d'optimisation des délais prend tout son sens puisque l'on ne dispose que de 10 à 15ms pour traiter chaque frame. Les tests réalisés avec la librairie JavacvPro m'ont permis de réaliser un suivi de balle en 320x240 à la vitesse de 80fps en temps réel ! (Avril 2012)

3.  La luminosité ambiante

A code identique, une luminosité insuffisante pourra diviser quasiment par 2 voir 3 la fréquence maximale d'image obtenue !!

4.  Résolution de l'image

Noter que l'on obtient tout de même des débits de 12 images secondes en 640 x 480 ce qui peut être tout à fait acceptable dans certaines situations.

Pour atteindre un traitement d'image sur flux vidéo de 30 fps, la résolution 320x240 est celle qui donne le meilleur compromis pour le ratio résolution utile / temps de traitement de l'image

5.  Utilisation de l'évènement captureEvent()

6.  Eviter de répéter l'appel de la fonction get() de l'objet GSCapture

7.  Eviter le "réaffichage" de l'image traitée ou l'affichage du buffer principal JavacvPro

8.  Limiter la taille totale de la fenêtre Processing

9.  Le mode d'exécution compilé ou interprété

10.  Conclusions pour un résultat optimal :

Certaines webcams telle que la Eye PS3 sont capable de capturer à 100fps ou plus... Dans cette situation, la notion d'optimisation des délais prend tout son sens puisque l'on ne dispose que de 10 à 15ms pour traiter chaque frame. Les tests réalisés avec la librairie JavacvPro m'ont permis de réaliser un suivi de balle en 320x240 à la vitesse de 80fps en temps réel ! (Avril 2012)

11.  Programme type de test des délais des différentes étapes



// Programme d'exemple de la librairie javacvPro
// par X. HINAULT - Mars 2012
// Tous droits réservés - Licence GPLv3

// Code type pour estimation des délais de traitement d'image

import codeanticode.gsvideo.*; // importe la librairie vidéo GSVideo qui implémente GStreamer pour Processing (compatible Linux)
// librairie comparable à la librairie native vidéo de Processing (qui implémente QuickTime..)- Voir Reference librairie Video Processing
// cette librairie doit être présente dans le répertoire modes/java/libraries du répertoire Processing (1-5)
// voir ici : http://gsvideo.sourceforge.net/

import monclubelec.javacvPro.*; // importe la librairie javacvPro

PImage img;

GSCapture cam; // déclare un objet GSCapture représentant une webcam
// L'objet GSCapture étend PImage - se comporte comme un conteneur des frames issues de la webcam

OpenCV opencv; // déclare un objet OpenCV principal

int widthCapture=320*2; // largeur image capture
int heightCapture=240*2; // hauteur image capture
int fpsCapture=30; // framerate de Capture

int millis0=0; // variable mémorisation millis()
int millis0b=0; // variable mémorisation millis()

boolean flagCapture=false;

boolean debug=false; // affichage message debug

void setup(){ // fonction d'initialisation exécutée 1 fois au démarrage

        //--- initialise fenêtre Processing
        size (widthCapture*2, heightCapture); // crée une fenêtre Processing de la 2xtaille du buffer principal OpenCV
        //size (img.width, img.height); // aalternative en se basant sur l'image d'origine
        frameRate(fpsCapture); // taux de rafraichissement de l'image

       //---- initialise la webcam ---
       //cam = new GSCapture(this, widthCapture, heightCapture); // forme simplifiée
       cam = new GSCapture(this, widthCapture, heightCapture,"v4l2src","/dev/video1", fpsCapture); // Initialise objet GSCapture désignant webcam - forme complète

        //--- initialise OpenCV ---
        opencv = new OpenCV(this); // initialise objet OpenCV à partir du parent This
        opencv.allocate(widthCapture, heightCapture); // initialise les buffers OpenCv à la taille de l'image

        cam.start();  // démarre objet GSCapture = la webcam

}


void  draw() { // fonction exécutée en boucle

// Code capture GSVideo
/*
  if (cam.available() == true) { // si une nouvelle frame est disponible sur la webcam

    // mettre de préférence le code dans captureEvent()

  } // fin if available
*/


} // fin draw


//----- fonction évènement nouvelle image vidéo disponible --------
void captureEvent(GSCapture cam) {

  //--- afficche délai entre 2 captures --
  println("Durée entre 2 captures =" + (millis()-millis0b)+"ms soit un framerate de " + (1000.0/(millis()-millis0b))+"fps");  
  millis0b=millis(); // mémorise millis()  

  //---- délai capture + copie dans PImage
  millis0=millis(); // mémorise millis()  
  cam.read();
  img=cam.get();
  if (debug) println("Durée read + get =" + (millis()-millis0)+"ms.");

  //---- délai chargement dans buffer JavacvPro
  millis0=millis(); // mémorise millis()  
  opencv.copy(img); // charge l'image GSVideo dans le buffer openCV
  if (debug)println("Durée chargement buffer OpenCV=" + (millis()-millis0)+"ms.");

  //---- +/- délai affichage image départ        
  millis0=millis(); // mémorise millis()  
  //--- affiche image de départ avant opération sur image ---        
  image(img,0,0); // affiche le buffer principal OpenCV dans la fenêtre Processing
  // éviter d'utiliser image() ou getBuffer() de l'objet OpenCV
  //if (debug) println("Durée affichage image source =" + (millis()-millis0)+"ms.");

  //--- délai opérations sur image ---

  millis0=millis(); // mémorise millis()  

  //-- toutes ces formes sont possibles :
  //opencv.scharr(); // applique le filtre de scharr sur le buffer principal OpenCV avec paramètres par défaut - coeff=1
  opencv.scharr(0.4); //applique le filtre de scharr sur le buffer principal OpenCV avec coeff

  //opencv.scharr(opencv.Buffer,0.5); //applique le filtre scharr sur le buffer OpenCV désigné avec paramètres

  //--- pour effet "dessin au fusain"
  //opencv.gray(); // passage en niveau de gris
  //opencv.invert(); // pour dessin au trait noir sur blanc


  if (debug) println("Durée traitement image par OpenCV=" + (millis()-millis0)+" ms.");

  //--- affiche image finale ---

  //--- délai transfert buffer JavacvPro vers Processing
  millis0=millis(); // mémorise millis()  
  img=opencv.getBuffer();
  if (debug) println("Durée transfert vers Processing =" + (millis()-millis0)+" ms.");

  //---- délai affichage PImage ---
   millis0=millis(); // mémorise millis()  
   image(img,widthCapture,0); // affiche le buffer principal OpenCV dans la fenêtre Processing        
   if (debug) println("Durée affichage Processing =" + (millis()-millis0)+" ms.");


   //flagCapture=true; // témoin capture - si utilisation available


} // fin eventCapture()

 
Retrieved from http://www.mon-club-elec.fr/pmwiki_reference_lib_javacvPro/pmwiki.php?n=Main.JavacvProStrategiesCaptureVideoOptimisation
Page last modified on April 07, 2012, at 09:31 AM