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