TLD调试

来源:互联网 发布:知画生孩子是哪一集 编辑:程序博客网 时间:2024/06/08 14:20

TLD即Tracking Learning Detector,它由英国萨里大学的一个捷克学生Zdenek Kalal提出的一个目标跟踪的算法。TLD跟踪系统最大的特点就在于能对锁定的目标进行不断的学习,以获取目标最新的外观特征,从而及时完善跟踪,以达到最佳的状态。也就是说,开始时只提供一帧静止的目标图像,但随着目标的不断运动,系统能持续不断地进行探测,获知目标在角度、距离、景深等方面的改变,并实时识别,经过一段时间的学习 之后,目标就再也无法躲过。TLD技术有三部分组成,即跟踪器、学习过程和检测器。TLD技术采用跟踪和检测相结合的策略,是一种自适应的、可靠的跟踪技术。TLD技术中,跟踪器和检测器并行运行,二者所产生的结果都参与学习过程,学习后的模型又反作用于跟踪器和检测器,对其进行实时更新,从而保证了即使在目标外观发生变化的情况下,也能够被持续跟踪。这些特点决定了TLD算法在跟踪方面具有很好的效果,现在基于此的研究渐渐增多,但实际中由于此算法还比较年轻,所以其应用还不是很广泛,但是可以相信未来该算法的应用将会很广。

网上的TLD有两个版本,一个是Zdenek Kalal自己使用matlab+vs混合编程实现的,另外一个是 arthurv利用c++和opencv实现的。我调试的是后一个。调试的过程中有如下错误:

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

2. TLD::clusterBB函数中,vs不支持这种动态数组分配。
float L[c-1]; //Level
int nodes[c-1][2];
int belongs[c];
改成指针和动态分配内存
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];
记得在函数末释放分配的内存
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;

然后就可以调试通过。

如何运行?请看readme.txt,里面说明非常详细。

后面继续慢慢来学习TLD。

原创粉丝点击