#include #include #include #include #include #include #include "samples_utility.hpp" using namespace std; using namespace cv; static const char* keys = { "{@tracker_algorithm | | Tracker algorithm }" "{@video_name | | video name }" "{@start_frame |0| Start frame }" "{@bounding_frame |0,0,0,0| Initial bounding frame}"}; static void help() { cout << "\nThis example shows the functionality of \"Long-term optical tracking API\"" "-- pause video [p] and draw a bounding box around the target to start the tracker\n" "Example of is in opencv_extra/testdata/cv/tracking/\n" "Call:\n" "./tracker []\n" "tracker_algorithm can be: MIL, BOOSTING, MEDIANFLOW, TLD, KCF, GOTURN, MOSSE.\n" << endl; cout << "\n\nHot keys: \n" "\tq - quit the program\n" "\tp - pause video\n"; } int main( int argc, char** argv ){ CommandLineParser parser( argc, argv, keys ); String tracker_algorithm = parser.get( 0 ); String video_name = parser.get( 1 ); int start_frame = parser.get( 2 ); if( tracker_algorithm.empty() || video_name.empty() ) { help(); return -1; } int coords[4]={0,0,0,0}; bool initBoxWasGivenInCommandLine=false; { String initBoundingBox=parser.get(3); for(size_t npos=0,pos=0,ctr=0;ctr<4;ctr++){ npos=initBoundingBox.find_first_of(',',pos); if(npos==string::npos && ctr<3){ printf("bounding box should be given in format \"x1,y1,x2,y2\",where x's and y's are integer coordinates of opposed corners of bdd box\n"); printf("got: %s\n",initBoundingBox.substr(pos,string::npos).c_str()); printf("manual selection of bounding box will be employed\n"); break; } int num=atoi(initBoundingBox.substr(pos,(ctr==3)?(string::npos):(npos-pos)).c_str()); if(num<=0){ printf("bounding box should be given in format \"x1,y1,x2,y2\",where x's and y's are integer coordinates of opposed corners of bdd box\n"); printf("got: %s\n",initBoundingBox.substr(pos,npos-pos).c_str()); printf("manual selection of bounding box will be employed\n"); break; } coords[ctr]=num; pos=npos+1; } if(coords[0]>0 && coords[1]>0 && coords[2]>0 && coords[3]>0){ initBoxWasGivenInCommandLine=true; } } //open the capture VideoCapture cap; cap.open( video_name ); cap.set( CAP_PROP_POS_FRAMES, start_frame ); if( !cap.isOpened() ) { help(); cout << "***Could not initialize capturing...***\n"; cout << "Current parameter's value: \n"; parser.printMessage(); return -1; } Mat frame; namedWindow( "Tracking API", 1 ); Mat image; Rect2d boundingBox; bool paused = false; //instantiates the specific Tracker Ptr tracker = createTrackerByName(tracker_algorithm); if (!tracker) { cout << "***Error in the instantiation of the tracker...***\n"; return -1; } //get the first frame cap >> frame; frame.copyTo( image ); if(initBoxWasGivenInCommandLine){ boundingBox.x = coords[0]; boundingBox.y = coords[1]; boundingBox.width = std::abs( coords[2] - coords[0] ); boundingBox.height = std::abs( coords[3]-coords[1]); printf("bounding box with vertices (%d,%d) and (%d,%d) was given in command line\n",coords[0],coords[1],coords[2],coords[3]); rectangle( image, boundingBox, Scalar( 255, 0, 0 ), 2, 1 ); } else boundingBox = selectROI("Tracking API", image); imshow( "Tracking API", image ); bool initialized = false; int frameCounter = 0; int64 timeTotal = 0; for ( ;; ) { if( !paused ) { if(initialized){ cap >> frame; if(frame.empty()){ break; } frame.copyTo( image ); } if( !initialized ) { //initializes the tracker if( !tracker->init( frame, boundingBox ) ) { cout << "***Could not initialize tracker...***\n"; return -1; } initialized = true; } else if( initialized ) { int64 frameTime = getTickCount(); //updates the tracker if( tracker->update( frame, boundingBox ) ) { rectangle( image, boundingBox, Scalar( 255, 0, 0 ), 2, 1 ); } frameTime = getTickCount() - frameTime; timeTotal += frameTime; } imshow( "Tracking API", image ); frameCounter++; } char c = (char) waitKey( 2 ); if( c == 'q' ) break; if( c == 'p' ) paused = !paused; } double s = frameCounter / (timeTotal / getTickFrequency()); printf("FPS: %f\n", s); return 0; }