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 roi, uint num_of_feats, double scale, int angle, uint num_of_scales = 1, uint num_of_angles = 1)
20 : scale(scale), angle(angle)
22 this->xf_sqr_norm = DynMem(num_of_scales * num_of_angles * sizeof(float));
23 this->yf_sqr_norm = DynMem(sizeof(float));
25 uint cells_size = roi.width * roi.height * sizeof(float);
27 #if !defined(BIG_BATCH) && defined(CUFFT) && (defined(ASYNC) || defined(OPENMP))
28 CudaSafeCall(cudaStreamCreate(&this->stream));
31 #if defined(CUFFT) || defined(FFTW)
32 this->gauss_corr_res = DynMem(cells_size * num_of_scales * num_of_angles);
33 this->data_features = DynMem(cells_size * num_of_feats);
35 uint width_freq = roi.width / 2 + 1;
37 this->in_all = cv::Mat(roi.height * num_of_scales * num_of_angles, roi.width, CV_32F, this->gauss_corr_res.hostMem());
38 this->fw_all = cv::Mat(roi.height * num_of_feats, roi.width, CV_32F, this->data_features.hostMem());
40 uint width_freq = roi.width;
42 this->in_all = cv::Mat(roi, CV_32F);
45 this->data_i_features = DynMem(cells_size * num_of_feats);
46 this->data_i_1ch = DynMem(cells_size * num_of_scales * num_of_angles);
48 this->ifft2_res = cv::Mat(roi, CV_32FC(num_of_feats), this->data_i_features.hostMem());
49 this->response = cv::Mat(roi, CV_32FC(num_of_scales * num_of_angles), this->data_i_1ch.hostMem());
52 this->zf.create(roi.height, width_freq, num_of_feats, num_of_scales * num_of_angles, this->stream);
53 this->kzf.create(roi.height, width_freq, num_of_scales * num_of_angles, this->stream);
54 this->kf.create(roi.height, width_freq, num_of_scales * num_of_angles, this->stream);
56 this->zf.create(roi.height, width_freq, num_of_feats, num_of_scales * num_of_angles);
57 this->kzf.create(roi.height, width_freq, num_of_scales * num_of_angles);
58 this->kf.create(roi.height, width_freq, num_of_scales * num_of_angles);
62 if (num_of_scales > 1) {
63 this->max_responses.reserve(num_of_scales * num_of_angles);
64 this->max_locs.reserve(num_of_scales * num_of_angles);
65 this->response_maps.reserve(num_of_scales * num_of_angles);
69 ThreadCtx(ThreadCtx &&) = default;
72 #if !defined(BIG_BATCH) && defined(CUFFT) && (defined(ASYNC) || defined(OPENMP))
73 CudaSafeCall(cudaStreamDestroy(this->stream));
80 std::future<void> async_res;
83 DynMem xf_sqr_norm, yf_sqr_norm;
85 cv::Mat in_all, fw_all, ifft2_res, response;
86 ComplexMat zf, kzf, kf, xyf;
88 DynMem data_i_features, data_i_1ch;
89 // CuFFT and FFTW variables
90 DynMem gauss_corr_res, data_features;
93 cudaStream_t stream = nullptr;
94 ComplexMat model_alphaf, model_xf;
96 // Variables used during non big batch mode and in big batch mode with ThreadCtx in p_threadctxs in kcf on zero index.
98 double max_val, max_response;
101 // Stores value of responses, location of maximal response and response maps for each scale
102 std::vector<double> max_responses;
103 std::vector<cv::Point2i> max_locs;
104 std::vector<cv::Mat> response_maps;
108 #endif // SCALE_VARS_HPP