8 #include "complexmat.cuh"
10 #include "complexmat.hpp"
12 // For compatibility reasons between CuFFT and FFTW, OpenCVfft versions.
13 typedef int *cudaStream_t;
19 ThreadCtx(cv::Size windows_size, uint cell_size, uint num_of_feats, double scale, uint num_of_scales)
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));
27 ((uint(windows_size.width) / cell_size) * (uint(windows_size.height) / cell_size)) * sizeof(float);
29 #if !defined(BIG_BATCH) && defined(CUFFT) && (defined(ASYNC) || defined(OPENMP))
30 CudaSafeCall(cudaStreamCreate(&this->stream));
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);
37 uint width_freq = (uint(windows_size.width) / cell_size) / 2 + 1;
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());
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());
45 uint width_freq = uint(windows_size.width) / cell_size;
47 this->in_all = cv::Mat((windows_size.height / int(cell_size)), windows_size.width / int(cell_size), CV_32F);
50 this->data_i_features = DynMem(cells_size * num_of_feats);
51 this->data_i_1ch = DynMem(cells_size * num_of_scales);
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());
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());
59 this->patch_feats.reserve(num_of_feats);
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);
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);
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));
77 ThreadCtx(ThreadCtx &&) = default;
80 #if !defined(BIG_BATCH) && defined(CUFFT) && (defined(ASYNC) || defined(OPENMP))
81 CudaSafeCall(cudaStreamDestroy(this->stream));
87 std::future<void> async_res;
90 DynMem xf_sqr_norm, yf_sqr_norm;
91 std::vector<cv::Mat> patch_feats;
93 cv::Mat in_all, fw_all, ifft2_res, response;
94 ComplexMat zf, kzf, kf, xyf;
96 DynMem data_i_features, data_i_1ch;
97 // CuFFT and FFTW variables
98 DynMem gauss_corr_res, data_features;
101 cudaStream_t stream = nullptr;
102 ComplexMat model_alphaf, model_xf;
104 // Variables used during non big batch mode and in big batch mode with ThreadCtx in p_threadctxs in kcf on zero index.
106 double max_val, max_response;
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;
115 #endif // SCALE_VARS_HPP