IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Camshift Meanshift


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 3
    Par défaut Camshift Meanshift
    Bonjour,

    Dans le cadre d'un projet en OpenCV, je dois à l'aide d'une camera AXIS, détècter une personne qui passe (algorithme de background substraction) et ensuite la suivre (algorithme camshift).
    J'ai déjà réalisé la partie "detection d'une personne" qui me renvoie un "cvRect" ou se trouve la personne à traquer.
    J'arrive maintenant à la partie camshift est voila mon problème :

    J'essaye d'abord de faire fonctionner mon algo sur une video, je passe en paramètre de ma fonction camshift :
    - la frame courante binarisé "img"
    - le rectangle où se trouve l'objet a traquer au debut de la video "rect"
    - les critères ( je n'ai pas du tout compris à quoi cela correspondait)

    et je récupère mes infos dans "track_comp" et "box".
    Seulement voila le camshift ne suit pas du tout l'objet, et je ne comprend pas d'ailleurs se qu'il fait. Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    using namespace cvb;
     
    int main(int argc, char** argv)
    {
    	IplImage* tmp_frame = NULL;
    	IplImage* img;
    	CvCapture* cap = NULL;
    	CvRect rect;
    	CvConnectedComp track_comp;
     
    	if( argc < 2 )
    	{
    		std::cout << "Please specify video file name" << std::endl;
    		exit(0);
    	}
     
    	cap = cvCaptureFromFile(argv[1]);	
    	tmp_frame = cvQueryFrame(cap);
    	if(!tmp_frame)
    	{
    		std::cout << "Bad video" << std::endl;
    		exit(0);
    	}
     
    	/*Video ma tete*/
    	//rect = cvRect(420,200,100,100);
     
    	/*Video tache*/
    	rect = cvRect(160,100,20,20);
     
    	cvNamedWindow("meanshift", 1);
    	//cvNamedWindow("NB", 1);
     
       	img = cvCreateImage(cvGetSize(tmp_frame),tmp_frame->depth,1);
    	//CvBGStatModel* bg_model = cvCreateFGDStatModel(tmp_frame);	
     
    	for( int fr = 1;tmp_frame; tmp_frame = cvQueryFrame(cap), fr++ )
    	{
    		//cvUpdateBGStatModel( tmp_frame, bg_model);
    		//cvSetImageROI(tmp_frame,rect);
    		cvConvertImage(tmp_frame,img);	
    		cvMeanShift( img, rect, cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ), &track_comp);
    		//cvCamShift( img, rect, cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ), &track_comp,&box);
    		//cvRectangle(tmp_frame,cvPoint(rect.x,rect.y),cvPoint(rect.x+rect.width,rect.y+rect.height),cvScalar(0,120),1,8,0);
    		//cvRectangle(tmp_frame,cvPoint(track_comp.rect.x-track_comp.rect.width/2,track_comp.rect.y-track_comp.rect.height/2),cvPoint(track_comp.rect.x		+track_comp.rect.width/2,track_comp.rect.y+track_comp.rect.height/2),cvScalar(0,120),1,8,0);
    		cvRectangle(tmp_frame,cvPoint(track_comp.rect.x-10,track_comp.rect.y-10),cvPoint(track_comp.rect.x+10,track_comp.rect.y+10),cvScalar(0,120),1,8,0);
     
     
    		cvShowImage("meanshift", tmp_frame);
    		//cvShowImage("NB", bg_model->foreground);
    		cvWaitKey(25);
    	}
     
    	cvReleaseCapture(&cap);
    	cvDestroyAllWindows();
     
    	return 0;
    }
    Voilà plus précisément les fonctions Camshift et Meanshift:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cvMeanShift( img, rect, cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ), &track_comp);
    cvCamShift( img, rect, cvTermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ), &track_comp,&box);
    Donc je voudrais savoir si j'utilise bien le camshift ou si j'ai mal compris. Pour moi, le camshift calcul l'histogramme de l'image contenue dans le cvRect qu'on lui donne en deuxième argument et essaye de le retrouver dans la frame d'apres.

    Sinon avez-vous un exemple simple de camshift ? Je n'ai pas vraiment reussi a comprendre l'exemple "camshiftdemo" de OpenCV.

    Merci à tous.

  2. #2
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    CamShift
    Finds object center, size, and orientation
     
    int cvCamShift( const CvArr* imgProb, CvRect windowIn, CvTermCriteria criteria,
                    CvConnectedComp* comp, CvBox2D* box=0 );
     
    imgProb
    Back projection of object histogram (see cvCalcBackProject). 
    windowIn
    Initial search window. 
    criteria
    Criteria applied to determine when the window search should be finished. 
    comp
    Resultant structure that contains converged search window coordinates (comp->rect field) and sum of all pixels inside the window (comp->area field). 
    box
    Circumscribed box for the object. If not NULL, contains object size and orientation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CalcBackProject
    Calculates back projection
     
    void cvCalcBackProject( IplImage** img, CvArr* backProject, const CvHistogram* hist );
     
    img
    Source images (though you may pass CvMat** as well). 
    backProject
    Destination back projection image of the same type as the source images. 
    hist
    Histogram.
    de plus camshift réalise lui même le meanshift tu n'as pas besoin de le faire. Dans ton code tu lui fait passer ton image mais ce n'est pas l'image en paramètre, mais l'image à laquelle tu greffe la valeur de chaque pixel en terme d'histogramme cf calcbackproject.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Par défaut
    Le truc c'est que si t'utilise camshift la segmentation (background sub) tu n'as a la faire qu'une fois pour localiser ton objet et calculer son histogramme. Ensuite comme snowpy l'a dit t'utilise cvcalcbackproject(). Et tu lui passe ca pour qu'il tracke ton objet dans les autres frames.

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 3
    Par défaut
    En suivant pas à pas le camshiftdemo.c fournit avec opencv j'ai reussi à avoir ce que je voulais. J'ai par contre modifié le calcul de l'histogram pour que celui-ci ne prenne en compte qu'une seul couleur, sinon le camshift prenait un peu n'importe quoi.
    Mon logiciel est maintenant capable de détècter une personne de couleur (cad une personne ayant une couleur principal sur elle : 1 T-shirt bleu par exemple) et de la suivre avec une camera de surveillance.

    Merci pour vos réponses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Un problème d'implémentation du Camshift
    Par MohEllayali dans le forum OpenCV
    Réponses: 6
    Dernier message: 30/03/2012, 23h55
  2. Suivi par flot optique et camshift
    Par info_sara dans le forum OpenCV
    Réponses: 1
    Dernier message: 07/06/2010, 11h11
  3. [OpenCV] Camshift Meanshift
    Par SoC Fayoul dans le forum C++
    Réponses: 0
    Dernier message: 07/06/2010, 10h18
  4. suivi du visage par flot optique & camshift
    Par info_sara dans le forum Traitement d'images
    Réponses: 0
    Dernier message: 03/06/2010, 21h26
  5. la distribution de probabilité du CAMSHIFT ?
    Par MohEllayali dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 07/04/2008, 14h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo