目标跟踪算法TLD配置(OpenTLD+VS2015+Win7+Opencv2.4.13)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/qq_17783559/article/details/81949828
今日推荐