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