首页 > 代码库 > 图文详解OpenTLD平台的搭建

图文详解OpenTLD平台的搭建

图文详解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,亲~你的平台搭好了吗?技术分享技术分享技术分享



图文详解OpenTLD平台的搭建