基于DSP的目标跟踪

基于DSP的目标跟踪


一、目标

利用VisualDSP++ 5.0、仿真器、EBF-561实验平台实现该算法,初步了解运动目标跟踪算法基本原理,体会并学习如何用该算法实现视频跟踪,并完成模板匹配跟踪部分的程序。

二、实现方案

实验原理

模板匹配就是在一幅大图像中搜寻目标,已知在该图中有要寻找的目标,且该目标与模板有相同的尺寸、方向和图像,通过一定的算法可以在图中找到目标,确定其坐标位置。

设模板T叠放在搜索图S上平移,模板覆盖下的那块搜索图叫做子图,这块子图的左上角像素点为S的坐标,即参考点。

我们可以用下式来衡量T和S的相似程度:

1

展开上式,则有:

2

上式等号右边第三项表示模板的总能量,是一个常数与坐标位置无关,第一项是模板覆盖下那块子图的能量,它随坐标位置的改变而缓慢改变,这两项都与模板匹配无关。第二项是子图像和模板的互相关,T和S匹配时该项有最大值。

改进的用于匹配的相关系数计算公式如下:

3

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

实验步骤

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

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

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

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

(5)针对视频中的每一帧图像执行步骤(3)~(4),实现目标跟踪的目的。

三、核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
void readTemData()
{
int_t i,j;
unsigned char temp;

for(i=0;i<Chang;i++)
{
for(j=0;j<Kuan*3;j++)
{
TempBuffer_img[i][j] = Inputdata[i*Kuan*3+j+54];
}
}

for(i=0;i<Chang;i++)
{
for(j=0;j<Kuan;j++)
{
imageRtemp[i*Kuan+j] = TempBuffer_img[i][j*3];
}
}

for(i=0;i<Chang*Kuan;i++)
{

imageTemp[Chang*Kuan-1-i] = imageRtemp[i];
}

}

double cal_r(unsigned char s[],unsigned char t[],int x,int y)
{
int i,j,k=0;
long double r=0,a=0,b=0,c=0;

for (i=x;i<x+36;i++)
{
for(j=y;j<y+52;j++)
{
a=a+s[120*i+j]*t[k];
b=b+s[120*i+j]*s[120*i+j];
c=c+t[k]*t[k];
k++;
}
}
r=a/(sqrt(b))/sqrt(c);

return r;
}

void delay()
{
int i,j;
for(i=0;i<1000;i++)
{
for(j=0;j<1000;j++)
{
}
}
}

void TemplateMatch(unsigned char image[],unsigned char imageTemp[])
{
int i,j,x,y;
long double temp=-2,r;

for(i=0;i<44;i++)
{
for(j=0;j<68;j++)
{
r=cal_r(image,imageTemp,i,j);
if(r>=temp)
{
temp=r;
x=i;
y=j;
}
}

}


for(i=y;i<y+52;i++)
{
image[i+x*120]=0;
image[i+(x+36)*120]=0;
}
for(j=x;j<x+36;j++)
{
image[y+j*120]=0;
image[(y+52)+j*120]=0;
}
}

int main()
{
Init_EBIU();
lcd_init();
readTemData();

int m;
for(m=1;m<=12;m++)
{
readData(m);

switch(m)
{
case 1:
TemplateMatch(image1,imageTemp);
bmp2rgb24(image1);
Init_Platform_TFT();
delay();
break;
case 2:
TemplateMatch(image2,imageTemp);
bmp2rgb24(image2);
Init_Platform_TFT();
delay();
break;
case 3:
TemplateMatch(image3,imageTemp);
bmp2rgb24(image3);
Init_Platform_TFT();
delay();
break;
case 4:
TemplateMatch(image4,imageTemp);
bmp2rgb24(image4);
Init_Platform_TFT();
delay();
break;
case 5:
TemplateMatch(image5,imageTemp);
bmp2rgb24(image5);
Init_Platform_TFT();
delay();
break;
case 6:
TemplateMatch(image6,imageTemp);
bmp2rgb24(image6);
Init_Platform_TFT();
delay();
break;
case 7:
TemplateMatch(image7,imageTemp);
bmp2rgb24(image7);
Init_Platform_TFT();
delay();
break;
case 8:
TemplateMatch(image8,imageTemp);
bmp2rgb24(image8);
Init_Platform_TFT();
delay();
break;
case 9:
TemplateMatch(image9,imageTemp);
bmp2rgb24(image9);
Init_Platform_TFT();
delay();
break;
case 10:
TemplateMatch(image10,imageTemp);
bmp2rgb24(image10);
Init_Platform_TFT();
break;
case 11:
TemplateMatch(image11,imageTemp);
bmp2rgb24(image11);
Init_Platform_TFT();
break;
case 12:
TemplateMatch(image12,imageTemp);
bmp2rgb24(image12);
Init_Platform_TFT();
while(1);

break;
}
}
}