深度探索TLD的C++源码

首先提一点,我用的环境是VS2015+OpenCV3.2,在不同的环境下配制方法有出入,请对号入座。

网上的TLD有两个版本,一个是Zdenek Kalal自己使用matlab+vs混合编程实现的,另外一个是 arthurv利用c++和opencv实现的。

1.1、我利用的是arthurv版本的Tracking-Learning-Detection
连接:https://github.com/alantrrs/OpenTLD

1.2、下载得到的C++代码如下所示
其中:
datasets是一些视频数据;
doc是程序的流程图进行说明;
include是头文件;
src是源文件;
parameters.yml是参数文件;
readme是程序运行说明。

我们只要用到datasets、include、src、parameters.yml;

下面讲述如何在VS2015下创建工程;

2.1、创建一个空的solution(没有预编译的控制台程序)

2.2、首先将include中的文件拷贝放到src的文件夹中;然后将src、datasets、parameters.yml放到solution的工程目录下,如下所示:

2.3、编译项目,此时会冒出错误,下面为解决方法:
a.首先将头文件包含错误的全部由include 改成 include “TLD.h”;其他的头文件包含以此类推;解释一下:<>的引用是在整个文件目录,包括系统环境变量库里找,而“”是在当前文件目录里找。

b.关于在TLD.h中包含头文件#include 的问题;由于原作者是在opencv2.4的版本下进行的编译,由于opencv3的各种版本相对于opencv2的版本已经改变了很多内容,openTLD跟踪算法所依赖的一些函数在opencv3中已经消失了,最重要的一点就是到了Opencv3.2中已经不包括legacy.hpp库,所以我们需要添加PatchGenerator.h和PatchGenerator.cpp两个文件,并在对应的地方include头文件(对应的删掉legacy.hpp),才能做到不缺失文件。
两个文件参考地址:http://blog.csdn.net/j10527/article/details/51305087

c.LKTracker.cpp中:需要添加如下几行,以防止调用不到定义函数:

1
2
3
#include "vector"
#include "iostream"
using namespace std;

d.在TLD.h中,由于C++中的数组不能为变量,所以需要做如下修改:
将const int c = dbb.size();改为:
const int c = 100; 即定义为常数

e.对应的,TLD::clusterBB函数中,vs不支持动态数组分配。其中的动态数组需要改成指针和动态分配内存,并且需要在结尾处释放内存。

f.round、ceil和floor可能会出现错误,原因是round和ceil内部传入的参数必须是double或者float型,所以将这三个函数里面的数据改为float型,具体做法就是里面的整数后面加上小数点,比如2,就改为2.0。

1
2
int stepx = ceil(double((bb.width - 2.0 * margin_h)/max_pts));
int stepy = ceil(double((bb.height - 2.0 * margin_v)/max_pts));

g.打开run_tld.cpp 将其中的

1
2
3
if (strcmp(argv[i],"-tl")==0){
tl = true;
}

改为:

1
2
3
if (strcmp(argv[i],"-no_tl")==0){
tl = false;
}

对于下图这个修改,我是试过的,但是会出现如下问题:所以tl=false没有变,具体是为什么会出问题我还没有查明。


h.最后,由于这个项目是里面是先产生一个可执行文件在cmd下来执行,并且需要采用cmd命令预先调用parameters.yml中的初始化参数。这样不方便我们调试;因此我们要修改程序一开始的参数解析函数:

2.4 release完成后,在生成的文件夹中直接打开EXE文件,完美运行(仅对摄像头,测试视频未调用)

文章目录
  1. 1. 网上的TLD有两个版本,一个是Zdenek Kalal自己使用matlab+vs混合编程实现的,另外一个是 arthurv利用c++和opencv实现的。
  2. 2. 我们只要用到datasets、include、src、parameters.yml;
|