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);
} |
Partager