diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2016-07-20 08:17:57 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2016-07-20 08:17:57 +0200 |
commit | 1a95ca4dc340c246636aba1d1d8c8a7d7cd86e24 (patch) | |
tree | 4c911adafc97c76ccf9fcfa710bb3ecbb679a78b | |
parent | dbfe45370f232c42db0a24b140db94279429bb4c (diff) |
tracker/pt: fix wrong input to flood fill
The binary frame needs to be used, not grayscale.
v2:
Use brightness for sorting points.
-rw-r--r-- | tracker-pt/point_extractor.cpp | 34 | ||||
-rw-r--r-- | tracker-pt/point_extractor.h | 4 |
2 files changed, 20 insertions, 18 deletions
diff --git a/tracker-pt/point_extractor.cpp b/tracker-pt/point_extractor.cpp index b12c139a..c8ed261e 100644 --- a/tracker-pt/point_extractor.cpp +++ b/tracker-pt/point_extractor.cpp @@ -80,21 +80,21 @@ void PointExtractor::extract_points(cv::Mat& frame, std::vector<PointExtractor:: } blobs.clear(); - frame_gray.copyTo(frame_blobs); + frame_bin.copyTo(frame_blobs); unsigned idx = 0; - for (int y=0; y < frame_gray.rows; y++) + for (int y=0; y < frame_blobs.rows; y++) { if (idx > max_blobs) break; - const unsigned char* ptr_bin = frame_bin.ptr(y); - for (int x=0; x < frame_gray.cols; x++) + const unsigned char* ptr_bin = frame_blobs.ptr(y); + for (int x=0; x < frame_blobs.cols; x++) { if (idx > max_blobs) break; if (ptr_bin[x] != 255) continue; - idx = blobs.size(); + idx = blobs.size() + 1; cv::Rect rect; cv::floodFill(frame_blobs, cv::Point(x,y), @@ -102,24 +102,26 @@ void PointExtractor::extract_points(cv::Mat& frame, std::vector<PointExtractor:: &rect, cv::Scalar(0), cv::Scalar(0), - 4); - long m00 = 0; - long m10 = 0; - long m01 = 0; - long cnt = 0; + 8); + unsigned m00 = 0; + unsigned m10 = 0; + unsigned m01 = 0; + unsigned cnt = 0; + unsigned vals = 0; + for (int i=rect.y; i < (rect.y+rect.height); i++) { - const unsigned char* ptr_blobs = frame_blobs.ptr(i); + unsigned char* ptr_blobs = frame_blobs.ptr(i); const unsigned char* ptr_gray = frame_gray.ptr(i); - unsigned char* ptr_bin = frame_bin.ptr(i); for (int j=rect.x; j < (rect.x+rect.width); j++) { if (ptr_blobs[j] != idx) continue; - ptr_bin[j] = 0; - const long val = ptr_gray[j]; + ptr_blobs[j] = 0; + const unsigned val = ptr_gray[j]; m00 += val; m01 += i * val; m10 += j * val; + vals += val; cnt++; } } @@ -129,7 +131,7 @@ void PointExtractor::extract_points(cv::Mat& frame, std::vector<PointExtractor:: if (radius > region_size_max || radius < region_size_min) continue; const double norm = double(m00); - blob b(radius, cv::Vec2d(m10 / norm, m01 / norm)); + blob b(radius, cv::Vec2d(m10 / norm, m01 / norm), vals/(double)cnt); blobs.push_back(b); { char buf[64]; @@ -146,7 +148,7 @@ void PointExtractor::extract_points(cv::Mat& frame, std::vector<PointExtractor:: } } - std::sort(blobs.begin(), blobs.end(), [](const blob& b1, const blob& b2) -> bool { return b2.radius < b1.radius; }); + std::sort(blobs.begin(), blobs.end(), [](const blob& b1, const blob& b2) -> bool { return b2.brightness < b1.brightness; }); points.reserve(max_blobs); points.clear(); diff --git a/tracker-pt/point_extractor.h b/tracker-pt/point_extractor.h index f4839208..9ef2adb4 100644 --- a/tracker-pt/point_extractor.h +++ b/tracker-pt/point_extractor.h @@ -38,9 +38,9 @@ private: struct blob { - double radius; + double radius, brightness; vec2 pos; - blob(double radius, const cv::Vec2d& pos) : radius(radius), pos(pos) + blob(double radius, const cv::Vec2d& pos, double brightness) : radius(radius), brightness(brightness), pos(pos) { //qDebug() << "radius" << radius << "pos" << pos[0] << pos[1]; } |