《视频中对运动物体跟踪的算法》由会员分享,可在线阅读,更多相关《视频中对运动物体跟踪的算法(5页珍藏版)》请在金锄头文库上搜索。
1、-视频中对多目标运动物体跟踪的算法解析1 算法目的:运动目标跟踪算法的目的就是对视频中的图象序列进展分析, 计算出目标在每帧图象上的位置。这里要根据区域分割过程给出的目标质心位置, 计算出目标位移,并且根据质心位置的变化判断出目标的运动方向, 以及运动目标是否在观察窗口, 实现对客流量的统计。 因为该跟踪是对多目标的追踪,需要找出运动目标在相邻帧上的对应区域。系统具有固有噪声, 目标周围背景的干扰可能会产生误差, 但这些噪声在前面的过程已经去除,如有必要可做适当调整修正。2 算法难点:1因为要跟踪的是多目标,需要找到相邻帧之间对应的运动目标区域不致跟踪混乱。2如何判断运动目标区域是否是新的目标
2、进入观测窗口3运动目标是否离开了观测窗口以及离开的方向;即计数器何时加1、是否加 14对跟踪过程中出现的一些偏差和问题,要进展必要的修正3 算法描述:1跟踪首先要判断的是:帧与帧之间如何将运动目标对应起来。追踪过程中的追踪特征是物体的质心由运动区域分割过程中给出 ,这里判断对应目标可以:a.只利用质心间的最短距离做为特征; b.利用加权系数将最短距离,运动目标区域的长度,宽度以及长宽比和面积等综合起来作为特征。2根据判断特征设置目标链,记录每个被跟踪目标的最新质心位置,为下步判断提供条件。另外将每个目标的质心位置存储起来, 可以随时掌握目标的运动情况, 为以后要输出目标的运动曲线做根底。3每进
3、入观察窗口一个新的运动目标,就将它的最新质心位置参加该目标链。如何判断该运动目标是新的:设置门限值ymin,yma*当 yminyyma*或 yymin 可认为是新目标区域 ,当有目标的质心位置 目标.yyma*并且它的标志位为未被跟踪, 则肯定是新目标 在新目标区域出现的目标有可能是要离开观测窗口的目标,不过它们的标志位肯定为被跟踪 。这样判断出来的新目标方向是有出、入之分的。4与目标链MBhl相对应的还有位置数组(WZmn),用来存放目标链中相应目标的质心位置。最初进展处理时,目标链是空的,在当前帧中假设有新目标,则将其横、纵坐标参加到目标链中,并存储在对应的位置数组中,置标记为被跟踪。5
4、处理新的当前帧时,首先将目标链 MB 中每个元素代表前一帧中所有运动目标依次与当前帧中记录的每个运动目标进展距离计算,求出其中最小距离d假设是 MBi与当前帧中运动目标 t 的质心距离 则判断 d 与门限值的大小,假设 d则说明该最小值缺乏以证明它们是对应目标,可能 MBi代表的目标已经不在跟踪窗口,则做如下处理:检查对应 MBi代表的目标质心位置的最新记录, 如果 MBi1(纵坐标)yma*,可认为目标离开观测窗口,并且方向是进入,则计数器加1;如果 MBi1 ymin,目标离开观测窗口,但方向是出去,计数器不动作。6设置数组 CCmn,存储离开观测窗口并且方向是进入的运动目标质心位置记录,
5、象5 中的 MBi假设是进入就将对应位置记录WZi存放在数组 CC 中, 同时去除 MBi中的特征值和 WZi中的质心记录。这里可以另外设置一个空闲位置数组 KWZi,记录被清空的.z-WZ 中的位置,每次有新目标到来,须分配数组空间就先检查是否有被清空的记录。7直至目标链中的目标检查完毕,则查看当前祯中的各运动目标,如有未被标记的,且在新目标区域中则将其参加到目标链中,标记设为已被跟踪。8接收新的当前祯,继续如此处理。处理过程中可能出现的几个问题为:1 如果当前祯中一个运动目标t 已经被标记, 但是当处理到目标链中下一个目标是最小距离的仍是 t,说明目标链中有两个目标都与t 的距离最小,这样
6、就需要调整。2 如果门限值设置不当,则可能产生误判。3 如果目标链中所有目标检查完毕,但是在当前祯中有未被标记并且不在新目标区域,即不是新目标,又不是被跟踪目标的相应目标,则有过失出现,可能是噪声。4 是否将离开观测窗口并且运动方向是出去的目标质心位置存储在数组CC 中。4算法实现数据构造:a. 设置数组 WZmn用来存放跟踪过程中被跟跟踪目标的各时刻质心位置,WZi0存放下次填写质心记录的位置,从WZ01开场记录横坐标。b. 设置数组 MBM2存放目标链,记录被跟踪目标的最新质心位置,MB00存放被跟踪目标的个数,MB01闲置。c. 设置数组 CChl存放离开观察窗口已跟踪完毕的各目标的质心
7、位置,供假设质心位置曲线,提高精度用。d. 设置 KWZm记录清空的 WZ 数组序号;KWZ0表示清空的 WZ 数组元素的个数,假设再次分配数组空间给新目标时,先检查KWZ 数组中 KWZ0是否为 0,假设为 0,则分配新数组空间,否则重新利用被清空的数组位置e. 设置门限值,yma*,ymin.f.接收到的运动目标为一个struct初始化:For (I=0;Im;I+) WZI0=1;MBI0=-1; 置初值;MBI1=-1;for(I=0;In;I+)CCI0=-1; 初始化数组 CC,初始化数组 KWZ;KWZ0=0; 初始化时没有清空的数组MB00=0;记录目标链中目标的数目Curso
8、rm=1; 记录目标链中最末位置Cursorc=0; 记录数组 CC 中最末位置Count=0; 计数器While ( 有下一祯数据传送 ) for( I=1;Icursorm;I+) 依次对目标链各目标进展处理 *=MBI0;y=MBI1;p=head; p 指向一祯数据的头.z-do 接收当前祯的数据;d=sqrt(pow(*-p.*,2)+pow(y-p.y,2);if(dne*t;while ( 当前祯的数据接收完全 )if ( dyma*) 离开观测窗口方向是进入 count+;将 WZI中的记录转存到 CC 数组中;cursorc+;去除 WZI和 MBI中的数据;KWZ0+; 标
9、记空闲数组元素个数KWZKWZ0=I;if(MBI1ymin) 离开观测窗口方向是出去 去除 WZI和 MBI;KWZ0+;KWZKWZ0=I;目标链中的所有目标处理完毕且目标链不空则: 判断当前祯中各运动目标的标记;p=head; 重新指向一祯的开头while ( p!=null) if(p.mark=n)if(p.yyma*) 将该新目标参加到目标链中;p.mark=y;else 出错处理,修正;出现既非新目标又非被跟踪目标p=p-ne*t;.z-if (MB00=0) 说明还未有被跟踪目标,目标链为空 依次读取当前祯的数据;p=head;while (当前祯数据未完) if ( p.ma
10、rk=n&(p.y yma*) 在新目标区域 MBcursorm0=p.*;MBcursorm1=p.y; 修改最新质心位置MB00+;WZcursormWZcursorm0=p.*;WZcursormWZcursorm0=p.y;WZcursorm0=WZcursorm0+2;p.mark=y;cursorm+;p=p-ne*t;接收下一祯运动目标的数据构造; 对应 while 循环5 算法优化:其中,ymin 和 yma*的取值要得当,否则会出现过失,这需要反复测试得到适宜的值。另外对图象的噪声影响和跟踪过程中出现的不期望的结果如果进展修正, 则结果可能会更准确。6 各个函数功能及其输入输
11、出所有函数在程序 track.c 中存放。1void Init() 初始化函数,将程序中全局变量数组WZ 和 MB 初始化,kwhead 是指向空闲数组位置的指针,初始化为NULL,cursorm 的值表示数组 WZ 和 MB 的最大下标+1;其中 MB00存放正在被跟踪目标个数,WZI0存放第 I 个被跟踪目标的下一个轨迹质心存放位置在数组 WZ 中 ,countin,countout 分别记录进入和出去的人数;2void Addkw(int *h):功能:将释放的数组元素下标参加一个链表中,便于以后分配。输入:刚释放的数组元素的下标*h;输出:无输出,下次分配时,利用指针头kwhead 依
12、次分配数组空间。3int Delkw():功能:有新的目标出现在运动区域,找到适宜的数组下标,将此数组空间分配给该目标。输入:无输入,直接调用该函数,从kwhead 所指的链表中为空闲数组下标依次分配空间。输出:输出要分配的数组下标。5 int Get*yma*(int WZtempNma*):功能:从数组 Wztemp 所记录的运动轨迹中找到最大的横坐标或纵坐标。输入:输入该运动目标的所有运动轨迹记录Wztemp.输出:输出找到的最大的横坐标或纵坐标如果定义Coordinate 则找最大的横坐标,此时运动目标在横轴上运动幅度较大而纵轴上几乎不变.z-6 int Get*ymin(int WZ
13、tempNma*):功能:从数组 Wztemp 所记录的运动轨迹中找到最小的横坐标或纵坐标。输入:输入该运动目标的所有运动轨迹记录Wztemp;输出:输出找到的最小的横坐标或纵坐标。7 void HandledataY():如果没有定义 Coordinate表示目标运动方向是顺着或逆着纵坐标则运行该程序。功能:处理得到的运动质心,将各质心位置一一对应,找到各个运动目标的运动轨迹, 并记数。输入:无输入,数据的得到靠指针的传递,Crhead 是每一帧目标质心位置的头指针,靠指针的移动来读取数据。输出:无输出,直接修改全局变量,得到被跟踪目标的运动轨迹和最新位置,并根据相应的情况修改 countin 和 countout。在该函数中处理了一般情况和一些特殊情况, 比方:运动目标在运动区域来回运动、 以及停顿不动,几帧之后重新运动、丧失一些帧的相关处理等等。8 void Handledata*()如果定义 Coordinate表示目标运动方向是顺着或逆着横坐标则运行该程序。功能,输入和输出同7 。2008/10/20/3109123.asp*.z