#ifndef TRACKINGTRIGGER_H
|
#define TRACKINGTRIGGER_H
|
|
#include <vector>
|
#include <opencv2/opencv.hpp>
|
#include <functional>
|
#include <atomic>
|
|
using namespace std;
|
|
struct ScoredRect {
|
ScoredRect() : id(-1) ,isMove(false),times(0){}
|
bool isMove;
|
time_t times;
|
float score;
|
cv::Rect rect;
|
long id;
|
map<string, string> properties;
|
};
|
|
class TrackingTrigger {
|
public:
|
TrackingTrigger(float threshold) :
|
threshold(threshold), faceTrackingId(0) {}
|
|
bool triggerOnce(ScoredRect &rect) {
|
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;
|
lastRect.properties["time"]=rect.properties["time"];
|
lastRect.properties["imgKey"]=rect.properties["imgKey"];
|
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() {
|
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
|