diff --git a/modules/tracking/samples/tutorial_customizing_cn_tracker.cpp b/modules/tracking/samples/tutorial_customizing_cn_tracker.cpp new file mode 100644 index 000000000..3131be397 --- /dev/null +++ b/modules/tracking/samples/tutorial_customizing_cn_tracker.cpp @@ -0,0 +1,128 @@ +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace cv; + +// prototype of the functino for feature extractor +void sobelExtractor(const Mat img, const Rect roi, Mat& feat); + +int main( int argc, char** argv ){ + // show help + if(argc<2){ + cout<< + " Usage: tracker \n" + " examples:\n" + " example_tracking_kcf Bolt/img/%04d.jpg\n" + " example_tracking_kcf faceocc2.webm\n" + << endl; + return 0; + } + + // declares all required variables + Rect2d roi; + Mat frame; + + //! [param] + TrackerKCF::Params param; + param.desc_pca = TrackerKCF::GRAY | TrackerKCF::CN; + param.desc_npca = 0; + param.compress_feature = true; + param.compressed_size = 2; + //! [param] + + // create a tracker object + //! [create] + Ptr tracker = TrackerKCF::createTracker(param); + //! [create] + + //! [setextractor] + tracker->setFeatureExtractor(sobelExtractor); + //! [setextractor] + + // set input video + std::string video = argv[1]; + VideoCapture cap(video); + + // get bounding box + cap >> frame; + roi=selectROI("tracker",frame); + + //quit if ROI was not selected + if(roi.width==0 || roi.height==0) + return 0; + + // initialize the tracker + tracker->init(frame,roi); + + // perform the tracking process + printf("Start the tracking process, press ESC to quit.\n"); + for ( ;; ){ + // get frame from the video + cap >> frame; + + // stop the program if no more images + if(frame.rows==0 || frame.cols==0) + break; + + // update the tracking result + tracker->update(frame,roi); + + // draw the tracked object + rectangle( frame, roi, Scalar( 255, 0, 0 ), 2, 1 ); + + // show image with the tracked object + imshow("tracker",frame); + + //quit on ESC button + if(waitKey(1)==27)break; + } + + return 0; +} + +void sobelExtractor(const Mat img, const Rect roi, Mat& feat){ + Mat sobel[2]; + Mat patch; + Rect region=roi; + + //! [insideimage] + // extract patch inside the image + if(roi.x<0){region.x=0;region.width+=roi.x;} + if(roi.y<0){region.y=0;region.height+=roi.y;} + if(roi.x+roi.width>img.cols)region.width=img.cols-roi.x; + if(roi.y+roi.height>img.rows)region.height=img.rows-roi.y; + if(region.width>img.cols)region.width=img.cols; + if(region.height>img.rows)region.height=img.rows; + //! [insideimage] + + patch=img(region).clone(); + cvtColor(patch,patch, CV_BGR2GRAY); + + //! [padding] + // add some padding to compensate when the patch is outside image border + int addTop,addBottom, addLeft, addRight; + addTop=region.y-roi.y; + addBottom=(roi.height+roi.y>img.rows?roi.height+roi.y-img.rows:0); + addLeft=region.x-roi.x; + addRight=(roi.width+roi.x>img.cols?roi.width+roi.x-img.cols:0); + + copyMakeBorder(patch,patch,addTop,addBottom,addLeft,addRight,BORDER_REPLICATE); + //! [padding] + + //! [sobel] + Sobel(patch, sobel[0], CV_32F,1,0,1); + Sobel(patch, sobel[1], CV_32F,0,1,1); + + merge(sobel,2,feat); + //! [sobel] + + //! [postprocess] + feat.convertTo(feat,CV_64F); + feat=feat/255.0-0.5; // normalize to range -0.5 .. 0.5 + //! [postprocess] +} diff --git a/modules/tracking/samples/tutorial_introduction_to_tracker.cpp b/modules/tracking/samples/tutorial_introduction_to_tracker.cpp new file mode 100644 index 000000000..d9907fac3 --- /dev/null +++ b/modules/tracking/samples/tutorial_introduction_to_tracker.cpp @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace cv; + +int main( int argc, char** argv ){ + // show help + //! [help] + if(argc<2){ + cout<< + " Usage: tracker \n" + " examples:\n" + " example_tracking_kcf Bolt/img/%04d.jpg\n" + " example_tracking_kcf faceocc2.webm\n" + << endl; + return 0; + } + //! [help] + + // declares all required variables + //! [vars] + Rect2d roi; + Mat frame; + //! [vars] + + // create a tracker object + //! [create] + Ptr tracker = Tracker::create( "KCF" ); + //! [create] + + // set input video + //! [setvideo] + std::string video = argv[1]; + VideoCapture cap(video); + //! [setvideo] + + // get bounding box + //! [getframe] + cap >> frame; + //! [getframe] + //! [selectroi] + roi=selectROI("tracker",frame); + //! [selectroi] + + //quit if ROI was not selected + if(roi.width==0 || roi.height==0) + return 0; + + // initialize the tracker + //! [init] + tracker->init(frame,roi); + //! [init] + + // perform the tracking process + printf("Start the tracking process, press ESC to quit.\n"); + for ( ;; ){ + // get frame from the video + cap >> frame; + + // stop the program if no more images + if(frame.rows==0 || frame.cols==0) + break; + + // update the tracking result + //! [update] + tracker->update(frame,roi); + //! [update] + + //! [visualization] + // draw the tracked object + rectangle( frame, roi, Scalar( 255, 0, 0 ), 2, 1 ); + + // show image with the tracked object + imshow("tracker",frame); + //! [visualization] + + //quit on ESC button + if(waitKey(1)==27)break; + } + + return 0; +} diff --git a/modules/tracking/samples/tutorial_multitracker.cpp b/modules/tracking/samples/tutorial_multitracker.cpp new file mode 100644 index 000000000..0d14c2087 --- /dev/null +++ b/modules/tracking/samples/tutorial_multitracker.cpp @@ -0,0 +1,99 @@ +/*---------------------------------------------- + * Usage: + * example_tracking_multitracker [algorithm] + * + * example: + * example_tracking_multitracker Bolt/img/%04d.jpg + * example_tracking_multitracker faceocc2.webm KCF + *--------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace cv; + +int main( int argc, char** argv ){ + // show help + if(argc<2){ + cout<< + " Usage: example_tracking_multitracker [algorithm]\n" + " examples:\n" + " example_tracking_multitracker Bolt/img/%04d.jpg\n" + " example_tracking_multitracker faceocc2.webm MEDIANFLOW\n" + << endl; + return 0; + } + + // set the default tracking algorithm + std::string trackingAlg = "KCF"; + + // set the tracking algorithm from parameter + if(argc>2) + trackingAlg = argv[2]; + + // create the tracker + //! [create] + MultiTracker trackers(trackingAlg); + //! [create] + + // container of the tracked objects + //! [roi] + vector objects; + //! [roi] + + // set input video + std::string video = argv[1]; + VideoCapture cap(video); + + Mat frame; + + // get bounding box + cap >> frame; + //! [selectmulti] + selectROI("tracker",frame,objects); + //! [selectmulti] + + //quit when the tracked object(s) is not provided + if(objects.size()<1) + return 0; + + // initialize the tracker + //! [init] + trackers.add(frame,objects); + //! [init] + + // do the tracking + printf("Start the tracking process, press ESC to quit.\n"); + for ( ;; ){ + // get frame from the video + cap >> frame; + + // stop the program if no more images + if(frame.rows==0 || frame.cols==0) + break; + + //update the tracking result + //! [update] + trackers.update(frame); + //! [update] + + //! [result] + // draw the tracked object + for(unsigned i=0;i + +-# **Declares the required variables** + + You need roi to record the bounding box of the tracked object. The value stored in this + variable will be updated using the tracker object. + + @snippet tracking/samples/tutorial_introduction_to_tracker.cpp vars + + The frame variable is used to hold the image data from each frame of the input video or images list. + +-# **Creating a tracker object** + + @snippet tracking/samples/tutorial_introduction_to_tracker.cpp create + + There are at least 5 types of tracker algorithms that can be used: + + MIL + + BOOSTING + + MEDIANFLOW + + TLD + + KCF + + Each tracker algorithm has their own advantages and disadvantages, please refer the documentation of @ref cv::Tracker for more detailed information. + +-# **Select the tracked object** + + @snippet tracking/samples/tutorial_introduction_to_tracker.cpp selectroi + + Using this function, you can select the bounding box of the tracked object using a GUI. + With default parameters, the selection is started from the center of the box and a middle cross will be shown. + See @ref cv::selectROI for more detailed information. + +-# **Initializing the tracker object** + + @snippet tracking/samples/tutorial_introduction_to_tracker.cpp init + + Tracker algorithm should be initialized with the provided image data as well as the bounding box of the tracked object. + Make sure that the bounding box is not valid (size more than zero) to avoid the initialization process failed. + +-# **Update** + + @snippet tracking/samples/tutorial_introduction_to_tracker.cpp update + + This update function will perform the tracking process and pass the result to the roi variable. diff --git a/modules/tracking/tutorials/tutorial_multitracker.markdown b/modules/tracking/tutorials/tutorial_multitracker.markdown new file mode 100644 index 000000000..4bc3e3c5c --- /dev/null +++ b/modules/tracking/tutorials/tutorial_multitracker.markdown @@ -0,0 +1,49 @@ +Using MultiTracker {#tutorial_multitracker} +================== + +Goal +---- + +In this tutorial you will learn how to + +- Create a MultiTracker object. +- Track several objects at once using the MultiTracker object. + +Source Code +----------- + +@includelineno tracking/samples/tutorial_multitracker.cpp + +Explanation +----------- + +-# **Create the MultiTracker object** + + @snippet tracking/samples/tutorial_multitracker.cpp create + + You can create the MultiTracker object and use the same tracking algorithm for all tracked object as shown in the snippet. + If you want to use different type of tracking algorithm for each tracked object, you should define the tracking algorithm whenever a new object is added to the MultiTracker object. + +-# **Selection of multiple objects** + + @snippet tracking/samples/tutorial_multitracker.cpp selectmulti + + You can use @ref cv::selectROI to select multiple objects with + the result stored in a vector of @ref cv::Rect2d as shown in the code. + You can also use another kind of selection scheme, please refer to @ref cv::selectROI for detailed information. + +-# **Adding the tracked object to MultiTracker** + + @snippet tracking/samples/tutorial_multitracker.cpp init + + You can add all tracked objects at once to the MultiTracker as shown in the code. + In this case, all objects will be tracked using same tracking algorithm as specified in decaration of MultiTracker object. + If you want to use different tracker algorithms for each tracked object, + You should add the tracked objects one by one and specify their tracking algorithm using the variant of @ref cv::MultiTracker::add. + @sa cv::MultiTracker::add( const String& trackerType, const Mat& image, const Rect2d& boundingBox ) + +-# **Obtaining the result** + + @snippet tracking/samples/tutorial_multitracker.cpp result + + You can access the result from the public variable @ref cv::MultiTracker::objects provided by the MultiTracker class as shown in the code.