diff --git a/include/tracking.hpp b/include/tracking.hpp index f80004c..a2bf772 100644 --- a/include/tracking.hpp +++ b/include/tracking.hpp @@ -8,6 +8,16 @@ class Tracker { public: static std::shared_ptr CreateTracker(const std::string &name); - virtual bool Init(const cv::Mat &frame, const cv::Rect &roi) = 0; + virtual bool Init(const cv::Mat &frame, const cv::Mat &next_frame, const cv::Rect &roi) = 0; virtual cv::Rect Track(const cv::Mat &frame) = 0; }; + +class MedianFlowTracker : public Tracker { +public: + virtual bool Init(const cv::Mat &frame, const cv::Mat &next_frame, const cv::Rect &roi); + virtual cv::Rect Track(const cv::Mat &frame); + +protected: + cv::Rect position_; + cv::Mat frame_; +}; \ No newline at end of file diff --git a/samples/template_demo.cpp b/samples/template_demo.cpp index 3b9eb74..1eba099 100644 --- a/samples/template_demo.cpp +++ b/samples/template_demo.cpp @@ -2,6 +2,11 @@ #include #include "opencv2/core.hpp" +#include +#include + +#include "tracking.hpp" + using namespace std; using namespace cv; @@ -26,6 +31,44 @@ int main(int argc, const char** argv) { return 0; } + + string filename = "pedestrians.mpg"; + + VideoCapture capture(filename); + Mat frame; + Mat next_frame; + + if (!capture.isOpened()) + throw "Error when reading steam_avi"; + + + MedianFlowTracker medianflowtraacker; + + Rect ROI(70, 70, 90, 90); + + const cv::Rect &roi = ROI; + + namedWindow("video", 1); + for (; ; ) + { + capture >> frame; + + if (frame.empty()) { + continue; + } + + //getting next frame + capture.read(next_frame); + + medianflowtraacker.Init(frame, next_frame, roi); + + imshow("video", frame); + waitKey(20); + } + waitKey(0); + + + // Do something cool. cout << "This is empty template sample." << endl; diff --git a/src/tracking.cpp b/src/tracking.cpp index 26cbe06..adf3125 100644 --- a/src/tracking.cpp +++ b/src/tracking.cpp @@ -1,13 +1,109 @@ #include "tracking.hpp" #include +#include + + +#include "opencv2/core.hpp" +#include +#include + + +using namespace std; +using namespace cv; + using std::string; using std::shared_ptr; using namespace cv; shared_ptr Tracker::CreateTracker(const string &name) { + if (name == "median_flow") { + return std::make_shared(); + } + std::cerr << "Failed to create tracker with name '" << name << "'" << std::endl; return nullptr; } + + +bool MedianFlowTracker::Init(const cv::Mat &frame, const cv::Mat &next_frame, const cv::Rect &roi) +{ + vector corners; + vector next_corners; + + std::vector status; + std::vector err; + + int maxCorners = 150; + double qualityLevel = 0.01; + double minDistance = 10; + int maxTrackbar = 100; + + RNG rng(12345); + + Mat frame_gray; + frame.copyTo(frame_gray); + + //convert to gray + cvtColor(frame, frame_gray, COLOR_BGR2GRAY); + + //set 8-bit, single-channel + frame_gray.convertTo(frame_gray, CV_8UC1); + + //cut roi + Mat cropped_frame = frame_gray(roi); + imshow("Croped_frame", cropped_frame); + + // get features from roi + goodFeaturesToTrack(cropped_frame, corners, maxCorners, qualityLevel, minDistance); + + /// corners detected + cout << "** Number of corners detected: " << corners.size() << endl; + + waitKey(0); + + ////////////////////////////////// + ///for next_frame + ///////////////////////////////// + + Mat next_frame_gray; + next_frame.copyTo(next_frame_gray); + + //convert to gray + cvtColor(next_frame, next_frame_gray, COLOR_BGR2GRAY); + + //set 8-bit, single-channel + next_frame_gray.convertTo(next_frame_gray, CV_8UC1); + + //cut roi + Mat next_cropped_frame = next_frame_gray(roi); + + // get features from roi + goodFeaturesToTrack(next_cropped_frame, next_corners, maxCorners, qualityLevel, minDistance); + + /// corners detected + cout << "** Number of corners on next frame detected: " << next_corners.size() << endl; + + waitKey(0); + + ////// + + + //count optical flow + calcOpticalFlowPyrLK(cropped_frame, next_cropped_frame, corners, next_corners, status, err); + + for (int i = 0; i < status.size(); i++) { + //if (!status[i]) + //cout << "** status: " << status[i] << endl; + } + + return true; +} + +cv::Rect MedianFlowTracker::Track(const cv::Mat &frame) +{ + cv::Rect objects; + return objects; +} \ No newline at end of file