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,23 +88,29 @@ int main( int argc, char** argv ) ...@@ -87,23 +88,29 @@ 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; cap >> frame;
if( frame.empty() ) if( frame.empty() )
break; break;
}
frame.copyTo(image); frame.copyTo(image);
if( !paused )
{
cvtColor(image, hsv, CV_BGR2HSV); cvtColor(image, hsv, CV_BGR2HSV);
if( trackObject ) if( trackObject )
...@@ -145,11 +152,21 @@ int main( int argc, char** argv ) ...@@ -145,11 +152,21 @@ int main( int argc, char** argv )
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