Bonjour, je développe actuellement un programme qui effectue le suivi de plusieurs objets en fonction de leur couleur. Au début, je ne pouvais suivre qu'un seul objet et la vitesse d'exécution du programme était satisfaisante. Mais depuis que j'ai étendu les possibilités de mon programme au suivi de deux objets, l'exécution devient beaucoup plus longue et je me pose la question de savoir si je m'y prends de la bonne manière

Voici comment j'ai procédé :
J'ai commencé par binariser l'image en fonction de la couleur de l'objet qu'on veut suivre. C'est à dire que j'ai créé un masque où la couleur à suivre est blanche et le reste est noir.
J'ai ensuite effectué un 'dilate' et un 'erode' pour que l'objet soit bien défini.
Le barycentre de l'objet est ensuite créé, puis on affiche le point résultant à l'écran.

Je voudrais savoir comment vous procéderiez pour développer un programme capable de gérer le suivi de deux objets de même couleur. Car je ne sais pas encore comment programmé un code capable de dissocier deux amas de couleur (correspondant à chaque objet). Car jusqu'à présent, le programme effectuait le calcul barycentrique de tout les pixels qui correspondent à la couleur suivie.

Et voilà un extrait du code source étendu dont la base est disponible sur ce site :

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//
// Cette fonction binarise l'image en deux classes : l'une représentera les pixels associés à la couleur que l'on veut suivre
// et l'autre représentera ceux que l'on veut masquer.
// Deux données sont créées : le nombre de pixels associés à la couleur suivie et le barycentre de ces mêmes pixels.
//
void binarisation(IplImage* image, int *nbPixels1, int *nbPixels2, CvPoint* point1, CvPoint* point2)
{
	IplImage *hsv, *mask1,*mask2;
	IplConvKernel *kernel;
 
	int x, y;
	int sumX1 = 0, sumY1 = 0;
	int sumX2 = 0, sumY2 = 0;
	*nbPixels1 = 0;
	*nbPixels2 = 0;
 
	// Create the mask & initialize it to white (no color detected)
	mask1 = cvCreateImage(cvGetSize(image), image->depth, 1);
	mask2 = cvCreateImage(cvGetSize(image), image->depth, 1);
 
	// Create the hsv image
	hsv = cvCloneImage(image);
	cvCvtColor(image, hsv, CV_BGR2HSV);
 
	// Create the mask
	cvInRangeS(hsv, cvScalar(h1 - tolerance -1, s1 - tolerance, 0), cvScalar(h1 + tolerance -1, s1 + tolerance, 255), mask1);
	cvInRangeS(hsv, cvScalar(h2 - tolerance -1, s2 - tolerance, 0), cvScalar(h2 + tolerance -1, s2 + tolerance, 255), mask2);
 
	// Create kernels for the morphological operation
	kernel = cvCreateStructuringElementEx(5, 5, 2, 2, CV_SHAPE_ELLIPSE);
 
	// Morphological opening
	cvDilate(mask1, mask1, kernel, 1);
	cvErode(mask1, mask1, kernel, 1);
 
	cvDilate(mask2, mask2, kernel, 1);
	cvErode(mask2, mask2, kernel, 1);
 
	// We go through the mask to look for the tracked object and get its gravity center
	for (x = 0; x < mask1->width; x++)
	{
		for (y = 0; y < mask1->height; y++)
		{
			// If it is a tracked pixel, count it to the center of gravity's calcul
			if(((uchar *)(mask1->imageData + y*mask1->widthStep))[x] == 255)
			{
				sumX1 += x;
				sumY1 += y;
				(*nbPixels1)++;
			}
		}
	}
 
	for (x = 0; x < mask2->width; x++)
	{
		for (y = 0; y < mask2->height; y++)
		{
			// If it is a tracked pixel, count it to the center of gravity's calcul
			if(((uchar *)(mask2->imageData + y*mask2->widthStep))[x] == 255)
			{
				sumX2 += x;
				sumY2 += y;
				(*nbPixels2)++;
			}
		}
	}
 
	// Show the result of the mask image
	cvShowImage("Mask Window 1", mask1);
	cvShowImage("Mask Window 2", mask2);
 
	// We release the memory of kernels
	cvReleaseStructuringElement(&kernel);
 
	// We release the memory of the mask
	cvReleaseImage(&mask1);
	cvReleaseImage(&mask2);
	// We release the memory of the hsv image
	cvReleaseImage(&hsv);
 
	// If there is no pixel, we return a center outside the image, else we return the center of gravity
	if (*nbPixels1 > 0)
		*point1= cvPoint((int)(sumX1 / (*nbPixels1)), (int)(sumY1 / (*nbPixels1)));
	else
		*point1= cvPoint(-1, -1);
 
	if (*nbPixels2 > 0)
		*point2= cvPoint((int)(sumX2 / (*nbPixels2)), (int)(sumY2 / (*nbPixels2)));
	else
		*point2= cvPoint(-1, -1);
}
En vous remerciant d'avance pour vos réponses