基于模板匹配的运动目标跟踪

来源:互联网 发布:未来java的发展前景 编辑:程序博客网 时间:2024/05/21 21:49

一、实验目的 

通过该实验,初步了解模板匹配算法,体会并学习如何用该算法实现视频跟踪。 

二、算法概要 

模板就是一幅已知的小图像。模板匹配就是在一幅大图像中搜寻目标。已知在该图中有要寻找的目标,且该目标与模板有相同的尺寸、方向和图像,通过一定的算法可以在图中找到目标,确定其坐标位置。 如图所示,设模板叠放在搜索图上平移,模板覆盖下的那块搜索图叫做子图, 这块子图的左上角像素点在图中的坐标,叫参考点,从图中可知的取值范围为: i, j  N -M , 其中,x N 为被搜索图的大小,x M 为模板的大小(如图 所示)。 

 

可以用向量余弦夹角来衡量 的相似程度:

 

当模板和子图完全一样时,R(i, j) =1。在被搜索图中逐个像素点地移动模板图像,同时 计算每处子图与模板的值,当移过整幅图像之后,找出的最大值 , 最大响应点坐标即为最佳匹配的左上角点。以该坐标为起始点,范围大小就以模板的大小为准就可以锁定目标。 

三、算法步骤 

1)首先取得待跟踪的目标图像,该目标图像常较小,称该图像为模板,以表示; 

2)定义匹配公式以备在移动模板时得到匹配度; 

3)把模板在待检测的图像(往往是视频中的一帧帧图像)中移动,在模板覆盖下那块搜索图叫做子图,每移动到一个位置就按定义的匹配公式计算匹配度,直至移动完整幅图像为止; 

4)按照匹配度的大小,选择匹配度最大(即最匹配)的位置,此位置即为最佳匹配位置,以此点为起始点,范围的大小就以模板的大小为准,即可锁定目标; 

5)针对视频中的每一帧图像执行步骤(3~4),这样就达到了跟踪的目的。 

四、程序使用说明 

void TemplateMatch(unsigned char *pTo,unsigned char *pTemplate)

{

int p,q,m,n;

float y=0,x1=0,x2=0,R[200][200],max=0,s=0,t=0;

for(p=0;p<bmpimage.infohead.biHeight-bmptemplate.infohead.biHeight;p++)

for(q=0;q<bmpimage.infohead.biWidth-bmptemplate.infohead.biWidth;q++) 

{

y=0;x1=0;x2=0;

for(m=0;m<bmptemplate.infohead.biHeight;m++)

for(n=0;n<bmptemplate.infohead.biWidth;n++)

{

s=*(bmpimage.imgbuf+((m+p)*bmpimage.infohead.biWidth+(n+q)));

t=*(bmptemplate.imgbuf+(m*bmptemplate.infohead.biWidth+n));

y+=s*t;

x1+=s*s;

x2+=t*t;

}

R[p][q]=y/(sqrt(x1)*sqrt(x2));

}

for(p=0;p<bmpimage.infohead.biHeight-bmptemplate.infohead.biHeight;p++)

for(q=0;q<bmpimage.infohead.biWidth-bmptemplate.infohead.biWidth;q++)

{

if(R[p][q]>max)

{

max=R[p][q];

nMaxX=q;

nMaxY=p;

}

}

}

0 0
原创粉丝点击