Struck 跟踪算法(二)

时间:2021-05-08 23:47:13

以下開始读详细源代码

config.h文件

/*
* Struck: Structured Output Tracking with Kernels
*
* Code to accompany the paper:
* Struck: Structured Output Tracking with Kernels
* Sam Hare, Amir Saffari, Philip H. S. Torr
* International Conference on Computer Vision (ICCV), 2011
*
* Copyright (C) 2011 Sam Hare, Oxford *es University, Oxford, UK
*
* This file is part of Struck.
*
* Struck is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Struck is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Struck. If not, see <http://www.gnu.org/licenses/>.
*
*/ #ifndef CONFIG_H
#define CONFIG_H #include <vector>
#include <string>
#include <ostream> #define VERBOSE (0) class Config
{
public:
Config() { SetDefaults(); }
Config(const std::string& path);
//选择提取特征的方式 Haar特征,Raw特征,Histogram特征
enum FeatureType
{
kFeatureTypeHaar,
kFeatureTypeRaw,
kFeatureTypeHistogram
};
//SVM四种核函数
enum KernelType
{
kKernelTypeLinear,
kKernelTypeGaussian,
kKernelTypeIntersection,
kKernelTypeChi2
}; struct FeatureKernelPair
{
FeatureType feature;
KernelType kernel;
std::vector<double> params;
}; bool quietMode;
bool debugMode; std::string sequenceBasePath; //图像序列路径
std::string sequenceName;//图像序列目录名
std::string resultsPath; //结果路径 int frameWidth;//图像宽度
int frameHeight;//图像高度 int seed;
int searchRadius; //搜索半径
double svmC;
int svmBudgetSize; //svm大小
std::vector<FeatureKernelPair> features; friend std::ostream& operator<< (std::ostream& out, const Config& conf); private:
void SetDefaults();
static std::string FeatureName(FeatureType f);
static std::string KernelName(KernelType k);
}; #endif
/*
* Struck: Structured Output Tracking with Kernels
*
* Code to accompany the paper:
* Struck: Structured Output Tracking with Kernels
* Sam Hare, Amir Saffari, Philip H. S. Torr
* International Conference on Computer Vision (ICCV), 2011
*
* Copyright (C) 2011 Sam Hare, Oxford *es University, Oxford, UK
*
* This file is part of Struck.
*
* Struck is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Struck is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Struck. If not, see <http://www.gnu.org/licenses/>.
*
*/ #include "Config.h" #include <fstream>
#include <iostream>
#include <sstream> using namespace std; Config::Config(const std::string& path)
{
SetDefaults(); ifstream f(path.c_str());
if (!f)
{
cout << "error: could not load config file: " << path << endl;
return;
} string line, name, tmp;
while (getline(f, line))
{
istringstream iss(line);
iss >> name >> tmp; // skip invalid lines and comments
if (iss.fail() || tmp != "=" || name[0] == '#') continue; if (name == "seed") iss >> seed;
else if (name == "quietMode") iss >> quietMode;
else if (name == "debugMode") iss >> debugMode;
else if (name == "sequenceBasePath") iss >> sequenceBasePath;
else if (name == "sequenceName") iss >> sequenceName;
else if (name == "resultsPath") iss >> resultsPath;
else if (name == "frameWidth") iss >> frameWidth;
else if (name == "frameHeight") iss >> frameHeight;
else if (name == "seed") iss >> seed;
else if (name == "searchRadius") iss >> searchRadius;
else if (name == "svmC") iss >> svmC;
else if (name == "svmBudgetSize") iss >> svmBudgetSize;
else if (name == "feature")
{
string featureName, kernelName;
double param;
iss >> featureName >> kernelName >> param; FeatureKernelPair fkp; if (featureName == FeatureName(kFeatureTypeHaar)) fkp.feature = kFeatureTypeHaar;
else if (featureName == FeatureName(kFeatureTypeRaw)) fkp.feature = kFeatureTypeRaw;
else if (featureName == FeatureName(kFeatureTypeHistogram)) fkp.feature = kFeatureTypeHistogram;
else
{
cout << "error: unrecognised feature: " << featureName << endl;
continue;
} if (kernelName == KernelName(kKernelTypeLinear)) fkp.kernel = kKernelTypeLinear;
else if (kernelName == KernelName(kKernelTypeIntersection)) fkp.kernel = kKernelTypeIntersection;
else if (kernelName == KernelName(kKernelTypeChi2)) fkp.kernel = kKernelTypeChi2;
else if (kernelName == KernelName(kKernelTypeGaussian))
{
if (iss.fail())
{
cout << "error: gaussian kernel requires a parameter (sigma)" << endl;
continue;
}
fkp.kernel = kKernelTypeGaussian;
fkp.params.push_back(param);
}
else
{
cout << "error: unrecognised kernel: " << kernelName << endl;
continue;
} features.push_back(fkp);
}
}
}
//默认參数设置
void Config::SetDefaults()
{ quietMode = false;
debugMode = false; sequenceBasePath = "";
sequenceName = "";
resultsPath = ""; frameWidth = 320;
frameHeight = 240; seed = 0;
searchRadius = 30;
svmC = 1.0;
svmBudgetSize = 0; features.clear();
} std::string Config::FeatureName(FeatureType f)
{
switch (f)
{
case kFeatureTypeRaw:
return "raw";
case kFeatureTypeHaar:
return "haar";
case kFeatureTypeHistogram:
return "histogram";
default:
return "";
}
} std::string Config::KernelName(KernelType k)
{
switch (k)
{
case kKernelTypeLinear:
return "linear";
case kKernelTypeGaussian:
return "gaussian";
case kKernelTypeIntersection:
return "intersection";
case kKernelTypeChi2:
return "chi2";
default:
return "";
}
} ostream& operator<< (ostream& out, const Config& conf)
{
out << "config:" << endl;
out << " quietMode = " << conf.quietMode << endl;
out << " debugMode = " << conf.debugMode << endl;
out << " sequenceBasePath = " << conf.sequenceBasePath << endl;
out << " sequenceName = " << conf.sequenceName << endl;
out << " resultsPath = " << conf.resultsPath << endl;
out << " frameWidth = " << conf.frameWidth << endl;
out << " frameHeight = " << conf.frameHeight << endl;
out << " seed = " << conf.seed << endl;
out << " searchRadius = " << conf.searchRadius << endl;
out << " svmC = " << conf.svmC << endl;
out << " svmBudgetSize = " << conf.svmBudgetSize << endl; for (int i = 0; i < (int)conf.features.size(); ++i)
{
out << " feature " << i << endl;
out << " feature: " << Config::FeatureName(conf.features[i].feature) << endl;
out << " kernel: " << Config::KernelName(conf.features[i].kernel) <<endl;
if (conf.features[i].params.size() > 0)
{
out << " params: ";
for (int j = 0; j < (int)conf.features[i].params.size(); ++j)
{
out << " " << conf.features[i].params[j];
}
out << endl;
}
} return out;
}

以上是初始化文件源代码

兴许、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、