SDC C-Project CF Review 프로그램
LAPTOP-N7PT1MHU\dit-709
2021-05-10 a94966aed7229fbacf418acf73dfb0885050f47d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#pragma once
 
#if defined(__linux__) || defined(LINUX) || defined(__APPLE__) || defined(ANDROID)
 
#include <opencv2/core/core.hpp>
#include <opencv2/objdetect/objdetect.hpp>
 
#include <vector>
 
class DetectionBasedTracker
{
    public:
        struct Parameters
        {
            int minObjectSize;
            int maxObjectSize;
            double scaleFactor;
            int maxTrackLifetime;
            int minNeighbors;
            int minDetectionPeriod; //the minimal time between run of the big object detector (on the whole frame) in ms (1000 mean 1 sec), default=0
 
            Parameters();
        };
 
        DetectionBasedTracker(const std::string& cascadeFilename, const Parameters& params);
        virtual ~DetectionBasedTracker();
 
        virtual bool run();
        virtual void stop();
        virtual void resetTracking();
 
        virtual void process(const cv::Mat& imageGray);
 
        bool setParameters(const Parameters& params);
        const Parameters& getParameters();
 
 
        typedef std::pair<cv::Rect, int> Object;
        virtual void getObjects(std::vector<cv::Rect>& result) const;
        virtual void getObjects(std::vector<Object>& result) const;
 
    protected:
        class SeparateDetectionWork;
        cv::Ptr<SeparateDetectionWork> separateDetectionWork;
        friend void* workcycleObjectDetectorFunction(void* p);
 
 
        struct InnerParameters
        {
            int numLastPositionsToTrack;
            int numStepsToWaitBeforeFirstShow;
            int numStepsToTrackWithoutDetectingIfObjectHasNotBeenShown;
            int numStepsToShowWithoutDetecting;
 
            float coeffTrackingWindowSize;
            float coeffObjectSizeToTrack;
            float coeffObjectSpeedUsingInPrediction;
 
            InnerParameters();
        };
        Parameters parameters;
        InnerParameters innerParameters;
 
        struct TrackedObject
        {
            typedef std::vector<cv::Rect> PositionsVector;
 
            PositionsVector lastPositions;
 
            int numDetectedFrames;
            int numFramesNotDetected;
            int id;
 
            TrackedObject(const cv::Rect& rect):numDetectedFrames(1), numFramesNotDetected(0)
            {
                lastPositions.push_back(rect);
                id=getNextId();
            };
 
            static int getNextId()
            {
                static int _id=0;
                return _id++;
            }
        };
 
        int numTrackedSteps;
        std::vector<TrackedObject> trackedObjects;
 
        std::vector<float> weightsPositionsSmoothing;
        std::vector<float> weightsSizesSmoothing;
 
        cv::CascadeClassifier cascadeForTracking;
 
 
        void updateTrackedObjects(const std::vector<cv::Rect>& detectedObjects);
        cv::Rect calcTrackedObjectPositionToShow(int i) const;
        void detectInRegion(const cv::Mat& img, const cv::Rect& r, std::vector<cv::Rect>& detectedObjectsInRegions);
};
 
namespace cv
{
    using ::DetectionBasedTracker;
} //end of cv namespace
 
#endif