7 #include "complexmat.cuh"
9 #include "complexmat.hpp"
11 // For compatibility reasons between CuFFT and FFTW, OpenCVfft versions.
12 typedef int *cudaStream_t;
18 ThreadCtx(cv::Size windows_size, uint cell_size, uint num_of_feats, uint num_of_scales = 1,
19 ComplexMat *model_xf = nullptr, ComplexMat *yf = nullptr, bool zero_index = false)
23 cudaSetDeviceFlags(cudaDeviceMapHost);
24 this->zero_index = true;
27 #if defined(ASYNC) || defined(OPENMP)
28 CudaSafeCall(cudaStreamCreate(&this->stream));
31 this->patch_feats.reserve(uint(num_of_feats));
32 // Size of cufftReal == float
34 ((uint(windows_size.width) / cell_size) * (uint(windows_size.height) / cell_size)) * sizeof(float);
36 this->data_i_1ch = DynMem(cells_size * num_of_scales);
37 this->data_i_features = DynMem(cells_size * num_of_feats);
39 this->ifft2_res = cv::Mat(windows_size.height / int(cell_size), windows_size.width / int(cell_size),
40 CV_32FC(int(num_of_feats)), this->data_i_features.hostMem());
41 this->response = cv::Mat(windows_size.height / int(cell_size), windows_size.width / int(cell_size),
42 CV_32FC(int(num_of_scales)), this->data_i_1ch.hostMem());
44 this->zf.create(uint(windows_size.height) / cell_size, (uint(windows_size.width) / cell_size) / 2 + 1,
45 num_of_feats, num_of_scales, this->stream);
46 this->kzf.create(uint(windows_size.height) / cell_size, (uint(windows_size.width) / cell_size) / 2 + 1,
47 num_of_scales, this->stream);
48 this->kf.create(uint(windows_size.height) / cell_size, (uint(windows_size.width) / cell_size) / 2 + 1,
49 num_of_scales, this->stream);
51 this->xf_sqr_norm = DynMem(num_of_scales * sizeof(float));
52 this->yf_sqr_norm = DynMem(sizeof(float));
54 this->gauss_corr_res = DynMem(cells_size * num_of_scales);
55 this->in_all = cv::Mat(windows_size.height / int(cell_size) * int(num_of_scales),
56 windows_size.width / int(cell_size), CV_32F, this->gauss_corr_res.hostMem());
59 this->rot_labels_data = DynMem(cells_size);
60 this->rot_labels = cv::Mat(windows_size.height / int(cell_size), windows_size.width / int(cell_size),
61 CV_32FC1, this->rot_labels_data.hostMem());
64 this->data_features = DynMem(cells_size * num_of_feats);
65 this->fw_all = cv::Mat((windows_size.height / int(cell_size)) * int(num_of_feats),
66 windows_size.width / int(cell_size), CV_32F, this->data_features.hostMem());
69 this->xf_sqr_norm = DynMem(num_of_scales * sizeof(float));
70 this->yf_sqr_norm = DynMem(sizeof (float));
72 this->patch_feats.reserve(num_of_feats);
74 uint height = uint(windows_size.height) / cell_size;
76 uint width = (uint(windows_size.width) / cell_size) / 2 + 1;
78 int width = windows_size.width / cell_size;
81 this->ifft2_res = cv::Mat(int(height), windows_size.width / int(cell_size), CV_32FC(int(num_of_feats)));
82 this->response = cv::Mat(int(height), windows_size.width / int(cell_size), CV_32FC(int(num_of_scales)));
84 this->zf = ComplexMat(height, width, num_of_feats, num_of_scales);
85 this->kzf = ComplexMat(height, width, num_of_scales);
86 this->kf = ComplexMat(height, width, num_of_scales);
88 this->in_all = cv::Mat((windows_size.height / int(cell_size)) * int(num_of_scales),
89 windows_size.width / int(cell_size), CV_32F);
90 this->fw_all = cv::Mat((windows_size.height / int(cell_size)) * int(num_of_feats),
91 windows_size.width / int(cell_size), CV_32F);
93 this->in_all = cv::Mat((windows_size.height / int(cell_size)), windows_size.width / int(cell_size), CV_32F);
96 #if defined(FFTW) || defined(CUFFT)
98 model_xf->create(uint(windows_size.height) / cell_size, (uint(windows_size.width) / cell_size) / 2 + 1,
100 yf->create(uint(windows_size.height) / cell_size, (uint(windows_size.width) / cell_size) / 2 + 1, 1);
101 // We use scale_vars[0] for updating the tracker, so we only allocate memory for its xf only.
103 this->xf.create(uint(windows_size.height) / cell_size, (uint(windows_size.width) / cell_size) / 2 + 1,
104 num_of_feats, this->stream);
106 this->xf.create(uint(windows_size.height) / cell_size, (uint(windows_size.width) / cell_size) / 2 + 1,
109 } else if (num_of_scales > 1) {
110 this->max_responses.reserve(uint(num_of_scales));
111 this->max_locs.reserve(uint(num_of_scales));
112 this->response_maps.reserve(uint(num_of_scales));
116 model_xf->create(windows_size.height / cell_size, windows_size.width / cell_size, num_of_feats);
117 yf->create(windows_size.height / cell_size, windows_size.width / cell_size, 1);
118 this->xf.create(windows_size.height / cell_size, windows_size.width / cell_size, num_of_feats);
125 #if defined(CUFFT) && (defined(ASYNC) || defined(OPENMP))
126 CudaSafeCall(cudaStreamDestroy(this->stream));
130 DynMem xf_sqr_norm, yf_sqr_norm;
131 std::vector<cv::Mat> patch_feats;
133 cv::Mat in_all, fw_all, ifft2_res, response;
134 ComplexMat zf, kzf, kf, xyf, xf;
138 DynMem gauss_corr_res, rot_labels_data, data_features, data_f, data_i_features, data_i_1ch;
140 cudaStream_t stream = nullptr;
141 ComplexMat model_alphaf, model_xf;
143 // Big batch variables
145 double max_val, max_response;
147 std::vector<double> max_responses;
148 std::vector<cv::Point2i> max_locs;
149 std::vector<cv::Mat> response_maps;
150 bool zero_index = false;
153 #endif // SCALE_VARS_HPP