View  Edit  Attributes  History  Attach  Print  Search


ACCUEIL | DOCUMENTATION | STRATEGIES | TESTS

JavacvProStrategiesTrackingPrincipes

Main.JavacvProStrategiesTrackingPrincipes History

Hide minor edits - Show changes to output

Added line 8:
%center% %width=150px%Path:/mes_images/clipart/target_green.jpg
Added lines 61-65:

'''Stratégie de suivi d'un visage'''
* [[JavacvProStrategiesTrackingFluxVideoBrut|Suivi d'objet (tracking) : acquisition d'un flux video brut]]
* [[JavacvProStrategiesTrackingVisageCascade|Suivi d'un visage (tracking) à l'aide d'un fichier de description (cascade)]]

Added lines 50-56:

'''Stratégie de suivi d'un objet coloré'''
* [[JavacvProStrategiesTrackingFluxVideoBrut|Suivi d'objet (tracking) : acquisition d'un flux video brut]]
* [[JavacvProStrategiesTrackingFluxFiltrageMixerRGB|Suivi d'objet coloré (tracking) : filtrage couleur par mixeur RGB]]
* [[JavacvProStrategiesTrackingSeuillage|Suivi d'objets colorés (tracking) : seuillage et binarisation de l'image filtrée]]
* [[JavacvProStrategiesTrackingDetectBlobs|Suivi d'objets colorés (tracking) : détection et tracé des formes ]]
* [[JavacvProStrategiesTrackingSelectBlobs|Suivi d'objets colorés (tracking) : filtrage géométrique des formes détectées]]
Deleted line 8:
%center%%width=400px%[[Path:|Path:]]
Changed lines 40-41 from:
to:
** Sélection géométrique finale
Added lines 46-50:
*Dans le cas du suivi d'un objet coloré, on va pouvoir optimiser le code de détection à plusieurs niveaux :
** au niveau du filtrage de la couleur : plus le filtrage sera efficace et discriminant, mieux sera la détection.
** au niveau du niveau de seuil à utiliser : plus le seuil utilisé sera élevé, et mieux l'objet suivi sera bien détecté
** au niveau de la détection des blobs : on pourra éliminer d'emblée les artéfacts en ignorant les blobs trop petits
** au niveau de la sélection géométrique : étape ultime de filtrage permettant d'écarter les blobs ne correspondant pas à l'objet suivi.
Changed lines 54-67 from:
to:
!! Stratégie pour la détection au sein d'une image 3D d'un objet

* Utilisation de l'algorithme SURF : à venir


!! Stratégie pour la détection de lignes, cercle, coins

* à venir

!! Stratégie pour la détection d'un damier

* à venir

*
Changed line 36 from:
** Image brute
to:
** Acquisition de l'image brute
Added lines 30-43:

* Les fonctions d'analyse de contour ne peuvent s'appliquer que sur des images binaires, c'est à dire avec des pixels soit noir, soit blanc. Un contour sera la limite d'une forme blanche. Voir ici pour plus de détails à ce sujet : [[JavacvProTestsFonctionBlobs |JavacvPro : Tests : Test du fonctionnement de la fonction de détection de contour blobs()]]

%center%Path:/mes_images/javacvpro/tests/contour1_findholes_true.png

* En fait, la plus grande difficulté va être d'isoler l'objet que l'on veut détecter au sein de l'image. Isoler l'objet va consister à obtenir une image binarisée de l'objet à détecter. L'image suivante résume bien les 4 étapes fondamentales de la détection d'un objet :
** Image brute
** Filtrage / segmentation de l'objet à isoler
** Seuillage pour binariser l'image
** Détection de forme

%center%%width=320px%Path:/mes_images/javacvpro/javacvpro_exemple_blobs.png

* Dans le cas d'un flux vidéo en temps réel, la librairie javacvPro permettra sans trop de difficulté des suivis d'objet avec un débit d'image de l'ordre 20fps (20 images/secondes) en 320x240 pixels, traitement d'image inclus !
Deleted lines 30-42:
* Les fonctions d'analyse de contour ne peuvent s'appliquer que sur des images binaires, c'est à dire avec des pixels soit noir, soit blanc. Un contour sera la limite d'une forme blanche. Voir ici pour plus de détails à ce sujet : [[JavacvProTestsFonctionBlobs |JavacvPro : Tests : Test du fonctionnement de la fonction de détection de contour blobs()]]

%center%Path:/mes_images/javacvpro/tests/contour1_findholes_true.png

* En fait, la plus grande difficulté va être d'isoler l'objet que l'on veut détecter au sein de l'image. Isoler l'objet va consister à obtenir une image binarisée de l'objet à détecter. L'image suivante résume bien les 4 étapes fondamentales de la détection d'un objet :
** Image brute
** Filtrage / segmentation de l'objet à isoler
** Seuillage pour binariser l'image
** Détection de forme

%center%%width=320px%Path:/mes_images/javacvpro/javacvpro_exemple_blobs.png

* Dans le cas d'un flux vidéo en temps réel, la librairie javacvPro permettra sans trop de difficulté des suivis d'objet avec un débit d'image de l'ordre 20fps (20 images/secondes) en 320x240 pixels, traitement d'image inclus !
Added line 11:
(:toc:)
Added lines 20-29:
!! Quelques remarques techniques préalables

* Lorsque l'on aborde le suivi d'objet, on a tendance à utiliser des résolutions importantes dans une première approche ce qui a pour effet de ralentir le débit de l'image finale, sans améliorer la qualité de la détection. En pratique, on pourra se contenter d'une image 320x240 pour obtenir une détection fluide en temps réel, voire même 160x120 dans le cas de la détection de visage qui est très consommateur de temps CPU (= utilisation du processeur).

* Même remarque concernant le débit d'image : un débit à 15fps pourra souvent suffir et allègera la CPU.

* Côté matériel, on obtiendra de bons résultats avec un processeur double coeur cadencé à 1,66Ghz par exemple.

!! Stratégie pour la détection d'un objet coloré

Changed lines 44-52 from:
* A part, le suivi de visage qui va se faire à partir d'un fichier descripteur.

!! Quelques remarques techniques préalables

* Lorsque l'on aborde le suivi
d'objet, on a tendance à utiliser des résolutions importantes dans une première approche ce qui a pour effet de ralentir le débit de l'image finale, sans améliorer la qualité de la détection. En pratique, on pourra se contenter d'une image 320x240 pour obtenir une détection fluide en temps réel, voire même 160x120 dans le cas de la détection de visage qui est très consommateur de temps CPU (= utilisation du processeur).

* Même remarque concernant le débit d'image : un débit à 15fps pourra souvent suffir et allègera la CPU.

* Côté matériel, on obtiendra de bons résultats avec un processeur double coeur cadencé à 1,66Ghz par
exemple.
to:
!! Stratégie pour la détection d'un visage ou d'un individu

* On va utiliser ici un fichier
descripteur qui va détecter tout visage présent.

!! Stratégie pour la détection
d'une main

* On va
utiliser ici la soustraction du fond par exemple

Added lines 33-34:

* A part, le suivi de visage qui va se faire à partir d'un fichier descripteur.
Deleted lines 41-123:
!! Acquisition de l'image brute

* Cette étape est la plus simple et se fera à l'aide de la librairie GSVideo dans le cas d'un flux webcam.

* Voici le code type d'un programme affichant une image vidéo :

(:source lang=processing :)

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

// Montre exemple utilisation de la capture d'un flux video avec JavacvPro et GSVideo


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/
// et ici : http://codeanticode.wordpress.com/2011/05/16/gsvideo-09-release

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

GSCapture cam1; // 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

PImage imgSrc;

int widthCapture=320;
int heightCapture=240;
int fpsCapture=20;

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

        size(widthCapture*2,heightCapture);

//======== Initialisation Objets GSVideo (capture et/ou lecture video =========

// GSCapture(this, int requestWidth, int requestHeight, [int frameRate], [String sourceName], [String cameraName])
cam1 = new GSCapture(this, widthCapture, heightCapture,fpsCapture,"v4l2src","/dev/video0"); // Initialise objet GSCapture désignant webcam
// largeur et hauteur doivent être compatible avec la webcam - typiquement 160x120 ou 320x240 ou 640x480...
// Meilleurs résultats avec framerate webcam entre 20 et 30 et frameRate programme idem ou multiple plus grand (40 pour 20 par ex)
// la liste des webcam installées sous Ubuntu (Gnu/Linux) est donnée par la commande : ls /dev/video*

// cam1.play();  // démarre objet GSCapture = la webcam - version GSVideo avant 0.9
cam1.start();  // démarre objet GSCapture = la webcam - version GSVideo après 0.9

//======== Initialisation Objets OpenCV (librairie javacvPro : traitement d'image et reconnaissance visuelle) =========

opencv = new OpenCV(this); // initialise objet OpenCV à partir du parent This
        opencv.allocate(widthCapture,heightCapture); // crée le buffer image de la taille voulue


       
}


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

  if (cam1.available() == true) { // si une nouvelle frame est disponible sur la webcam
    cam1.read(); // acquisition d'un frame

    imgSrc=cam1.get(); // récupère l'image GS video dans Pimage
    opencv.copy(imgSrc); // charge l'image dans le buffer openCV

    //opencv.copy(cam1.get()); // autre possibilité - charge directement l'image GSVideo dans le buffer openCV

    image(opencv.getBuffer(),0,0); // affiche flux vidéo direct depuis OpenCV
   
    opencv.invert(); // applique traitement sur flux vidéo
   
    image(opencv.getBuffer(),widthCapture,0); // affiche flux vidéo direct depuis OpenCV
   


  } // fin if available

}


(:sourcend:)
Changed lines 3-5 from:
[[Main.LibrairieJavacvPro|Librairie JavacvPro]]

! Stratégies : Tracking
: Principes généraux pour la détection et le suivi d'objet.
to:
[[Main.LibrairieJavacvPro|Librairie JavacvPro]] | [[JavacvProStrategies|Strategies]]

! Stratégies : Suivi d'objet (Tracking)
: Principes généraux pour la détection et le suivi d'objet.
Added lines 49-122:

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

// Montre exemple utilisation de la capture d'un flux video avec JavacvPro et GSVideo


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/
// et ici : http://codeanticode.wordpress.com/2011/05/16/gsvideo-09-release

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

GSCapture cam1; // 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

PImage imgSrc;

int widthCapture=320;
int heightCapture=240;
int fpsCapture=20;

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

        size(widthCapture*2,heightCapture);

//======== Initialisation Objets GSVideo (capture et/ou lecture video =========

// GSCapture(this, int requestWidth, int requestHeight, [int frameRate], [String sourceName], [String cameraName])
cam1 = new GSCapture(this, widthCapture, heightCapture,fpsCapture,"v4l2src","/dev/video0"); // Initialise objet GSCapture désignant webcam
// largeur et hauteur doivent être compatible avec la webcam - typiquement 160x120 ou 320x240 ou 640x480...
// Meilleurs résultats avec framerate webcam entre 20 et 30 et frameRate programme idem ou multiple plus grand (40 pour 20 par ex)
// la liste des webcam installées sous Ubuntu (Gnu/Linux) est donnée par la commande : ls /dev/video*

// cam1.play();  // démarre objet GSCapture = la webcam - version GSVideo avant 0.9
cam1.start();  // démarre objet GSCapture = la webcam - version GSVideo après 0.9

//======== Initialisation Objets OpenCV (librairie javacvPro : traitement d'image et reconnaissance visuelle) =========

opencv = new OpenCV(this); // initialise objet OpenCV à partir du parent This
        opencv.allocate(widthCapture,heightCapture); // crée le buffer image de la taille voulue


       
}


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

  if (cam1.available() == true) { // si une nouvelle frame est disponible sur la webcam
    cam1.read(); // acquisition d'un frame

    imgSrc=cam1.get(); // récupère l'image GS video dans Pimage
    opencv.copy(imgSrc); // charge l'image dans le buffer openCV

    //opencv.copy(cam1.get()); // autre possibilité - charge directement l'image GSVideo dans le buffer openCV

    image(opencv.getBuffer(),0,0); // affiche flux vidéo direct depuis OpenCV
   
    opencv.invert(); // applique traitement sur flux vidéo
   
    image(opencv.getBuffer(),widthCapture,0); // affiche flux vidéo direct depuis OpenCV
   


  } // fin if available

}

Added lines 31-40:

* Dans le cas d'un flux vidéo en temps réel, la librairie javacvPro permettra sans trop de difficulté des suivis d'objet avec un débit d'image de l'ordre 20fps (20 images/secondes) en 320x240 pixels, traitement d'image inclus !

!! Quelques remarques techniques préalables

* Lorsque l'on aborde le suivi d'objet, on a tendance à utiliser des résolutions importantes dans une première approche ce qui a pour effet de ralentir le débit de l'image finale, sans améliorer la qualité de la détection. En pratique, on pourra se contenter d'une image 320x240 pour obtenir une détection fluide en temps réel, voire même 160x120 dans le cas de la détection de visage qui est très consommateur de temps CPU (= utilisation du processeur).

* Même remarque concernant le débit d'image : un débit à 15fps pourra souvent suffir et allègera la CPU.

* Côté matériel, on obtiendra de bons résultats avec un processeur double coeur cadencé à 1,66Ghz par exemple.
Deleted line 21:
Changed lines 24-25 from:

* En fait, la plus grande difficulté va être d'isoler l'objet que l'on veut détecter au sein de l'image. Isoler l'objet va consister à obtenir une image binarisée de l'objet à détecter.
to:
* En fait, la plus grande difficulté va être d'isoler l'objet que l'on veut détecter au sein de l'image. Isoler l'objet va consister à obtenir une image binarisée de l'objet à détecter. L'image suivante résume bien les 4 étapes fondamentales de la détection d'un objet :
** Image brute
** Filtrage / segmentation de l'objet à isoler
** Seuillage pour binariser l'image
** Détection de forme

%center%%width=320px%Path:/mes_images/javacvpro/javacvpro_exemple_blobs.png

!! Acquisition de l'image brute

* Cette étape est la plus simple et se fera à l'aide de la librairie GSVideo dans le cas d'un flux webcam.

* Voici le code type d'un programme affichant une image vidéo :

(:source lang=processing :)

(:sourcend:)
Changed lines 20-24 from:
* Les fonctions d'analyse de contour ne peuvent s'appliquer que sur des images binaires, c'est à dire avec des pixels soit noir, soit blanc. Un contour sera la limite d'une forme blanche.
to:
* Les fonctions d'analyse de contour ne peuvent s'appliquer que sur des images binaires, c'est à dire avec des pixels soit noir, soit blanc. Un contour sera la limite d'une forme blanche. Voir ici pour plus de détails à ce sujet : [[JavacvProTestsFonctionBlobs |JavacvPro : Tests : Test du fonctionnement de la fonction de détection de contour blobs()]]


%center%Path:/mes_images/javacvpro/tests/contour1_findholes_true.png

Added lines 1-22:
(:notitle:)
(:include HautPageReference:)\\
[[Main.LibrairieJavacvPro|Librairie JavacvPro]]

! Stratégies : Tracking : Principes généraux pour la détection et le suivi d'objet.
----

%center%Path:/mes_images/javacvpro/bandeau_javacvpro_processing_opencv_400.png
%center%%width=400px%[[Path:|Path:]]


!! Introduction

* La bonne question n'est pas "comment faire du suivi d'objet ?" : la bonne question est plutôt "qu'est-ce que l'on veut suivre ?"

* Le suivi d'objet (ou tracking), c'est quoi ? Cela consiste à pouvoir donner la position du centre d'un objet dans une image issue le plus souvent d'un flux vidéo en provenance d'une webcam.

* La connaissance de cette position va ensuite permettre de déclencher une motorisation ou autre qui va permettre de rester "calé" sur l'objet ou déclencher des évènements voulus en fonction de la position dans l'image.

* Les fonctions d'analyse de contour ne peuvent s'appliquer que sur des images binaires, c'est à dire avec des pixels soit noir, soit blanc. Un contour sera la limite d'une forme blanche.

* En fait, la plus grande difficulté va être d'isoler l'objet que l'on veut détecter au sein de l'image. Isoler l'objet va consister à obtenir une image binarisée de l'objet à détecter.