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
|
int hdims = 128;
float hranges_arr[] = {0,180};
float* hranges = hranges_arr;
//Utilisation de l'espace HSV:
cvCvtColor( image, hsv, CV_BGR2HSV);
if( track_object )
{
//Début du traitement:
//On crée un masque en limitant les couleurs:
if(track_object < 0)
cvInRangeS( hsv, cvScalar(0,50,50), cvScalar(50,200,200), mask );
else
cvInRangeS( hsv, cvScalar(hVal - 5,30, 10), cvScalar(hVal + 5,200,200), mask );
cvSplit( hsv, hue, 0, 0, 0 );
cvShowImage("Mask",mask);
if( track_object < 0 )
{
float max_val = 0.f;
//On ne s'intéresse qu'a la sélection de l'utilisateur.
cvSetImageROI( hue, selection);
cvSetImageROI( mask, selection);
cvCalcHist( &hue, hist, 0, mask );
cvGetMinMaxHistValue( hist, 0, &max_val, 0, &hVal );
cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 );
//Limitation des problèmes de bord:
if(hVal < 5)
hVal = 5;
if(hVal > 355)
hVal = 355;
cvResetImageROI( hue );
cvResetImageROI( mask );
track_window = selection;
track_object = 1;
}
//On lance le Camshift:
cvCalcBackProject( &hue, backproject, hist );
cvAnd( backproject, mask, backproject, 0 );
cvShowImage("Backproject",backproject);
cvCamShift( backproject, track_window, cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ), &track_comp, &track_box);
track_window = track_comp.rect;
} |
Partager