版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_17783559/article/details/81949828
TLD跟踪算法C++版本github下载地址如下:
https://github.com/arthurv/OpenTLD
更多版本下载参考博客:http://blog.sina.com.cn/s/blog_6163bdeb0102eh7b.html
1、新建VS工程并将src文件和include文件都放置在工程目录中:
图中MyTLD.cpp对应 run_tld.cpp。
2、配置好OpenCV,并在TLD.h中添加头文件:
#include <opencv2\legacy\legacy.hpp>
原因:这是因为opencv版本不同,库路径不匹配,需要添加额外的库。
3、更改TLD.cpp中函数:int TLD::clusterBB(const vector<BoundingBox>& dbb,vector<int>& indexes);
int TLD::clusterBB(const vector<BoundingBox>& dbb,vector<int>& indexes){
//FIXME: Conditional jump or move depends on uninitialised value(s)
const int c = dbb.size();
//1. Build proximity matrix
Mat D(c,c,CV_32F);
float d;
for (int i=0;i<c;i++){
for (int j=i+1;j<c;j++){
d = 1-bbOverlap(dbb[i],dbb[j]);
D.at<float>(i,j) = d;
D.at<float>(j,i) = d;
}
}
//2. Initialize disjoint clustering
float *L;//Level
L = (float *)malloc((c - 1) * sizeof(float));
int **nodes;
nodes = (int **)malloc((c - 1) * sizeof(int *));
for (int i = 0; i < c - 1; i++)
{
*(nodes + i) = (int *)malloc(2 * sizeof(int));
}
int *belongs;
belongs = (int *)malloc( c * sizeof(int));
int m=c;
for (int i=0;i<c;i++){
belongs[i]=i;
}
for (int it=0;it<c-1;it++){
//3. Find nearest neighbor
float min_d = 1;
int node_a, node_b;
for (int i=0;i<D.rows;i++){
for (int j=i+1;j<D.cols;j++){
if (D.at<float>(i,j)<min_d && belongs[i]!=belongs[j]){
min_d = D.at<float>(i,j);
node_a = i;
node_b = j;
}
}
}
if (min_d>0.5){
int max_idx =0;
bool visited;
for (int j=0;j<c;j++){
visited = false;
for(int i=0;i<2*c-1;i++){
if (belongs[j]==i){
indexes[j]=max_idx;
visited = true;
}
}
if (visited)
max_idx++;
}
return max_idx;
}
//4. Merge clusters and assign level
L[m]=min_d;
nodes[it][0] = belongs[node_a];
nodes[it][1] = belongs[node_b];
for (int k=0;k<c;k++){
if (belongs[k]==belongs[node_a] || belongs[k]==belongs[node_b])
belongs[k]=m;
}
m++;
}
free(L);
free(belongs);
for (int i = 0; i < c - 1; i++)
{
free(*(nodes + i));
}
free(nodes);
return 1;
}
原因:如下图的地方,动态申请内存的方式不对。
4、更改初始化参数函数void TLD::read(const FileNode& file)(手动初始化,也可以按照原来的文件读取方式)
void TLD::read(void){
///Bounding Box Parameters
min_win = 15;
///Genarator Parameters
//initial parameters for positive examples
patch_size = 15;
num_closest_init = 10;
num_warps_init = 20;
noise_init = 5;
angle_init = 20.0;
shift_init = 0.02;
scale_init = 0.02;
//update parameters for positive examples
num_closest_update = 10;
num_warps_update = 10;
noise_update = 5;
angle_update = 10.0;
shift_update = 0.02;
scale_update = 0.02;
//parameters for negative examples
bad_overlap = 0.2;
bad_patches = 100;
classifier.read();
}
5、更改初始化参数函数void FerNNClassifier::read(const FileNode& file)(手动初始化,也可以按照原来的文件读取方式)
void FerNNClassifier::read(void){
///Classifier Parameters
valid = 0.5;
ncc_thesame = 0.95;
nstructs = 10;
structSize = 13;
thr_fern = 0.6;
thr_nn = 0.65;
thr_nn_valid = 0.7;
}
6、更改4、5步骤的函数声明及主函数中的调用
7、运行及调试TLD算法
8、更改好的代码百度云下载链接:
链接:https://pan.baidu.com/s/1TtiNazwOyk0Pc6PH-KfoWw 密码:kxh2