include/opencv2/contrib/detection_based_tracker.hpp
Go to the documentation of this file.
00001 #pragma once
00002 
00003 #if defined(__linux__) || defined(LINUX) || defined(__APPLE__) || defined(ANDROID)
00004 
00005 #include <opencv2/core/core.hpp>
00006 #include <opencv2/objdetect/objdetect.hpp>
00007 
00008 #include <vector>
00009 
00010 class DetectionBasedTracker
00011 {
00012     public:
00013         struct Parameters
00014         {
00015             int minObjectSize;
00016             int maxObjectSize;
00017             double scaleFactor;
00018             int maxTrackLifetime;
00019             int minNeighbors;
00020             int minDetectionPeriod; //the minimal time between run of the big object detector (on the whole frame) in ms (1000 mean 1 sec), default=0
00021 
00022             Parameters();
00023         };
00024 
00025         DetectionBasedTracker(const std::string& cascadeFilename, const Parameters& params);
00026         virtual ~DetectionBasedTracker();
00027 
00028         virtual bool run();
00029         virtual void stop();
00030         virtual void resetTracking();
00031 
00032         virtual void process(const cv::Mat& imageGray);
00033 
00034         bool setParameters(const Parameters& params);
00035         const Parameters& getParameters();
00036 
00037 
00038         typedef std::pair<cv::Rect, int> Object;
00039         virtual void getObjects(std::vector<cv::Rect>& result) const;
00040         virtual void getObjects(std::vector<Object>& result) const;
00041 
00042     protected:
00043         class SeparateDetectionWork;
00044         cv::Ptr<SeparateDetectionWork> separateDetectionWork;
00045         friend void* workcycleObjectDetectorFunction(void* p);
00046 
00047 
00048         struct InnerParameters
00049         {
00050             int numLastPositionsToTrack;
00051             int numStepsToWaitBeforeFirstShow;
00052             int numStepsToTrackWithoutDetectingIfObjectHasNotBeenShown;
00053             int numStepsToShowWithoutDetecting;
00054 
00055             float coeffTrackingWindowSize;
00056             float coeffObjectSizeToTrack;
00057             float coeffObjectSpeedUsingInPrediction;
00058 
00059             InnerParameters();
00060         };
00061         Parameters parameters;
00062         InnerParameters innerParameters;
00063 
00064         struct TrackedObject
00065         {
00066             typedef std::vector<cv::Rect> PositionsVector;
00067 
00068             PositionsVector lastPositions;
00069 
00070             int numDetectedFrames;
00071             int numFramesNotDetected;
00072             int id;
00073 
00074             TrackedObject(const cv::Rect& rect):numDetectedFrames(1), numFramesNotDetected(0)
00075             {
00076                 lastPositions.push_back(rect);
00077                 id=getNextId();
00078             };
00079 
00080             static int getNextId()
00081             {
00082                 static int _id=0;
00083                 return _id++;
00084             }
00085         };
00086 
00087         int numTrackedSteps;
00088         std::vector<TrackedObject> trackedObjects;
00089 
00090         std::vector<float> weightsPositionsSmoothing;
00091         std::vector<float> weightsSizesSmoothing;
00092 
00093         cv::CascadeClassifier cascadeForTracking;
00094 
00095 
00096         void updateTrackedObjects(const std::vector<cv::Rect>& detectedObjects);
00097         cv::Rect calcTrackedObjectPositionToShow(int i) const;
00098         void detectInRegion(const cv::Mat& img, const cv::Rect& r, std::vector<cv::Rect>& detectedObjectsInRegions);
00099 };
00100 
00101 namespace cv
00102 {
00103     using ::DetectionBasedTracker;
00104 } //end of cv namespace
00105 
00106 #endif