图文详解OpenTLD平台的搭建
本文以图文的方式详解了OpenTLD平台的搭建。硬件平台:装有Windows 7/8/XP的电脑一台;软件平台:OpenTLD、OpenCV、Visual Studio 2010。
1、软件下载
OpenTLD:https://github.com/arthurv/OpenTLD/tree/master
OpenCV:http://opencv.org/downloads.html
下载后如下图:
对OpenCV解压:双击=》点击Extract:
再对OpenTLD解压,解压后得到下图:
2、OpenCV用户变量和系统变量的设置
计算机=》属性=》高级系统设置:
高级=》环境变量:
首先设置用户变量:
(注意:x86代表你的电脑是32位系统,vc10代表你的平台是VS2010版本。)
再设置系统变量:
(注意:x86代表你的电脑是32位系统,vc10代表你的平台是VS2010版本。)
3、Visual Studio 2010工程的建立
打开软件=》New Project:
然后按下图设置:
点击OK后点击Next:
最后按照下图选择,最后点击Finish:
4、在VS中设置OpenCV
这是因为我们使用的OpenTLD要调用OpenCV库,这三步很重要,不可省略。
第一步单击项目属性(Properties)=》VC++ Directiories=》Include Directiories:
(把OpenCV的include加进去,如下图的第3步所示)
第二步单击项目属性(Properties)=》VC++ Directiories=》Library Directiories:
(把OpenCV的lib加进去,如下图的第3步所示)
第三步单击项目属性(Properties)=》Linker=》Input=》Additional Dependencies:
(把OpenCV的lib加进去,如下图的第4步所示)
需要注意的是:第三步中加载的lib与第二步加载的lib不是同一个东西。第二步加载的lib是路径,第三步加载的是该路径下的内容,如下图所示:(此处需要特别注意的是,在Release时加载的是下图中划线的那些,即xxx.lib,若是Debug模式,则加载xxxd.lib)。
5、将OpenTLD的头文件和源代码复制到VS当前工作目录
OpenTLD的头文件:
OpenTLD的源代码:
然后把它们加载到当前工程中:
6、修改OpenTLD的头文件
将四个头文件中的#include< >都修改为#include" ":
在TLD.h中我们会发现PatchGenerator会出错,如下图:
这是因为原作者没有添加定义PatchGenerator类的头文件,我们把该头文件加上即可,如下图:
7、添加round函数
添加round函数,是因为VS中没有自带这个函数,而OpenTLD用到了这个函数。
第一步:在TLD.h中加入下面的代码:
int round(float f);
如下图所示:
第二步将下面代码加入TLD.cpp中,代码如下:
int TLD::round(float f) { if ((int)f+0.5>f) return (int)f; else return (int)f + 1; }
如下图所示:
8、将VS工程下的四个头文件复制到VS的安装路径
完成前7步,编译后我们发现找不到头文件,如下图所示:
解决方法就是将修改后OpenTLD头文件复制到VS的安装路径下,如下图:
9、ceil错误和floor错误的修改
完成第8步后相信你的工程可以编译,不过出现很多warning和几处errors,下面依次解决这些问题。
编译之后出现警告和错误提示如下:
第一步,ceil错误的解决:错误如下图:
解决方法如下图:
第二步,floor错误的解决,错误如下图:
解决方法如下图:
10、动态数组分配错误的解决方法
在TLD::clusterBB函数中,vs不支持这种动态数组分配,所以出现如下错误:
解决方法如下图,注释掉源代码中的分配动态数组的方法,把下面代码加进去:
float *L = new float [c-1]; //Level int **nodes = new int *[c-1]; for(int i = 0; i < 2 ;i ++) nodes[i] = new int [c-1]; int *belongs = new int [c];
最后不要忘记释放分配的动态内存,加入如下代码,加入地方是该函数最后,即return 1前面,如下图:
delete [] L; L = NULL; for (int i = 0; i < 2; ++i) { delete [] nodes[i]; nodes[i] = NULL; } delete []nodes; nodes = NULL; delete [] belongs; belongs = NULL;
最后,编译成功。大功告成。
11、DEMO演示
首先将OpenTLD下的datasets文件夹和parameters.yml复制到当前工程目录下,如下图:
将datasets中的视频复制出来,以david为例,此时,david测试视频和parameters.yml都在当前工程的工作目录下了。
接着修改主函数中的代码,也就是如何让代码读取david测试视频,方法如下图所示:
编译运行,结果如下图:
一切OK,亲~你的平台搭好了吗?