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

📄 search.c

📁 运动估计
💻 C
📖 第 1 页 / 共 4 页
字号:
        searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
#ifdef OPC
        op.c++;
#endif
        if(err0<(*err)){
          *err=err0;
          tmv.x=(dia[i].x>>1);
          tmv.y=(dia[i].y>>1);
        }
      }
   }
   mv.x=mv.x+tmv.x;
   mv.y=mv.y+tmv.y;
   spt += count_searchedpt();
   return mv;
} 

MV scd_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=1;i<8;i+=2){
      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; 
      t=3; //3 new point of SCSP.
     b=-2; j=(c+b)<0?(8+c+b):(c+b);
     for(i=0;i<t;i++){
        m=x+mv.x+crx[j].x;
        n=y+mv.y+crx[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=crx[j];
             k=j;
             mv=tmv;
           }
        }
        j=(j+2)>7?1:(j+2);
     }
     mv.x=mv.x+tmv.x;
     mv.y=mv.y+tmv.y;
   }

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

   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);
        searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
#ifdef OPC
        op.c++;
#endif
        if(err0<(*err)){
          *err=err0;
          tmv.x=(dia[i].x>>1);
          tmv.y=(dia[i].y>>1);
        }
      }
   }
   mv.x=mv.x+tmv.x;
   mv.y=mv.y+tmv.y;
   spt += count_searchedpt();
   return mv;
}


MV ncd_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}};
   static MV lcrx[8]={{-2,0},{0,-2},{2,0},{0,2}};
   static MV scrx[4]={{-1,0},{0,-1},{1,0},{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=5;
   step=1;   
    for(i=0;i<4;i++){  
      m=x+scrx[i].x;
      n=y+scrx[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;

         if(err0<(*err)){
            *err=err0;
            tmv=scrx[i];
            k=i;
         }
      }
   }
   mv=tmv;
   if(k==5) {
     spt += count_searchedpt();
     return mv;   
   }
   if(k!=5) {
     step+=1;
   k=5;
     tmv.x=0; tmv.y=0; 
     for(i=0;i<4;i++){
        m=x+mv.x+scrx[i].x;
        n=y+mv.y+scrx[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;

           if(err0<(*err)){
             *err=err0;
             tmv=scrx[i];
             k=i;
             }
        }
        }
     mv.x=mv.x+tmv.x;
     mv.y=mv.y+tmv.y;
   }

   if(k==5) {
     spt += count_searchedpt();
      return mv;  //2nd-step-stop
   }

    k=5;
     tmv.x=0; tmv.y=0; 
     for(i=0;i<4;i++){
        m=x+lcrx[i].x;
        n=y+lcrx[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;

           if(err0<(*err)){
             *err=err0;
             tmv=lcrx[i];
             k=i;
             }
        }
        }
   if(k!=5) {
      mv = tmv ;
   }
  
   k = 0;
   while(1){
      if(k==9)
         break;
      else{
          k=9;
         tmv.x=0;tmv.y=0;
      }
      step+=1;
        for(i=0;i<8;i++){
         m=x+mv.x+dia[i].x;
         n=y+mv.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);
            searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
 
            if(err0<(*err)){
               *err=err0;
               tmv=dia[i];
               k=i;
            }
         }
          }
      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);
        searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;

        if(err0<(*err)){
          *err=err0;
          tmv.x=(dia[i].x>>1);
          tmv.y=(dia[i].y>>1);
        }
      }
   }
   mv.x=mv.x+tmv.x;
   mv.y=mv.y+tmv.y;
   spt += count_searchedpt();
   return mv;
}

