Commit d5ba7c38 authored by Vadim Pisarevsky's avatar Vadim Pisarevsky

fixed crashes in camshiftdemo (ticket #875)

parent 3ca31dcd
...@@ -90,6 +90,13 @@ cvMeanShift( const void* imgProb, CvRect windowIn, ...@@ -90,6 +90,13 @@ cvMeanShift( const void* imgProb, CvRect windowIn,
int dx, dy, nx, ny; int dx, dy, nx, ny;
double inv_m00; double inv_m00;
cur_rect = cv::Rect(cur_rect) & cv::Rect(0, 0, mat->cols, mat->rows); cur_rect = cv::Rect(cur_rect) & cv::Rect(0, 0, mat->cols, mat->rows);
if( cv::Rect(cur_rect) == cv::Rect() )
{
cur_rect.x = mat->cols/2;
cur_rect.y = mat->rows/2;
}
cur_rect.width = MAX(cur_rect.width, 1);
cur_rect.height = MAX(cur_rect.height, 1);
cvGetSubRect( mat, &cur_win, cur_rect ); cvGetSubRect( mat, &cur_win, cur_rect );
cvMoments( &cur_win, &moments ); cvMoments( &cur_win, &moments );
......
...@@ -22,6 +22,7 @@ void help() ...@@ -22,6 +22,7 @@ void help()
"\tc - stop the tracking\n" "\tc - stop the tracking\n"
"\tb - switch to/from backprojection view\n" "\tb - switch to/from backprojection view\n"
"\th - show/hide object histogram\n" "\th - show/hide object histogram\n"
"\tp - pause video\n"
"To initialize tracking, select the object with mouse\n" << endl; "To initialize tracking, select the object with mouse\n" << endl;
} }
...@@ -87,69 +88,85 @@ int main( int argc, char** argv ) ...@@ -87,69 +88,85 @@ int main( int argc, char** argv )
help(); help();
namedWindow( "Histogram", 1 ); namedWindow( "Histogram", 0 );
namedWindow( "CamShift Demo", 1 ); namedWindow( "CamShift Demo", 0 );
setMouseCallback( "CamShift Demo", onMouse, 0 ); setMouseCallback( "CamShift Demo", onMouse, 0 );
createTrackbar( "Vmin", "CamShift Demo", &vmin, 256, 0 ); createTrackbar( "Vmin", "CamShift Demo", &vmin, 256, 0 );
createTrackbar( "Vmax", "CamShift Demo", &vmax, 256, 0 ); createTrackbar( "Vmax", "CamShift Demo", &vmax, 256, 0 );
createTrackbar( "Smin", "CamShift Demo", &smin, 256, 0 ); createTrackbar( "Smin", "CamShift Demo", &smin, 256, 0 );
Mat hsv, hue, mask, hist, histimg = Mat::zeros(200, 320, CV_8UC3), backproj; Mat frame, hsv, hue, mask, hist, histimg = Mat::zeros(200, 320, CV_8UC3), backproj;
bool paused = false;
for(;;) for(;;)
{ {
Mat frame; if( !paused )
cap >> frame; {
if( frame.empty() ) cap >> frame;
break; if( frame.empty() )
break;
}
frame.copyTo(image); frame.copyTo(image);
cvtColor(image, hsv, CV_BGR2HSV);
if( !paused )
if( trackObject )
{ {
int _vmin = vmin, _vmax = vmax; cvtColor(image, hsv, CV_BGR2HSV);
inRange(hsv, Scalar(0, smin, MIN(_vmin,_vmax)), if( trackObject )
Scalar(180, 256, MAX(_vmin, _vmax)), mask);
int ch[] = {0, 0};
hue.create(hsv.size(), hsv.depth());
mixChannels(&hsv, 1, &hue, 1, ch, 1);
if( trackObject < 0 )
{ {
Mat roi(hue, selection), maskroi(mask, selection); int _vmin = vmin, _vmax = vmax;
calcHist(&roi, 1, 0, maskroi, hist, 1, &hsize, &phranges);
normalize(hist, hist, 0, 255, CV_MINMAX); inRange(hsv, Scalar(0, smin, MIN(_vmin,_vmax)),
Scalar(180, 256, MAX(_vmin, _vmax)), mask);
trackWindow = selection; int ch[] = {0, 0};
trackObject = 1; hue.create(hsv.size(), hsv.depth());
mixChannels(&hsv, 1, &hue, 1, ch, 1);
histimg = Scalar::all(0);
int binW = histimg.cols / hsize; if( trackObject < 0 )
Mat buf(1, hsize, CV_8UC3);
for( int i = 0; i < hsize; i++ )
buf.at<Vec3b>(i) = Vec3b(saturate_cast<uchar>(i*180./hsize), 255, 255);
cvtColor(buf, buf, CV_HSV2BGR);
for( int i = 0; i < hsize; i++ )
{ {
int val = saturate_cast<int>(hist.at<float>(i)*histimg.rows/255); Mat roi(hue, selection), maskroi(mask, selection);
rectangle( histimg, Point(i*binW,histimg.rows), calcHist(&roi, 1, 0, maskroi, hist, 1, &hsize, &phranges);
Point((i+1)*binW,histimg.rows - val), normalize(hist, hist, 0, 255, CV_MINMAX);
Scalar(buf.at<Vec3b>(i)), -1, 8 );
trackWindow = selection;
trackObject = 1;
histimg = Scalar::all(0);
int binW = histimg.cols / hsize;
Mat buf(1, hsize, CV_8UC3);
for( int i = 0; i < hsize; i++ )
buf.at<Vec3b>(i) = Vec3b(saturate_cast<uchar>(i*180./hsize), 255, 255);
cvtColor(buf, buf, CV_HSV2BGR);
for( int i = 0; i < hsize; i++ )
{
int val = saturate_cast<int>(hist.at<float>(i)*histimg.rows/255);
rectangle( histimg, Point(i*binW,histimg.rows),
Point((i+1)*binW,histimg.rows - val),
Scalar(buf.at<Vec3b>(i)), -1, 8 );
}
} }
}
calcBackProject(&hue, 1, 0, hist, backproj, &phranges); calcBackProject(&hue, 1, 0, hist, backproj, &phranges);
backproj &= mask; backproj &= mask;
RotatedRect trackBox = CamShift(backproj, trackWindow, RotatedRect trackBox = CamShift(backproj, trackWindow,
TermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 )); TermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ));
if( trackWindow.area() <= 1 )
{
int cols = backproj.cols, rows = backproj.rows, r = (MIN(cols, rows) + 5)/6;
trackWindow = Rect(trackWindow.x - r, trackWindow.y - r,
trackWindow.x + r, trackWindow.y + r) &
Rect(0, 0, cols, rows);
}
if( backprojMode ) if( backprojMode )
cvtColor( backproj, image, CV_GRAY2BGR ); cvtColor( backproj, image, CV_GRAY2BGR );
ellipse( image, trackBox, Scalar(0,0,255), 3, CV_AA ); ellipse( image, trackBox, Scalar(0,0,255), 3, CV_AA );
}
} }
else if( trackObject < 0 )
paused = false;
if( selectObject && selection.width > 0 && selection.height > 0 ) if( selectObject && selection.width > 0 && selection.height > 0 )
{ {
...@@ -179,6 +196,9 @@ int main( int argc, char** argv ) ...@@ -179,6 +196,9 @@ int main( int argc, char** argv )
else else
namedWindow( "Histogram", 1 ); namedWindow( "Histogram", 1 );
break; break;
case 'p':
paused = !paused;
break;
default: default:
; ;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment