zhangzengfei
2020-03-31 0ce893695d32ab686f9e2309509e80c6feb0d380
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
#ifndef TRACKINGTRIGGER_H
#define TRACKINGTRIGGER_H
#include <vector>
#include <opencv2/opencv.hpp>
#include <functional>
#include <atomic>
using namespace std;
struct ScoredRect{
    //ScoredRect():id(-1){}
    float score;
    cv::Rect rect;
    long id;
    map<string,string> properties;
};
 
class TrackingTrigger
{
public:
    TrackingTrigger(float threshold)://threshold:触发阈值,满足要求阈值的人脸才会触发
            threshold(threshold),faceTrackingId(0)
    {}
 
    bool triggerOnce(ScoredRect& rect){//检测一次人脸后,for循环内每个人脸封装成ScoredRect结构体进行调用,返回值是该人脸是否被触发
        bool found = false;
        for(auto lastRect: lastScoreRects){
            if(lastRect.id>=0&&(rect.rect&lastRect.rect).area()>lastRect.rect.area()*0.4){
                found = true;
                rect.id = lastRect.id;
                rect.properties = lastRect.properties;
                tempScoreRects.push_back(rect);
                break;
            }
        }
        if(!found){
            if(rect.score<threshold){
                tempScoreRects.push_back(rect);
                return false;
            }else{
                rect.id = faceTrackingId++;
                tempScoreRects.push_back(rect);
                return true;
            }
        }
        return false;
    }
    void triggerLine(){//for 循环遍历后调用,结束一组触发判断
        lastScoreRects = tempScoreRects;
        tempScoreRects.clear();
    }
 
    ScoredRect& getLastRect(){
        return tempScoreRects[tempScoreRects.size() -1];
    }
 
    std::vector<ScoredRect> getLastScoreRects() const
    {
        return lastScoreRects;
    }
 
private:
    float threshold;
    std::vector<ScoredRect> lastScoreRects;
    std::vector<ScoredRect> tempScoreRects;
    std::atomic<long> faceTrackingId;
};
 
#endif // TRACKINGTRIGGER_H