⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 search.c

📁 运动估计
💻 C
📖 第 1 页 / 共 4 页
字号:
      op.c+=1;
#endif
      if(b2[i]->mae<(*err)){
         m=x+b2[i]->mv.x;
         n=y+b2[i]->mv.y;
         terr=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
#ifdef OPC
         op.c+=1;
#endif
         if(terr<(*err)){
            *err=terr;
            mv=b2[i]->mv;
         }
      }
   }
#ifdef OPC
   op.c-=2;   /* The first MAD needs no comparison */
#endif
   return mv;
}

MV three_step_search(u_char *prev,u_char *cur, int x, int y, int *err)
{
   int cx,cy;
   int step_size=cint(MAX_DISP)>>1;
   MV mv,tmv;
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT);
   spt++;
   mv.x=mv.y=0;
   cx=x;
   cy=y;
   while(step_size>=1){
      tmv=cir_search(prev,cur,cx,cy,x,y,err,0,8,step_size);
      spt+=8;
      mv.x+=tmv.x;
      mv.y+=tmv.y;
      cx+=tmv.x;
      cy+=tmv.y;
      step_size=step_size>>1;
   }
   return mv;
}

MV new_three_step_search(u_char *prev,u_char *cur, int x, int y, int *err)
{
   int cx,cy,err1,err2;
   int step_size=cint(MAX_DISP)>>1;
   MV mv,tmv,tmv1;
   mv.x=mv.y=0;
   cx=x;
   cy=y;
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT);
   spt++;
   err1=err2=(*err);
   tmv1=cir_search(prev,cur,cx,cy,x,y,&err1,0,8,1);
   tmv=cir_search(prev,cur,cx,cy,x,y,&err2,0,8,step_size);
   spt+=16;
   if(tmv.x==0 && tmv.y==0 && tmv1.x==0 && tmv1.y==0)
      return mv;
   if(err1<=err2){
      step_size=1;
      *err=err1;
      tmv=tmv1;
      mv.x+=tmv.x;
      mv.y+=tmv.y;
      cx+=tmv.x;
      cy+=tmv.y;
      if(abs(tmv.x)==abs(tmv.y)){
         tmv=cir_search(prev,cur,cx,cy,x,y,err,mvmap[tmv.y+1][tmv.x+1],5,step_size);
         spt+=5;
      }
      else{
         tmv=cir_search(prev,cur,cx,cy,x,y,err,mvmap[tmv.y+1][tmv.x+1],3,step_size);
         spt+=3;
      }
      mv.x+=tmv.x;
      mv.y+=tmv.y;
      return mv;
   }
   step_size=step_size>>1;
   *err=err2;
   mv.x+=tmv.x;
   mv.y+=tmv.y;
   cx+=tmv.x;
   cy+=tmv.y;
   while(step_size>=1){
      tmv=cir_search(prev,cur,cx,cy,x,y,err,0,8,step_size);
      spt+=8;
      mv.x+=tmv.x;
      mv.y+=tmv.y;
      cx+=tmv.x;
      cy+=tmv.y;
      step_size=step_size>>1;
   }
   return mv;
}

MV four_step_search(u_char *prev,u_char *cur, int x, int y, int *err)
{
   int cx,cy,dx=0,dy=0;
   int step=1,step_size=cint(MAX_DISP)>>2;
   MV mv,tmv1,tmv2;
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT); 
   /* *err=npd_mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT,MAX_INT); */
   spt++;
   cx=x;
   cy=y;
   tmv1.x=0;
   tmv1.y=0;
   tmv2=tmv1;
   while(step_size>=1){
      if((step==1)||(abs(cx-x)>MAX_DISP-step_size)||\
           (abs(cy-y)>MAX_DISP-step_size)){
         tmv2=cir_search(prev,cur,cx,cy,x,y,err,0,8,step_size);
         spt+=8;
      }
      else{
         if(abs(tmv1.x)==abs(tmv1.y)){
            tmv2=cir_search(prev,cur,cx,cy,x,y,err,\
                 mvmap[dy+1][dx+1],5,step_size);
            if((abs(tmv1.x)==abs(tmv1.y))&&(((tmv1.x+tmv2.x)==0)\
                 ||((tmv1.y+tmv2.y)==0))&&step==3)
               spt+=4;
            else
               spt+=5;
         }
         else{
            tmv2=cir_search(prev,cur,cx,cy,x,y,err,\
                      mvmap[dy+1][dx+1],3,step_size);
            spt+=3;
         }
      }
      cx+=tmv2.x;
      cy+=tmv2.y;
      dx=tmv2.x/step_size;
      dy=tmv2.y/step_size;
      tmv1=tmv2;
      if(step_size==1||step==3||(tmv2.x==0&&tmv2.y==0)){
         step_size=step_size>>1;
         step=1;
      }
      else
         step++;
   }
      mv.x=cx-x;
      mv.y=cy-y;
      return mv;
}