MV kcd_search(u_char *prev, u_char *cur, int x, int y, int *err)
{
  int i, k, m,n,err0, ox=x,oy=y,step=1,side,ops_pt_x,ops_pt_y;
   MV mv,tmv,ttmv;
   static MV dia[8]={{-2,0},{-1,1},{0,2},{1,1},{2,0},{1,-1},{0,-2},{-1,-1}};
   static MV scrx[8]={{-2,0},{-1,0},{0,-2},{0,-1},{2,0},{1,0},{0,2},{0,1}};
   //static MV scrx[4]={{-1,0},{0,-1},{1,0},{0,1}};//
   static MV sdia[4]={{-1,0},{0,-1},{1,0},{0,1}};
   static MV lcrx[4]={{-2,0},{0,-2},{2,0},{0,2}};
   static MV sacrx_d[5]={{-1,0},{0,-1},{1,0},{0,1},{0,-2}};
   static MV sacrx_t[5]={{-1,0},{0,-1},{1,0},{0,1},{0,2}};
   static MV sacrx_l[5]={{-1,0},{0,-1},{1,0},{0,1},{-2,0}};
   static MV sacrx_r[5]={{-1,0},{0,-1},{1,0},{0,1},{2,0}};
   static MV sacrx_search[5]={{0,0},{0,0},{0,0},{0,0},{0,0}};
   static MV ssqr[4]={{-1,1},{-1,-1},{1,-1},{1,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;   
   // SC Step 1
   for(i=0;i<4;i++){  
      m=x+scrx[i].x;
      n=y+scrx[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;
 	if(err0<(*err)){
            *err=err0;
            tmv=scrx[i];
            k=i;
         }
      }
   }
   mv=tmv;
   if(k==9) {
     spt += count_searchedpt();
     return mv;  //1st-step-stop
   }

   // Asym.Cross Search : Step 2
   else  if ((mv.x == 0)&&(mv.y == 1)){
    	 for(i=0;i<5;i++){
    	 	sacrx_search[i] = sacrx_t[i];
         }
    	 side = 1;
    }
    else if ((mv.x == 1)&&(mv.y == 0)){
    	 for(i=0;i<5;i++){
    	 	sacrx_search[i] = sacrx_r[i];
    	  }
    	 side = 2;
    }
    else if ((mv.x == 0)&&(mv.y == -1)){
    	 for(i=0;i<5;i++){
    	 	sacrx_search[i] = sacrx_d[i];
    	 }
    	 side = 1;
    	 
    }
    else if ((mv.x == -1)&&(mv.y == 0)){
    	 for(i=0;i<5;i++){
    	 	sacrx_search[i] = sacrx_l[i];
    	 }
    	 side = 2;
   }
   
if (step !=3){

   k = 6;
   ttmv= tmv;
   for(i=0;i<5;i++){
       m=x+mv.x+sacrx_search[i].x;
       n=y+mv.y+sacrx_search[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;
  	    if(err0<(*err)){
               *err=err0;
               tmv=sacrx_search[i];
               k=i;
            }
         }
           }
      mv.x=mv.x+tmv.x;
      mv.y=mv.y+tmv.y;
   if(k==6) {  // unchanged Step 3 
      tmv.x=0;
      tmv.y=0;
      k=5;
      for(i=0;i<4;i++){
     	 m=x+mv.x+(sdia[i].x);
      	 n=y+mv.y+(sdia[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;
         if(err0<(*err)){
            *err=err0;
            tmv=sdia[i];
            k = i;
         }
        }
      }
       mv.x=mv.x+(tmv.x);
       mv.y=mv.y+(tmv.y);
       if(k==5) {  // Unchanged
       		spt += count_searchedpt();
    		mv.x=mv.x-ttmv.x;
       		mv.y=mv.y-ttmv.y;
  		return mv;  //2nd-step-stop
       }
    } 
   
} 
   // Step 4 : Large Diamond
     k = 0;
      while(1){
        if(k==9)
        	 break;
            else{
         // j=k;
        	 k=9;
        	 tmv.x=0;tmv.y=0;
          }
      	 step+=1;
     
       for(i=0;i<8;i++){
         m=x+mv.x+dia[i].x;
         n=y+mv.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);
            searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
 
            if(err0<(*err)){
               *err=err0;
               tmv=dia[i];
               k=i;
            }
         }
        // 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<4;i++){
     	 m=x+mv.x+(sdia[i].x);
      	 n=y+mv.y+(sdia[i].y);

⌨️ 快捷键说明

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