]> rtime.felk.cvut.cz Git - hercules2020/kcf.git/blob - src/fft_opencv.cpp
Work done so far on CUDA streams
[hercules2020/kcf.git] / src / fft_opencv.cpp
1 #include "fft_opencv.h"
2
3 void FftOpencv::init(unsigned width, unsigned height, unsigned num_of_feats, unsigned num_of_scales, bool big_batch_mode)
4 {
5     (void)width;
6     (void)height;
7     (void)num_of_feats;
8     (void)num_of_scales;
9     (void)big_batch_mode;
10     std::cout << "FFT: OpenCV" << std::endl;
11 }
12
13 void FftOpencv::set_window(const cv::Mat & window)
14 {
15      m_window = window;
16 }
17
18 void FftOpencv::forward(const cv::Mat & real_input, ComplexMat & complex_result, float *real_input_arr, cudaStream_t stream)
19 {
20     (void) real_input_arr;
21     (void) stream;
22
23     cv::Mat tmp;
24     cv::dft(real_input, tmp, cv::DFT_COMPLEX_OUTPUT);
25     complex_result = ComplexMat(tmp);
26     return;
27 }
28
29 void FftOpencv::forward_window(std::vector<cv::Mat> patch_feats, ComplexMat & complex_result, cv::Mat & fw_all, float *real_input_arr, cudaStream_t stream)
30 {
31     (void) real_input_arr;
32     (void) fw_all;
33     (void) stream;
34
35     uint n_channels = uint(patch_feats.size());
36     for (uint i = 0; i < n_channels; ++i) {
37         cv::Mat complex_res;
38         cv::dft(patch_feats[i].mul(m_window), complex_res, cv::DFT_COMPLEX_OUTPUT);
39         complex_result.set_channel(int(i), complex_res);
40     }
41     return;
42 }
43
44 void FftOpencv::inverse(ComplexMat &  complex_input, cv::Mat & real_result, float *real_result_arr, cudaStream_t stream)
45 {
46     (void) real_result_arr;
47     (void) stream;
48
49     if (complex_input.n_channels == 1) {
50         cv::dft(complex_input.to_cv_mat(), real_result, cv::DFT_INVERSE | cv::DFT_REAL_OUTPUT | cv::DFT_SCALE);
51     } else {
52         std::vector<cv::Mat> mat_channels = complex_input.to_cv_mat_vector();
53         std::vector<cv::Mat> ifft_mats(ulong(complex_input.n_channels));
54         for (uint i = 0; i < uint(complex_input.n_channels); ++i) {
55             cv::dft(mat_channels[i], ifft_mats[i], cv::DFT_INVERSE | cv::DFT_REAL_OUTPUT | cv::DFT_SCALE);
56         }
57         cv::merge(ifft_mats, real_result);
58     }
59     return;
60 }
61
62 FftOpencv::~FftOpencv()
63 {}