MV bbgd_search(u_char *prev, u_char *cur, int x, int y, int *err)
{
   int cx,cy;
   MV mv,tmv1,tmv2,tmv3;
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT);
   mv.x=mv.y=0;
   cx=x;
   cy=y;
   /* step 1 */
   tmv1=cir_search(prev,cur,cx,cy,x,y,err,0,8,1);
   spt+=9;
   if(tmv1.x==0 && tmv1.y==0)
       return tmv1;
   else{
      cx+=tmv1.x;
      cy+=tmv1.y;
   }
   /* step 2 */
   if(abs(tmv1.x)==abs(tmv1.y)){
      tmv2=cir_search(prev,cur,cx,cy,x,y,err,mvmap[tmv1.y+1][tmv1.x+1],5,1);
      spt+=5;
   }
   else{
      tmv2=cir_search(prev,cur,cx,cy,x,y,err,mvmap[tmv1.y+1][tmv1.x+1],3,1);
      spt+=3;
   }
   if(tmv2.x==0 && tmv2.y==0)
      return tmv1;
   cx+=tmv2.x;
   cy+=tmv2.y;
   mv.x=tmv1.x+tmv2.x;
   mv.y=tmv1.y+tmv2.y;
   /* step 3 */
   do{
      if(abs(tmv2.x)==abs(tmv2.y)){
         tmv3=cir_search(prev,cur,cx,cy,x,y,err,mvmap[tmv2.y+1][tmv2.x+1],5,1);
         if((abs(tmv1.x)==abs(tmv1.y))&&(((tmv1.x+tmv2.x)==0)||((tmv1.y+tmv2.y)==0)))
            spt+=4;
         else
            spt+=5;
      }
      else{
         tmv3=cir_search(prev,cur,cx,cy,x,y,err,mvmap[tmv2.y+1][tmv2.x+1],3,1);
         spt+=3;
      }
      if(tmv3.x==0 && tmv3.y==0)
         return mv;
      mv.x+=tmv3.x;
      mv.y+=tmv3.y;
      cx+=tmv3.x;
      cy+=tmv3.y;
      tmv1=tmv2;
      tmv2=tmv3;
   }while(abs(mv.x)!=MAX_DISP&&abs(mv.y)!=MAX_DISP);
   return mv;
}

MV hsa_search(u_char *prev, u_char *cur, int x, int y, int *err)
{
   MV mv;
   int D,Dd;
   float M,Md,nk,nc;
   static int Do=0;
   static float t,c=50.0*256,k=500.0,d=2.8284;
   static float u=0.002,v=0.002,Mo=0;
   mv.x=0;
   mv.y=0;
   t=k*d+c;
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT);
   D=*err;
   if((float)D<t)
      mv=bbgd_search(prev,cur,x,y,err); 
   else
      mv=four_step_search(prev,cur,x,y,err);
   M=sqrt(mv.x*mv.x+mv.y*mv.y);
   Dd=D-Do;
   Md=M-Mo;
   if(Dd*Md>0){
      nk=Dd/Md;
      k=(1-v)*k+v*nk;
   }
   else{
      nc=D-k*M;
      c=(1-u)*c+u*nc;
   }
   Do=D;
   Mo=M;
   return mv;
}

