123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- #include <opencv2/core/utility.hpp>
- #include <opencv2/tracking.hpp>
- #include <opencv2/videoio.hpp>
- #include <opencv2/highgui.hpp>
- #include <iostream>
- #include <cstring>
- #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 <video_name> is in opencv_extra/testdata/cv/tracking/\n"
- "Call:\n"
- "./tracker <tracker_algorithm> <video_name> <start_frame> [<bounding_frame>]\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<String>( 0 );
- String video_name = parser.get<String>( 1 );
- int start_frame = parser.get<int>( 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<String>(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;
- Rect boundingBox;
- bool paused = false;
- //instantiates the specific Tracker
- Ptr<Tracker> 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
- tracker->init(frame, boundingBox);
- 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;
- }
|