7 #include "complexmat.hpp"
13 class ScaleRotVector : public std::vector<T> {
15 ScaleRotVector(const std::vector<double> &scales, const std::vector<double> &angles)
20 uint getIdx(uint scale_idx, uint angle_idx) const { return angles.size() * scale_idx + angle_idx; }
21 uint getScaleIdx(uint idx) const { return idx / angles.size(); }
22 uint getAngleIdx(uint idx) const { return idx % angles.size(); }
23 T& operator()(uint scale_idx, uint angle_idx) { return std::vector<T>::at(getIdx(scale_idx, angle_idx)); }
24 double scale(uint idx) const { return scales[getScaleIdx(idx)]; }
25 double angle(uint idx) const { return angles[getAngleIdx(idx)]; }
27 const std::vector<double> scales, angles;
32 ThreadCtx(cv::Size roi, uint num_features
34 , const std::vector<double> &scales
35 , const std::vector<double> &angles
42 , num_features(num_features)
43 , num_scales(IF_BIG_BATCH(scales.size(), 1))
44 , num_angles(IF_BIG_BATCH(angles.size(), 1))
47 , dbg_patch(scales, angles)
49 max.resize(scales.size() * angles.size());
50 dbg_patch.resize(scales.size() * angles.size());
59 ThreadCtx(ThreadCtx &&) = default;
61 void track(const KCF_Tracker &kcf, cv::Mat &input_rgb, cv::Mat &input_gray);
67 cv::Size freq_size = Fft::freq_size(roi);
69 MatScaleFeats patch_feats{num_scales * num_angles, num_features, roi};
70 MatScaleFeats temp{num_scales * num_angles, num_features, roi};
72 KCF_Tracker::GaussianCorrelation gaussian_correlation{num_scales * num_angles, num_features, roi};
74 MatScales ifft2_res{num_scales * num_angles, roi};
76 ComplexMat zf{uint(freq_size.height), uint(freq_size.width), num_features, num_scales * num_angles};
77 ComplexMat kzf{uint(freq_size.height), uint(freq_size.width), 1, num_scales * num_angles};
81 std::future<void> async_res;
84 MatScales response{num_scales * num_angles, roi};
92 ScaleRotVector<Max> max;
93 ScaleRotVector<cv::Mat> dbg_patch; // images for visual debugging
96 const double scale, angle;
97 cv::Mat dbg_patch; // image for visual debugging
101 #endif // SCALE_VARS_HPP