初始检测得到运动目标中心坐标点P(x,y)、宽度width、高度height和pt1和pt2坐标点信息。
第1步: n1 = sift_features(image, &feat1,1,pt1,pt2 ); 计算目标区域扩大一点,再计算其特征点描述信息。
具体区域大小:
n=1/pow(2.0,o);
a=2*n*(pt1.y-2);
b=2*n*(pt1.x-2);
f=2*n*(pt2.y+2);
e=2*n*(pt2.x+2);
具体区域大小:
n=1/pow(2.0,o);
a=2*n*(pt1.y-2);
b=2*n*(pt1.x-2);
f=2*n*(pt2.y+2);
e=2*n*(pt2.x+2);
第2步: n2 = sift_features(frame, &feat2,2,pt1,pt2 ); 在序列的下一帧中将区域扩大,计算特征点描述信息。
具体区域大小:
n=1/pow(2.0,o);
width=1*(pt2.x-pt1.x);
height=1*(pt2.y-pt1.y);
a= 2*n*(pt1.y-height);
b= 2*n*( pt1.x-width);
f=2*n*(pt1.y+2*height);
e =2*n*(pt1.x+2*width);
具体区域大小:
n=1/pow(2.0,o);
width=1*(pt2.x-pt1.x);
height=1*(pt2.y-pt1.y);
a= 2*n*(pt1.y-height);
b= 2*n*( pt1.x-width);
f=2*n*(pt1.y+2*height);
e =2*n*(pt1.x+2*width);
第3步: kd树搜索匹配到的特征点,更新目标位置信息。
kd_root = kdtree_build( feat2, n2 );
for( i = 0; i< n1; i++ )
{
feat = feat1 + i;
k = kdtree_bbf_knn( kd_root, feat, 2, &nbrs, KDTREE_BBF_MAX_NN_CHKS );
if( k == 2 )
{
d0 = descr_dist_sq( feat, nbrs[0] );
d1 = descr_dist_sq( feat, nbrs[1] );
if( d0 < d1 *0.5 )
{
pt4 = cvPoint( cvRound( feat->x ), cvRound( feat->y ) );
pt5 = cvPoint( cvRound( nbrs[0]->x ), cvRound( nbrs[0]->y ) );
p++;
pt.x=pt.x+pt5.x;
pt.y=pt.y+pt5.y;
feat1[i].fwd_match = nbrs[0];
scl1 = scl1+feat->scl;
scl2 = scl2+nbrs[0]->scl;
}
}
free( nbrs );
}
第4步: 更新目标位置信息,画框。
pt1.x=pt.x-0.5*width;
pt1.y=pt.y-0.5*height;
pt2.x=pt.x+0.5*width;
pt2.y=pt.y+0.5*height;
cvRectangle(frame,pt1,pt2,cvScalar(0,0,255,0),1,8,0);
第5步: 第4步更新的位置信息之后,再依次进行第2步、第3步、第4步,直到帧数到达一定值后,终止循环。
kd_root = kdtree_build( feat2, n2 );
for( i = 0; i< n1; i++ )
{
feat = feat1 + i;
k = kdtree_bbf_knn( kd_root, feat, 2, &nbrs, KDTREE_BBF_MAX_NN_CHKS );
if( k == 2 )
{
d0 = descr_dist_sq( feat, nbrs[0] );
d1 = descr_dist_sq( feat, nbrs[1] );
if( d0 < d1 *0.5 )
{
pt4 = cvPoint( cvRound( feat->x ), cvRound( feat->y ) );
pt5 = cvPoint( cvRound( nbrs[0]->x ), cvRound( nbrs[0]->y ) );
p++;
pt.x=pt.x+pt5.x;
pt.y=pt.y+pt5.y;
feat1[i].fwd_match = nbrs[0];
scl1 = scl1+feat->scl;
scl2 = scl2+nbrs[0]->scl;
}
}
free( nbrs );
}
第4步: 更新目标位置信息,画框。
pt1.x=pt.x-0.5*width;
pt1.y=pt.y-0.5*height;
pt2.x=pt.x+0.5*width;
pt2.y=pt.y+0.5*height;
cvRectangle(frame,pt1,pt2,cvScalar(0,0,255,0),1,8,0);
第5步: 第4步更新的位置信息之后,再依次进行第2步、第3步、第4步,直到帧数到达一定值后,终止循环。