]> rtime.felk.cvut.cz Git - hercules2020/kcf.git/blobdiff - src/threadctx.hpp
Unify CPU and GPU implementations of ComplexMat
[hercules2020/kcf.git] / src / threadctx.hpp
index d3bccbacec7b55f62b9c470f82e38a615655e73d..982905b96699b5928d39eb2ba158fc6920c2120f 100644 (file)
@@ -4,25 +4,22 @@
 #include <future>
 #include "dynmem.hpp"
 #include "kcf.h"
-
-#ifdef CUFFT
-#include "complexmat.cuh"
-#else
 #include "complexmat.hpp"
-#endif
 
 class KCF_Tracker;
 
 struct ThreadCtx {
   public:
-    ThreadCtx(cv::Size roi, uint num_channels, uint num_of_scales
-#ifndef BIG_BATCH
+    ThreadCtx(cv::Size roi, uint num_features
+#ifdef BIG_BATCH
+              , uint num_scales
+#else
               , double scale
 #endif
              )
         : roi(roi)
-        , num_channels(num_channels)
-        , num_of_scales(num_of_scales)
+        , num_features(num_features)
+        , num_scales(IF_BIG_BATCH(num_scales, 1))
 #ifndef BIG_BATCH
         , scale(scale)
 #endif
@@ -30,41 +27,39 @@ struct ThreadCtx {
 
     ThreadCtx(ThreadCtx &&) = default;
 
+    void track(const KCF_Tracker &kcf, cv::Mat &input_rgb, cv::Mat &input_gray);
 private:
     cv::Size roi;
-    uint num_channels;
-    uint num_of_scales;
+    uint num_features;
+    uint num_scales;
     cv::Size freq_size = Fft::freq_size(roi);
 
+    MatScaleFeats patch_feats{num_scales, num_features, roi};
+    MatScaleFeats temp{num_scales, num_features, roi};
+
+    KCF_Tracker::GaussianCorrelation gaussian_correlation{num_scales, num_features, roi};
+
+    MatScales ifft2_res{num_scales, roi};
+
+    ComplexMat zf{uint(freq_size.height), uint(freq_size.width), num_features, num_scales};
+    ComplexMat kzf{uint(freq_size.height), uint(freq_size.width), 1, num_scales};
+
 public:
 #ifdef ASYNC
     std::future<void> async_res;
 #endif
 
-    KCF_Tracker::GaussianCorrelation gaussian_correlation{Fft::freq_size(roi), num_of_scales};
-
-#if defined(CUFFT) || defined(FFTW) // TODO: Why this ifdef?
-    MatDynMem in_all{roi.height * int(num_of_scales), roi.width, CV_32F};
-#else
-    MatDynMem in_all{roi, CV_32F};
-#endif
-    MatDynMem fw_all{roi.height * int(num_channels), roi.width, CV_32F};
-    MatDynMem ifft2_res{roi, CV_32FC(num_channels)};
-    MatDynMem response{roi, CV_32FC(num_of_scales)};
-
-    ComplexMat zf{uint(freq_size.height), uint(freq_size.width), num_channels, num_of_scales};
-    ComplexMat kzf{uint(freq_size.height), uint(freq_size.width), num_of_scales};
+    MatScales response{num_scales, roi};
 
-    // Variables used during non big batch mode and in big batch mode with ThreadCtx in p_threadctxs in kcf  on zero index.
-    cv::Point2i max_loc;
-    double max_val, max_response;
+    struct Max {
+        cv::Point2i loc;
+        double response;
+    };
 
 #ifdef BIG_BATCH
-    // Stores value of responses, location of maximal response and response maps for each scale
-    std::vector<double> max_responses{num_of_scales};
-    std::vector<cv::Point2i> max_locs{num_of_scales};
-    std::vector<cv::Mat> response_maps{num_of_scales};
+    std::vector<Max> max = std::vector<Max>(num_scales);
 #else
+    Max max;
     const double scale;
 #endif
 };