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.