| | |
| | | using namespace std; |
| | | |
| | | struct ScoredRect { |
| | | ScoredRect() : id(-1) ,isMask(false){} |
| | | ScoredRect() : id(-1), isMask(false) {} |
| | | |
| | | bool isMask; |
| | | float score; |
| | | cv::Rect rect; |
| | |
| | | TrackingTrigger(float threshold) : |
| | | threshold(threshold), faceTrackingId(0) {} |
| | | |
| | | bool triggerOnce(ScoredRect &rect) { |
| | | |
| | | bool triggerOnce(ScoredRect &rect, long faceId = -1) { |
| | | if (faceId < 0) { |
| | | return triggerOnce(rect, false); |
| | | } else { |
| | | bool found = false; |
| | | for (auto lastRect: lastScoreRects) { |
| | | if (lastRect.id >= 0 && lastRect.id == faceId) { |
| | | found = true; |
| | | rect.id = faceId; |
| | | rect.properties = lastRect.properties; |
| | | tempScoreRects.push_back(rect); |
| | | break; |
| | | } |
| | | } |
| | | if (!found) { |
| | | if (rect.score < threshold) { |
| | | // tempScoreRects.push_back(rect); |
| | | return false; |
| | | } else { |
| | | rect.id = faceId; |
| | | tempScoreRects.push_back(rect); |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | void triggerLine() { |
| | | lastScoreRects.swap(tempScoreRects);// = tempScoreRects; |
| | | tempScoreRects.clear(); |
| | | } |
| | | |
| | | ScoredRect &getLastRect() { |
| | | return tempScoreRects[tempScoreRects.size() - 1]; |
| | | } |
| | | |
| | | std::vector<ScoredRect> getLastScoreRects() const { |
| | | return lastScoreRects; |
| | | } |
| | | |
| | | private: |
| | | bool triggerOnce(ScoredRect &rect, bool) { |
| | | bool found = false; |
| | | for (auto lastRect: lastScoreRects) { |
| | | if (lastRect.id >= 0 && (rect.rect & lastRect.rect).area() > lastRect.rect.area() * 0.4) { |
| | |
| | | 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::vector<int> lastScoreInts; |
| | | std::vector<int> tempScoreInts; |
| | | std::atomic<long> faceTrackingId; |
| | | }; |
| | | |