123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539 |
- /*M///////////////////////////////////////////////////////////////////////////////////////
- //
- // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
- //
- // By downloading, copying, installing or using the software you agree to this license.
- // If you do not agree to this license, do not download, install,
- // copy or use the software.
- //
- //
- // License Agreement
- // For Open Source Computer Vision Library
- //
- // Copyright (C) 2013, OpenCV Foundation, all rights reserved.
- // Third party copyrights are property of their respective owners.
- //
- // Redistribution and use in source and binary forms, with or without modification,
- // are permitted provided that the following conditions are met:
- //
- // * Redistribution's of source code must retain the above copyright notice,
- // this list of conditions and the following disclaimer.
- //
- // * Redistribution's in binary form must reproduce the above copyright notice,
- // this list of conditions and the following disclaimer in the documentation
- // and/or other materials provided with the distribution.
- //
- // * The name of the copyright holders may not be used to endorse or promote products
- // derived from this software without specific prior written permission.
- //
- // This software is provided by the copyright holders and contributors "as is" and
- // any express or implied warranties, including, but not limited to, the implied
- // warranties of merchantability and fitness for a particular purpose are disclaimed.
- // In no event shall the Intel Corporation or contributors be liable for any direct,
- // indirect, incidental, special, exemplary, or consequential damages
- // (including, but not limited to, procurement of substitute goods or services;
- // loss of use, data, or profits; or business interruption) however caused
- // and on any theory of liability, whether in contract, strict liability,
- // or tort (including negligence or otherwise) arising in any way out of
- // the use of this software, even if advised of the possibility of such damage.
- //
- //M*/
- #ifndef OPENCV_TRACKING_LEGACY_HPP
- #define OPENCV_TRACKING_LEGACY_HPP
- /*
- * Partially based on:
- * ====================================================================================================================
- * - [AAM] S. Salti, A. Cavallaro, L. Di Stefano, Adaptive Appearance Modeling for Video Tracking: Survey and Evaluation
- * - [AMVOT] X. Li, W. Hu, C. Shen, Z. Zhang, A. Dick, A. van den Hengel, A Survey of Appearance Models in Visual Object Tracking
- *
- * This Tracking API has been designed with PlantUML. If you modify this API please change UML files under modules/tracking/doc/uml
- *
- */
- #include "tracking_internals.hpp"
- namespace cv {
- namespace legacy {
- #ifndef CV_DOXYGEN
- inline namespace tracking {
- #endif
- using namespace cv::detail::tracking;
- /** @addtogroup tracking_legacy
- @{
- */
- /************************************ Tracker Base Class ************************************/
- /** @brief Base abstract class for the long-term tracker:
- */
- class CV_EXPORTS_W Tracker : public virtual Algorithm
- {
- public:
- Tracker();
- virtual ~Tracker() CV_OVERRIDE;
- /** @brief Initialize the tracker with a known bounding box that surrounded the target
- @param image The initial frame
- @param boundingBox The initial bounding box
- @return True if initialization went succesfully, false otherwise
- */
- CV_WRAP bool init( InputArray image, const Rect2d& boundingBox );
- /** @brief Update the tracker, find the new most likely bounding box for the target
- @param image The current frame
- @param boundingBox The bounding box that represent the new target location, if true was returned, not
- modified otherwise
- @return True means that target was located and false means that tracker cannot locate target in
- current frame. Note, that latter *does not* imply that tracker has failed, maybe target is indeed
- missing from the frame (say, out of sight)
- */
- CV_WRAP bool update( InputArray image, CV_OUT Rect2d& boundingBox );
- virtual void read( const FileNode& fn ) CV_OVERRIDE = 0;
- virtual void write( FileStorage& fs ) const CV_OVERRIDE = 0;
- protected:
- virtual bool initImpl( const Mat& image, const Rect2d& boundingBox ) = 0;
- virtual bool updateImpl( const Mat& image, Rect2d& boundingBox ) = 0;
- bool isInit;
- Ptr<TrackerContribFeatureSet> featureSet;
- Ptr<TrackerContribSampler> sampler;
- Ptr<TrackerModel> model;
- };
- /************************************ Specific Tracker Classes ************************************/
- /** @brief The MIL algorithm trains a classifier in an online manner to separate the object from the
- background.
- Multiple Instance Learning avoids the drift problem for a robust tracking. The implementation is
- based on @cite MIL .
- Original code can be found here <http://vision.ucsd.edu/~bbabenko/project_miltrack.shtml>
- */
- class CV_EXPORTS_W TrackerMIL : public cv::legacy::Tracker
- {
- public:
- struct CV_EXPORTS Params : cv::TrackerMIL::Params
- {
- void read( const FileNode& fn );
- void write( FileStorage& fs ) const;
- };
- /** @brief Constructor
- @param parameters MIL parameters TrackerMIL::Params
- */
- static Ptr<legacy::TrackerMIL> create(const TrackerMIL::Params ¶meters);
- CV_WRAP static Ptr<legacy::TrackerMIL> create();
- virtual ~TrackerMIL() CV_OVERRIDE {}
- };
- /** @brief the Boosting tracker
- This is a real-time object tracking based on a novel on-line version of the AdaBoost algorithm.
- The classifier uses the surrounding background as negative examples in update step to avoid the
- drifting problem. The implementation is based on @cite OLB .
- */
- class CV_EXPORTS_W TrackerBoosting : public cv::legacy::Tracker
- {
- public:
- struct CV_EXPORTS Params
- {
- Params();
- int numClassifiers; //!<the number of classifiers to use in a OnlineBoosting algorithm
- float samplerOverlap; //!<search region parameters to use in a OnlineBoosting algorithm
- float samplerSearchFactor; //!< search region parameters to use in a OnlineBoosting algorithm
- int iterationInit; //!<the initial iterations
- int featureSetNumFeatures; //!< # features
- /**
- * \brief Read parameters from a file
- */
- void read( const FileNode& fn );
- /**
- * \brief Write parameters to a file
- */
- void write( FileStorage& fs ) const;
- };
- /** @brief Constructor
- @param parameters BOOSTING parameters TrackerBoosting::Params
- */
- static Ptr<legacy::TrackerBoosting> create(const TrackerBoosting::Params ¶meters);
- CV_WRAP static Ptr<legacy::TrackerBoosting> create();
- virtual ~TrackerBoosting() CV_OVERRIDE {}
- };
- /** @brief the Median Flow tracker
- Implementation of a paper @cite MedianFlow .
- The tracker is suitable for very smooth and predictable movements when object is visible throughout
- the whole sequence. It's quite and accurate for this type of problems (in particular, it was shown
- by authors to outperform MIL). During the implementation period the code at
- <http://www.aonsquared.co.uk/node/5>, the courtesy of the author Arthur Amarra, was used for the
- reference purpose.
- */
- class CV_EXPORTS_W TrackerMedianFlow : public cv::legacy::Tracker
- {
- public:
- struct CV_EXPORTS Params
- {
- Params(); //!<default constructor
- //!<note that the default values of parameters are recommended for most of use cases
- int pointsInGrid; //!<square root of number of keypoints used; increase it to trade
- //!<accurateness for speed
- cv::Size winSize; //!<window size parameter for Lucas-Kanade optical flow
- int maxLevel; //!<maximal pyramid level number for Lucas-Kanade optical flow
- TermCriteria termCriteria; //!<termination criteria for Lucas-Kanade optical flow
- cv::Size winSizeNCC; //!<window size around a point for normalized cross-correlation check
- double maxMedianLengthOfDisplacementDifference; //!<criterion for loosing the tracked object
- void read( const FileNode& /*fn*/ );
- void write( FileStorage& /*fs*/ ) const;
- };
- /** @brief Constructor
- @param parameters Median Flow parameters TrackerMedianFlow::Params
- */
- static Ptr<legacy::TrackerMedianFlow> create(const TrackerMedianFlow::Params ¶meters);
- CV_WRAP static Ptr<legacy::TrackerMedianFlow> create();
- virtual ~TrackerMedianFlow() CV_OVERRIDE {}
- };
- /** @brief the TLD (Tracking, learning and detection) tracker
- TLD is a novel tracking framework that explicitly decomposes the long-term tracking task into
- tracking, learning and detection.
- The tracker follows the object from frame to frame. The detector localizes all appearances that
- have been observed so far and corrects the tracker if necessary. The learning estimates detector's
- errors and updates it to avoid these errors in the future. The implementation is based on @cite TLD .
- The Median Flow algorithm (see cv::TrackerMedianFlow) was chosen as a tracking component in this
- implementation, following authors. The tracker is supposed to be able to handle rapid motions, partial
- occlusions, object absence etc.
- */
- class CV_EXPORTS_W TrackerTLD : public cv::legacy::Tracker
- {
- public:
- struct CV_EXPORTS Params
- {
- Params();
- void read( const FileNode& /*fn*/ );
- void write( FileStorage& /*fs*/ ) const;
- };
- /** @brief Constructor
- @param parameters TLD parameters TrackerTLD::Params
- */
- static Ptr<legacy::TrackerTLD> create(const TrackerTLD::Params ¶meters);
- CV_WRAP static Ptr<legacy::TrackerTLD> create();
- virtual ~TrackerTLD() CV_OVERRIDE {}
- };
- /** @brief the KCF (Kernelized Correlation Filter) tracker
- * KCF is a novel tracking framework that utilizes properties of circulant matrix to enhance the processing speed.
- * This tracking method is an implementation of @cite KCF_ECCV which is extended to KCF with color-names features (@cite KCF_CN).
- * The original paper of KCF is available at <http://www.robots.ox.ac.uk/~joao/publications/henriques_tpami2015.pdf>
- * as well as the matlab implementation. For more information about KCF with color-names features, please refer to
- * <http://www.cvl.isy.liu.se/research/objrec/visualtracking/colvistrack/index.html>.
- */
- class CV_EXPORTS_W TrackerKCF : public cv::legacy::Tracker
- {
- public:
- /**
- * \brief Feature type to be used in the tracking grayscale, colornames, compressed color-names
- * The modes available now:
- - "GRAY" -- Use grayscale values as the feature
- - "CN" -- Color-names feature
- */
- typedef enum cv::tracking::TrackerKCF::MODE MODE;
- struct CV_EXPORTS Params : cv::tracking::TrackerKCF::Params
- {
- void read(const FileNode& /*fn*/);
- void write(FileStorage& /*fs*/) const;
- };
- virtual void setFeatureExtractor(void(*)(const Mat, const Rect, Mat&), bool pca_func = false) = 0;
- /** @brief Constructor
- @param parameters KCF parameters TrackerKCF::Params
- */
- static Ptr<legacy::TrackerKCF> create(const TrackerKCF::Params ¶meters);
- CV_WRAP static Ptr<legacy::TrackerKCF> create();
- virtual ~TrackerKCF() CV_OVERRIDE {}
- };
- #if 0 // legacy variant is not available
- /** @brief the GOTURN (Generic Object Tracking Using Regression Networks) tracker
- * GOTURN (@cite GOTURN) is kind of trackers based on Convolutional Neural Networks (CNN). While taking all advantages of CNN trackers,
- * GOTURN is much faster due to offline training without online fine-tuning nature.
- * GOTURN tracker addresses the problem of single target tracking: given a bounding box label of an object in the first frame of the video,
- * we track that object through the rest of the video. NOTE: Current method of GOTURN does not handle occlusions; however, it is fairly
- * robust to viewpoint changes, lighting changes, and deformations.
- * Inputs of GOTURN are two RGB patches representing Target and Search patches resized to 227x227.
- * Outputs of GOTURN are predicted bounding box coordinates, relative to Search patch coordinate system, in format X1,Y1,X2,Y2.
- * Original paper is here: <http://davheld.github.io/GOTURN/GOTURN.pdf>
- * As long as original authors implementation: <https://github.com/davheld/GOTURN#train-the-tracker>
- * Implementation of training algorithm is placed in separately here due to 3d-party dependencies:
- * <https://github.com/Auron-X/GOTURN_Training_Toolkit>
- * GOTURN architecture goturn.prototxt and trained model goturn.caffemodel are accessible on opencv_extra GitHub repository.
- */
- class CV_EXPORTS_W TrackerGOTURN : public cv::legacy::Tracker
- {
- public:
- struct CV_EXPORTS Params
- {
- Params();
- void read(const FileNode& /*fn*/);
- void write(FileStorage& /*fs*/) const;
- String modelTxt;
- String modelBin;
- };
- /** @brief Constructor
- @param parameters GOTURN parameters TrackerGOTURN::Params
- */
- static Ptr<legacy::TrackerGOTURN> create(const TrackerGOTURN::Params ¶meters);
- CV_WRAP static Ptr<legacy::TrackerGOTURN> create();
- virtual ~TrackerGOTURN() CV_OVERRIDE {}
- };
- #endif
- /** @brief the MOSSE (Minimum Output Sum of Squared %Error) tracker
- The implementation is based on @cite MOSSE Visual Object Tracking using Adaptive Correlation Filters
- @note this tracker works with grayscale images, if passed bgr ones, they will get converted internally.
- */
- class CV_EXPORTS_W TrackerMOSSE : public cv::legacy::Tracker
- {
- public:
- /** @brief Constructor
- */
- CV_WRAP static Ptr<legacy::TrackerMOSSE> create();
- virtual ~TrackerMOSSE() CV_OVERRIDE {}
- };
- /************************************ MultiTracker Class ---By Laksono Kurnianggoro---) ************************************/
- /** @brief This class is used to track multiple objects using the specified tracker algorithm.
- * The %MultiTracker is naive implementation of multiple object tracking.
- * It process the tracked objects independently without any optimization accross the tracked objects.
- */
- class CV_EXPORTS_W MultiTracker : public Algorithm
- {
- public:
- /**
- * \brief Constructor.
- */
- CV_WRAP MultiTracker();
- /**
- * \brief Destructor
- */
- ~MultiTracker() CV_OVERRIDE;
- /**
- * \brief Add a new object to be tracked.
- *
- * @param newTracker tracking algorithm to be used
- * @param image input image
- * @param boundingBox a rectangle represents ROI of the tracked object
- */
- CV_WRAP bool add(Ptr<cv::legacy::Tracker> newTracker, InputArray image, const Rect2d& boundingBox);
- /**
- * \brief Add a set of objects to be tracked.
- * @param newTrackers list of tracking algorithms to be used
- * @param image input image
- * @param boundingBox list of the tracked objects
- */
- bool add(std::vector<Ptr<legacy::Tracker> > newTrackers, InputArray image, std::vector<Rect2d> boundingBox);
- /**
- * \brief Update the current tracking status.
- * The result will be saved in the internal storage.
- * @param image input image
- */
- bool update(InputArray image);
- /**
- * \brief Update the current tracking status.
- * @param image input image
- * @param boundingBox the tracking result, represent a list of ROIs of the tracked objects.
- */
- CV_WRAP bool update(InputArray image, CV_OUT std::vector<Rect2d> & boundingBox);
- /**
- * \brief Returns a reference to a storage for the tracked objects, each object corresponds to one tracker algorithm
- */
- CV_WRAP const std::vector<Rect2d>& getObjects() const;
- /**
- * \brief Returns a pointer to a new instance of MultiTracker
- */
- CV_WRAP static Ptr<MultiTracker> create();
- protected:
- //!< storage for the tracker algorithms.
- std::vector< Ptr<Tracker> > trackerList;
- //!< storage for the tracked objects, each object corresponds to one tracker algorithm.
- std::vector<Rect2d> objects;
- };
- /************************************ Multi-Tracker Classes ---By Tyan Vladimir---************************************/
- /** @brief Base abstract class for the long-term Multi Object Trackers:
- @sa Tracker, MultiTrackerTLD
- */
- class CV_EXPORTS MultiTracker_Alt
- {
- public:
- /** @brief Constructor for Multitracker
- */
- MultiTracker_Alt()
- {
- targetNum = 0;
- }
- /** @brief Add a new target to a tracking-list and initialize the tracker with a known bounding box that surrounded the target
- @param image The initial frame
- @param boundingBox The initial bounding box of target
- @param tracker_algorithm Multi-tracker algorithm
- @return True if new target initialization went succesfully, false otherwise
- */
- bool addTarget(InputArray image, const Rect2d& boundingBox, Ptr<legacy::Tracker> tracker_algorithm);
- /** @brief Update all trackers from the tracking-list, find a new most likely bounding boxes for the targets
- @param image The current frame
- @return True means that all targets were located and false means that tracker couldn't locate one of the targets in
- current frame. Note, that latter *does not* imply that tracker has failed, maybe target is indeed
- missing from the frame (say, out of sight)
- */
- bool update(InputArray image);
- /** @brief Current number of targets in tracking-list
- */
- int targetNum;
- /** @brief Trackers list for Multi-Object-Tracker
- */
- std::vector <Ptr<Tracker> > trackers;
- /** @brief Bounding Boxes list for Multi-Object-Tracker
- */
- std::vector <Rect2d> boundingBoxes;
- /** @brief List of randomly generated colors for bounding boxes display
- */
- std::vector<Scalar> colors;
- };
- /** @brief Multi Object %Tracker for TLD.
- TLD is a novel tracking framework that explicitly decomposes
- the long-term tracking task into tracking, learning and detection.
- The tracker follows the object from frame to frame. The detector localizes all appearances that
- have been observed so far and corrects the tracker if necessary. The learning estimates detector's
- errors and updates it to avoid these errors in the future. The implementation is based on @cite TLD .
- The Median Flow algorithm (see cv::TrackerMedianFlow) was chosen as a tracking component in this
- implementation, following authors. The tracker is supposed to be able to handle rapid motions, partial
- occlusions, object absence etc.
- @sa Tracker, MultiTracker, TrackerTLD
- */
- class CV_EXPORTS MultiTrackerTLD : public MultiTracker_Alt
- {
- public:
- /** @brief Update all trackers from the tracking-list, find a new most likely bounding boxes for the targets by
- optimized update method using some techniques to speedup calculations specifically for MO TLD. The only limitation
- is that all target bounding boxes should have approximately same aspect ratios. Speed boost is around 20%
- @param image The current frame.
- @return True means that all targets were located and false means that tracker couldn't locate one of the targets in
- current frame. Note, that latter *does not* imply that tracker has failed, maybe target is indeed
- missing from the frame (say, out of sight)
- */
- bool update_opt(InputArray image);
- };
- /*********************************** CSRT ************************************/
- /** @brief the CSRT tracker
- The implementation is based on @cite Lukezic_IJCV2018 Discriminative Correlation Filter with Channel and Spatial Reliability
- */
- class CV_EXPORTS_W TrackerCSRT : public cv::legacy::Tracker
- {
- public:
- struct CV_EXPORTS Params : cv::tracking::TrackerCSRT::Params
- {
- /**
- * \brief Read parameters from a file
- */
- void read(const FileNode& /*fn*/);
- /**
- * \brief Write parameters to a file
- */
- void write(cv::FileStorage& fs) const;
- };
- /** @brief Constructor
- @param parameters CSRT parameters TrackerCSRT::Params
- */
- static Ptr<legacy::TrackerCSRT> create(const TrackerCSRT::Params ¶meters);
- CV_WRAP static Ptr<legacy::TrackerCSRT> create();
- CV_WRAP virtual void setInitialMask(InputArray mask) = 0;
- virtual ~TrackerCSRT() CV_OVERRIDE {}
- };
- CV_EXPORTS_W Ptr<cv::Tracker> upgradeTrackingAPI(const Ptr<legacy::Tracker>& legacy_tracker);
- //! @}
- #ifndef CV_DOXYGEN
- } // namespace
- #endif
- }} // namespace
- #endif // OPENCV_TRACKING_LEGACY_HPP
|