]> rtime.felk.cvut.cz Git - hercules2020/kcf.git/blob - src/fft_opencv.cpp
Merge remote-tracking branch 'upstream/master' into rotation
[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)
4 {
5     (void)width;
6     (void)height;
7     (void)num_of_feats;
8     (void)num_of_scales;
9     std::cout << "FFT: OpenCV" << std::endl;
10 }
11
12 void FftOpencv::set_window(const cv::Mat &window)
13 {
14     m_window = window;
15 }
16
17 void FftOpencv::forward(const cv::Mat &real_input, ComplexMat &complex_result, float *real_input_arr,
18                         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,
30                                float *real_input_arr, cudaStream_t stream)
31 {
32     (void)real_input_arr;
33     (void)fw_all;
34     (void)stream;
35
36     uint n_channels = uint(patch_feats.size());
37     for (uint i = 0; i < n_channels; ++i) {
38         cv::Mat complex_res;
39         cv::dft(patch_feats[i].mul(m_window), complex_res, cv::DFT_COMPLEX_OUTPUT);
40         complex_result.set_channel(int(i), complex_res);
41     }
42     return;
43 }
44
45 void FftOpencv::inverse(ComplexMat &complex_input, cv::Mat &real_result, float *real_result_arr, cudaStream_t stream)
46 {
47     (void)real_result_arr;
48     (void)stream;
49
50     if (complex_input.n_channels == 1) {
51         cv::dft(complex_input.to_cv_mat(), real_result, cv::DFT_INVERSE | cv::DFT_REAL_OUTPUT | cv::DFT_SCALE);
52     } else {
53         std::vector<cv::Mat> mat_channels = complex_input.to_cv_mat_vector();
54         std::vector<cv::Mat> ifft_mats(ulong(complex_input.n_channels));
55         for (uint i = 0; i < uint(complex_input.n_channels); ++i) {
56             cv::dft(mat_channels[i], ifft_mats[i], cv::DFT_INVERSE | cv::DFT_REAL_OUTPUT | cv::DFT_SCALE);
57         }
58         cv::merge(ifft_mats, real_result);
59     }
60     return;
61 }
62
63 FftOpencv::~FftOpencv() {}