MV ucbd_search(u_char *prev, u_char *cur, int x, int y, int *err)
{
   int i,j,k,b,t,m,n,err0;
   MV mv,tmv;
   static MV dia[8]={{-2,0},{-1,-1},{0,-2},{1,-1},{2,0},{1,1},{0,2},{-1,1}};
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT);
   spt++;
   tmv.x=0;
   tmv.y=0;
   k=9;
   for(i=0;i<8;i++){
      m=x+dia[i].x;
      n=y+dia[i].y;
      if(bound_chk(m,n,x,y)){
         err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
#ifdef OPC
         op.c++;
#endif
         if(err0<(*err)){
            *err=err0;
            tmv=dia[i];
            k=i;
         }
      }
   }
   spt+=8;
   mv=tmv;
   while(1){
      if(k==9)
         break;
      else{
         j=k;k=9;
         tmv.x=0;tmv.y=0;
      }
      if(abs(dia[j].x)==1){
         t=3;b=-1;
      }else{
         t=5;b=-2;
      }
      j=(j+b)<0?(8+j+b):(j+b);
      for(i=0;i<t;i++){
         m=x+mv.x+dia[j].x;
         n=y+mv.y+dia[j].y;
         if(bound_chk(m,n,x,y)){
            err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
#ifdef OPC
            op.c++;
#endif
            if(err0<(*err)){
               *err=err0;
               tmv=dia[j];
               k=j;
            }
         }
         j=(j+1)>7?0:(j+1);
      }
      spt+=t;
      mv.x=mv.x+tmv.x;
      mv.y=mv.y+tmv.y;
   }
   tmv.x=0;tmv.y=0;
   for(i=0;i<8;i+=2){
      m=x+mv.x+(dia[i].x>>1);
      n=y+mv.y+(dia[i].y>>1);
      if(bound_chk(m,n,x,y)){
         err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
#ifdef OPC
         op.c++;
#endif
         if(err0<(*err)){
            *err=err0;
            tmv=dia[i];
         }
      }
   }
   spt+=4;
   mv.x=mv.x+(tmv.x>>1);
   mv.y=mv.y+(tmv.y>>1);
   return mv;
}
 
MV cd_search(u_char *prev, u_char *cur, int x, int y, int *err)
{
   int i,j,k,b,t,m,n,err0,c=9,ox=x,oy=y,step;
   MV mv,tmv;
   static MV dia[8]={{-2,0},{-1,-1},{0,-2},{1,-1},{2,0},{1,1},{0,2},{-1,1}};
   static MV crx[8]={{-2,0},{-1,0},{0,-2},{0,-1},{2,0},{1,0},{0,2},{0,1}};

   init_searchedpt();
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT);
   searchedpt[MAX_DISP][MAX_DISP]=1;

   tmv.x=0;
   tmv.y=0;
   k=9;
   step=1;
   for(i=0;i<8;i++){
      m=x+crx[i].x;
      n=y+crx[i].y;
      if(bound_chk(m,n,x,y)){
         err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
         searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
#ifdef OPC
         op.c++;
#endif
         if(err0<(*err)){
            *err=err0;
            tmv=crx[i];
            k=i;
         }
      }
   }
   mv=tmv;
   if(k==9) {
     spt += count_searchedpt();
     printf("c%d ", count_searchedpt());
     return mv;  //1st-step-stop
   }

   if(k!=9) {
     step+=1;
     c=k; k=9;
     tmv.x=0; tmv.y=0; 
     if(c==0||c==1) j=7;
     else if(c==2||c==3) j=1; 
     else if(c==4||c==5) j=3;
     else if(c==6||c==7) j=5;
     t=4; //Once not the center of CSP, 4 new point anyway.
     for(i=0;i<t;i++){
        m=x+dia[j].x;
        n=y+dia[j].y;
        if(bound_chk(m,n,x,y)){
           err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
           searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
#ifdef OPC
           op.c++;
#endif
           if(err0<(*err)){
             *err=err0;
             tmv=dia[j];
             k=j;
             mv=tmv;
           }
        }
        j=(j+2)>7?1:(j+2);
     }
   }

   if(k==9 && c%2==1) {
     spt += count_searchedpt();
     printf("s%d ", count_searchedpt());
     return mv;  //2nd-step-stop
   }

   if(k==9 && c%2==0) k=c;

   while(1){
      if(k==9)
         break;
      else{
         j=k;k=9;
         tmv.x=0;tmv.y=0;
      }
      step+=1;
      if(j%2==1){
         t=3;b=-1;
      } else{
         t=5;b=-2;
      }
      j=(j+b)<0?(8+j+b):(j+b);
      for(i=0;i<t;i++){
         m=x+mv.x+dia[j].x;
         n=y+mv.y+dia[j].y;
         if(bound_chk(m,n,x,y)){
            err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
            searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
#ifdef OPC
            op.c++;
#endif
            if(err0<(*err)){
               *err=err0;
               tmv=dia[j];
               k=j;
            }
         }
         j=(j+1)>7?0:(j+1);
      }
      mv.x=mv.x+tmv.x;
      mv.y=mv.y+tmv.y;
   }

   tmv.x=0;tmv.y=0;
   for(i=0;i<8;i+=2){
      m=x+mv.x+(dia[i].x>>1);
      n=y+mv.y+(dia[i].y>>1);
      if(bound_chk(m,n,x,y)){
        err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -