struck(結構化SVM用於視覺跟蹤)--原始碼詳解--sampler.cpp
阿新 • • 發佈:2019-01-02
struck中,作者的的取樣方式都很簡單,採用的都是均勻取樣;
在進行預測評估eval的時候,使用的是基於畫素的取樣,也就是每個畫素點變化,都取樣一次;
在進行更新update的時候,採用的是radial和regular的取樣,就是根據半徑和角度的變化確定取樣框,其中有5種半徑,16種方向,再加上(0,0),最後有81個取樣框;
程式碼以及註釋如下:
#include "Sampler.h" #include "Config.h" #define _USE_MATH_DEFINES #include <cmath> #include <math.h> using namespace std; vector<FloatRect> Sampler::RadialSamples(FloatRect centre, int radius, int nr, int nt) { vector<FloatRect> samples; FloatRect s(centre); float rstep = (float)radius/nr;//半徑變化的步長 float tstep = 2*(float)M_PI/nt;//角度變化的步長 samples.push_back(centre); for (int ir = 1; ir <= nr; ++ir) { float phase = (ir % 2)*tstep/2;//這個phase可加可不加,加之後可以使得sample分佈更加均勻,準確的來說,角度劃分為了2*nt種 for (int it = 0; it < nt; ++it) { float dx = ir*rstep*cosf(it*tstep+phase);//半徑乘以角度的餘弦 float dy = ir*rstep*sinf(it*tstep+phase);//半徑乘以角度的正弦 s.SetXMin(centre.XMin()+dx); s.SetYMin(centre.YMin()+dy); samples.push_back(s); } } return samples; } vector<FloatRect> Sampler::PixelSamples(FloatRect centre, int radius, bool halfSample) { vector<FloatRect> samples;//作者在30為半徑的園內進行搜尋,有pi*30*30 = 2831 IntRect s(centre); samples.push_back(s);//上一幀的rect放在vector的第一個,也即是這一幀的搜尋中心 int r2 = radius*radius; for (int iy = -radius; iy <= radius; ++iy) { for (int ix = -radius; ix <= radius; ++ix) { if (ix*ix+iy*iy > r2) continue;//這種情況就不會發生 if (iy == 0 && ix == 0) continue; // already put this one at the start int x = (int)centre.XMin() + ix; int y = (int)centre.YMin() + iy; if (halfSample && (ix % 2 != 0 || iy % 2 != 0)) continue;//如果是半取樣,逢偶數就跳過 s.SetXMin(x); s.SetYMin(y); samples.push_back(s); } } return samples; }