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:

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.