]> rtime.felk.cvut.cz Git - hercules2020/kcf.git/blob - src/threadctx.hpp
Fix scale initialization
[hercules2020/kcf.git] / src / threadctx.hpp
1 #ifndef SCALE_VARS_HPP
2 #define SCALE_VARS_HPP
3
4 #include <future>
5 #include "dynmem.hpp"
6
7 #ifdef CUFFT
8 #include "complexmat.cuh"
9 #else
10 #include "complexmat.hpp"
11 #ifndef CUFFTW
12 // For compatibility reasons between CuFFT and FFTW, OpenCVfft versions.
13 typedef int *cudaStream_t;
14 #endif
15 #endif
16
17 struct ThreadCtx {
18   public:
19     ThreadCtx(cv::Size windows_size, uint cell_size, uint num_of_feats, double scale, uint num_of_scales)
20         : scale(scale)
21     {
22         this->xf_sqr_norm = DynMem(num_of_scales * sizeof(float));
23         this->yf_sqr_norm = DynMem(sizeof(float));
24         this->patch_feats.reserve(uint(num_of_feats));
25
26         uint cells_size =
27             ((uint(windows_size.width) / cell_size) * (uint(windows_size.height) / cell_size)) * sizeof(float);
28
29 #if  !defined(BIG_BATCH) && defined(CUFFT) && (defined(ASYNC) || defined(OPENMP))
30         CudaSafeCall(cudaStreamCreate(&this->stream));
31 #endif
32
33 #if defined(CUFFT) || defined(FFTW)
34         this->gauss_corr_res = DynMem(cells_size * num_of_scales);
35         this->data_features = DynMem(cells_size * num_of_feats);
36
37         uint width_freq = (uint(windows_size.width) / cell_size) / 2 + 1;
38
39         this->in_all = cv::Mat(windows_size.height / int(cell_size) * int(num_of_scales),
40                                windows_size.width / int(cell_size), CV_32F, this->gauss_corr_res.hostMem());
41
42         this->fw_all = cv::Mat((windows_size.height / int(cell_size)) * int(num_of_feats),
43                                windows_size.width / int(cell_size), CV_32F, this->data_features.hostMem());
44 #else
45         uint width_freq = uint(windows_size.width) / cell_size;
46
47         this->in_all = cv::Mat((windows_size.height / int(cell_size)), windows_size.width / int(cell_size), CV_32F);
48 #endif
49
50         this->data_i_features = DynMem(cells_size * num_of_feats);
51         this->data_i_1ch = DynMem(cells_size * num_of_scales);
52
53         this->ifft2_res = cv::Mat(windows_size.height / int(cell_size), windows_size.width / int(cell_size),
54                                   CV_32FC(int(num_of_feats)), this->data_i_features.hostMem());
55
56         this->response = cv::Mat(windows_size.height / int(cell_size), windows_size.width / int(cell_size),
57                                  CV_32FC(int(num_of_scales)), this->data_i_1ch.hostMem());
58
59         this->patch_feats.reserve(num_of_feats);
60
61 #ifdef CUFFT
62         this->zf.create(uint(windows_size.height) / cell_size, width_freq, num_of_feats, num_of_scales, this->stream);
63         this->kzf.create(uint(windows_size.height) / cell_size, width_freq, num_of_scales, this->stream);
64         this->kf.create(uint(windows_size.height) / cell_size, width_freq, num_of_scales, this->stream);
65 #else
66         this->zf.create(uint(windows_size.height) / cell_size, width_freq, num_of_feats, num_of_scales);
67         this->kzf.create(uint(windows_size.height) / cell_size, width_freq, num_of_scales);
68         this->kf.create(uint(windows_size.height) / cell_size, width_freq, num_of_scales);
69 #endif
70
71         if (num_of_scales > 1) {
72             this->max_responses.reserve(uint(num_of_scales));
73             this->max_locs.reserve(uint(num_of_scales));
74             this->response_maps.reserve(uint(num_of_scales));
75         }
76     }
77     ThreadCtx(ThreadCtx &&) = default;
78     ~ThreadCtx()
79     {
80 #if  !defined(BIG_BATCH) && defined(CUFFT) && (defined(ASYNC) || defined(OPENMP))
81         CudaSafeCall(cudaStreamDestroy(this->stream));
82 #endif
83     }
84
85     const double scale;
86 #ifdef ASYNC
87     std::future<void> async_res;
88 #endif
89
90     DynMem xf_sqr_norm, yf_sqr_norm;
91     std::vector<cv::Mat> patch_feats;
92
93     cv::Mat in_all, fw_all, ifft2_res, response;
94     ComplexMat zf, kzf, kf, xyf;
95
96     DynMem data_i_features, data_i_1ch;
97     // CuFFT and FFTW variables
98     DynMem gauss_corr_res, data_features;
99
100     // CuFFT variables
101     cudaStream_t stream = nullptr;
102     ComplexMat model_alphaf, model_xf;
103
104     // Variables used during non big batch mode and in big batch mode with ThreadCtx in p_threadctxs in kcf  on zero index.
105     cv::Point2i max_loc;
106     double max_val, max_response;
107
108     // Big batch variables
109     // Stores value of responses, location of maximal response and response maps for each scale
110     std::vector<double> max_responses;
111     std::vector<cv::Point2i> max_locs;
112     std::vector<cv::Mat> response_maps;
113 };
114
115 #endif // SCALE_VARS_HPP