基于sift特征的动态场景小目标跟踪算法

初始检测得到运动目标中心坐标点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);
第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);
第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步,直到帧数到达一定值后,终止循环。

你可能感兴趣的:(object,detection,algorithm,opencv,C/C++,vs)