2 #pragma package <opencv>
5 #define CV_NO_BACKWARD_COMPATIBILITY
14 IplImage *image = 0, *hsv = 0, *hue = 0, *mask = 0, *backproject = 0, *histimg = 0;
15 CvHistogram *hist = 0;
17 int backproject_mode = 0;
18 int select_object = 0;
25 CvConnectedComp track_comp;
27 float hranges_arr[] = {0,180};
28 float* hranges = hranges_arr;
29 int vmin = 10, vmax = 256, smin = 30;
31 void on_mouse( int event, int x, int y, int flags, void* param )
37 y = image->height - y;
41 selection.x = MIN(x,origin.x);
42 selection.y = MIN(y,origin.y);
43 selection.width = selection.x + CV_IABS(x - origin.x);
44 selection.height = selection.y + CV_IABS(y - origin.y);
46 selection.x = MAX( selection.x, 0 );
47 selection.y = MAX( selection.y, 0 );
48 selection.width = MIN( selection.width, image->width );
49 selection.height = MIN( selection.height, image->height );
50 selection.width -= selection.x;
51 selection.height -= selection.y;
56 case CV_EVENT_LBUTTONDOWN:
57 origin = cvPoint(x,y);
58 selection = cvRect(x,y,0,0);
61 case CV_EVENT_LBUTTONUP:
63 if( selection.width > 0 && selection.height > 0 )
70 CvScalar hsv2rgb( float hue )
72 int rgb[3], p, sector;
73 static const int sector_data[][3]=
74 {{0,2,1}, {1,2,0}, {1,0,2}, {2,0,1}, {2,1,0}, {0,1,2}};
75 hue *= 0.033333333333333333333333333333333f;
76 sector = cvFloor(hue);
77 p = cvRound(255*(hue - sector));
78 p ^= sector & 1 ? 255 : 0;
80 rgb[sector_data[sector][0]] = 255;
81 rgb[sector_data[sector][1]] = 0;
82 rgb[sector_data[sector][2]] = p;
84 return cvScalar(rgb[2], rgb[1], rgb[0],0);
87 int main( int argc, char** argv )
89 CvCapture* capture = 0;
91 if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))
92 capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 );
94 capture = cvCaptureFromAVI( argv[1] );
98 fprintf(stderr,"Could not initialize capturing...\n");
102 printf( "Hot keys: \n"
103 "\tESC - quit the program\n"
104 "\tc - stop the tracking\n"
105 "\tb - switch to/from backprojection view\n"
106 "\th - show/hide object histogram\n"
107 "To initialize tracking, select the object with mouse\n" );
109 cvNamedWindow( "Histogram", 1 );
110 cvNamedWindow( "CamShiftDemo", 1 );
111 cvSetMouseCallback( "CamShiftDemo", on_mouse, 0 );
112 cvCreateTrackbar( "Vmin", "CamShiftDemo", &vmin, 256, 0 );
113 cvCreateTrackbar( "Vmax", "CamShiftDemo", &vmax, 256, 0 );
114 cvCreateTrackbar( "Smin", "CamShiftDemo", &smin, 256, 0 );
121 frame = cvQueryFrame( capture );
127 /* allocate all the buffers */
128 image = cvCreateImage( cvGetSize(frame), 8, 3 );
129 image->origin = frame->origin;
130 hsv = cvCreateImage( cvGetSize(frame), 8, 3 );
131 hue = cvCreateImage( cvGetSize(frame), 8, 1 );
132 mask = cvCreateImage( cvGetSize(frame), 8, 1 );
133 backproject = cvCreateImage( cvGetSize(frame), 8, 1 );
134 hist = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, &hranges, 1 );
135 histimg = cvCreateImage( cvSize(320,200), 8, 3 );
139 cvCopy( frame, image, 0 );
140 cvCvtColor( image, hsv, CV_BGR2HSV );
144 int _vmin = vmin, _vmax = vmax;
146 cvInRangeS( hsv, cvScalar(0,smin,MIN(_vmin,_vmax),0),
147 cvScalar(180,256,MAX(_vmin,_vmax),0), mask );
148 cvSplit( hsv, hue, 0, 0, 0 );
150 if( track_object < 0 )
153 cvSetImageROI( hue, selection );
154 cvSetImageROI( mask, selection );
155 cvCalcHist( &hue, hist, 0, mask );
156 cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 );
157 cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 );
158 cvResetImageROI( hue );
159 cvResetImageROI( mask );
160 track_window = selection;
164 bin_w = histimg->width / hdims;
165 for( i = 0; i < hdims; i++ )
167 int val = cvRound( cvGetReal1D(hist->bins,i)*histimg->height/255 );
168 CvScalar color = hsv2rgb(i*180.f/hdims);
169 cvRectangle( histimg, cvPoint(i*bin_w,histimg->height),
170 cvPoint((i+1)*bin_w,histimg->height - val),
175 cvCalcBackProject( &hue, backproject, hist );
176 cvAnd( backproject, mask, backproject, 0 );
177 cvCamShift( backproject, track_window,
178 cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ),
179 &track_comp, &track_box );
180 track_window = track_comp.rect;
182 if( backproject_mode )
183 cvCvtColor( backproject, image, CV_GRAY2BGR );
185 track_box.angle = -track_box.angle;
186 cvEllipseBox( image, track_box, CV_RGB(255,0,0), 3, CV_AA, 0 );
189 if( select_object && selection.width > 0 && selection.height > 0 )
191 cvSetImageROI( image, selection );
192 cvXorS( image, cvScalarAll(255), image, 0 );
193 cvResetImageROI( image );
196 cvShowImage( "CamShiftDemo", image );
197 cvShowImage( "Histogram", histimg );
205 backproject_mode ^= 1;
214 cvDestroyWindow( "Histogram" );
216 cvNamedWindow( "Histogram", 1 );
223 cvReleaseCapture( &capture );
224 cvDestroyWindow("CamShiftDemo");
230 main(1,"camshiftdemo.c");