From 38306b389951c69d050e3e4b929b442b5bd0ada5 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Wed, 17 Feb 2016 04:40:53 +0100 Subject: tracker/pt: protect get_n_points() There's a race here since further accesses to the points array aren't protected by a mutex in the extractor class. There's no race in "get_points()" in the extractor since it's only used in same thread where updates take place. --- tracker-pt/point_extractor.h | 1 + 1 file changed, 1 insertion(+) (limited to 'tracker-pt/point_extractor.h') diff --git a/tracker-pt/point_extractor.h b/tracker-pt/point_extractor.h index 030251ff..8bcc2437 100644 --- a/tracker-pt/point_extractor.h +++ b/tracker-pt/point_extractor.h @@ -23,6 +23,7 @@ public: // WARNING: returned reference is valid as long as object const std::vector &extract_points(cv::Mat &frame); const std::vector& get_points() { QMutexLocker l(&mtx); return points; } + int get_n_points() const { QMutexLocker l(&mtx); return points.size(); } PointExtractor(); settings_pt s; -- cgit v1.2.3 From bf4e8b10ad916b6451dc32b9be2b86d42452e7e8 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Wed, 17 Feb 2016 04:42:20 +0100 Subject: tracker/pt: retire get_points() in the extractor --- tracker-pt/point_extractor.h | 1 - 1 file changed, 1 deletion(-) (limited to 'tracker-pt/point_extractor.h') diff --git a/tracker-pt/point_extractor.h b/tracker-pt/point_extractor.h index 8bcc2437..479b6844 100644 --- a/tracker-pt/point_extractor.h +++ b/tracker-pt/point_extractor.h @@ -22,7 +22,6 @@ public: // dt: time since last call in seconds // WARNING: returned reference is valid as long as object const std::vector &extract_points(cv::Mat &frame); - const std::vector& get_points() { QMutexLocker l(&mtx); return points; } int get_n_points() const { QMutexLocker l(&mtx); return points.size(); } PointExtractor(); -- cgit v1.2.3 From 1a6b611b2fa64cc730f8f8ea7a716d6b5af1461e Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Wed, 17 Feb 2016 04:42:56 +0100 Subject: tracker/pt: fix build --- tracker-pt/point_extractor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tracker-pt/point_extractor.h') diff --git a/tracker-pt/point_extractor.h b/tracker-pt/point_extractor.h index 479b6844..ab51762d 100644 --- a/tracker-pt/point_extractor.h +++ b/tracker-pt/point_extractor.h @@ -22,7 +22,7 @@ public: // dt: time since last call in seconds // WARNING: returned reference is valid as long as object const std::vector &extract_points(cv::Mat &frame); - int get_n_points() const { QMutexLocker l(&mtx); return points.size(); } + int get_n_points() { QMutexLocker l(&mtx); return points.size(); } PointExtractor(); settings_pt s; -- cgit v1.2.3 From 99fb0282ba5cdfdb2b889df8916b36207d21ded0 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sun, 6 Mar 2016 09:11:19 +0100 Subject: tracker/pt: less malloc/free each frame --- tracker-pt/point_extractor.cpp | 29 ++++++----------------------- tracker-pt/point_extractor.h | 19 ++++++++++++++++++- 2 files changed, 24 insertions(+), 24 deletions(-) (limited to 'tracker-pt/point_extractor.h') diff --git a/tracker-pt/point_extractor.cpp b/tracker-pt/point_extractor.cpp index da05feb3..a1294c1e 100644 --- a/tracker-pt/point_extractor.cpp +++ b/tracker-pt/point_extractor.cpp @@ -15,6 +15,8 @@ PointExtractor::PointExtractor() { + blobs.reserve(max_blobs); + points.reserve(max_blobs); } const std::vector& PointExtractor::extract_points(cv::Mat& frame) @@ -34,23 +36,10 @@ const std::vector& PointExtractor::extract_points(cv::Mat& frame) const double region_size_min = s.min_point_size; const double region_size_max = s.max_point_size; - struct blob - { - double radius; - cv::Vec2d pos; - double confid; - blob(double radius, const cv::Vec2d& pos, double confid) : radius(radius), pos(pos), confid(confid) - { - //qDebug() << "radius" << radius << "pos" << pos[0] << pos[1] << "confid" << confid; - } - }; - - // mask for everything that passes the threshold (or: the upper threshold of the hysteresis) - - std::vector blobs; - std::vector> contours; - const int thres = s.threshold; + + contours.clear(); + if (!s.auto_threshold) { cv::threshold(frame_gray, frame_bin, thres, 255, cv::THRESH_BINARY); @@ -88,13 +77,10 @@ const std::vector& PointExtractor::extract_points(cv::Mat& frame) cv::findContours(frame_bin, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); } - int cnt = 0; + blobs.clear(); for (auto& c : contours) { - if (cnt++ > 30) - break; - const auto m = cv::moments(cv::Mat(c)); const cv::Vec2d pos(m.m10 / m.m00, m.m01 / m.m00); @@ -139,8 +125,6 @@ const std::vector& PointExtractor::extract_points(cv::Mat& frame) blobs.push_back(blob(radius, pos, confid)); - enum { max_blobs = 16 }; - if (blobs.size() == max_blobs) break; } @@ -149,7 +133,6 @@ const std::vector& PointExtractor::extract_points(cv::Mat& frame) std::sort(blobs.begin(), blobs.end(), [](b& b1, b& b2) {return b1.confid > b2.confid;}); QMutexLocker l(&mtx); - points.reserve(blobs.size()); points.clear(); for (auto& b : blobs) diff --git a/tracker-pt/point_extractor.h b/tracker-pt/point_extractor.h index ab51762d..3e4661f9 100644 --- a/tracker-pt/point_extractor.h +++ b/tracker-pt/point_extractor.h @@ -12,9 +12,10 @@ #include #include "ftnoir_tracker_pt_settings.h" - #include +#include + class PointExtractor { public: @@ -33,6 +34,22 @@ private: cv::Mat frame_gray; cv::Mat frame_bin; cv::Mat hist; + + enum { max_blobs = 16 }; + + struct blob + { + double radius; + cv::Vec2d pos; + double confid; + blob(double radius, const cv::Vec2d& pos, double confid) : radius(radius), pos(pos), confid(confid) + { + //qDebug() << "radius" << radius << "pos" << pos[0] << pos[1] << "confid" << confid; + } + }; + + std::vector blobs; + std::vector> contours; }; #endif //POINTEXTRACTOR_H -- cgit v1.2.3