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

📄 modioperandi0.h

📁 基于"trace transform"的识别2D图像的C++源程序
💻 H
📖 第 1 页 / 共 2 页
字号:
//Copyright(c)2004  Alexander Kadyrov
//DO NOT FORGET NULL !!!!!!
TYPEtr *tr=NULL,*tr1,*br=NULL,*br1;
TYPEsr *sr=NULL,*sr1;//trace line used in all the porgram
TYPEsr *diff1=NULL,*adiff1=NULL,*diff2=NULL,*adiff2=NULL;
TYPEtr *atr=NULL;
unsigned char*sctr=NULL,*sctr1;//Scaled trace
int *SQRT16=NULL;
int *sortfeed=NULL,*sorttemp=NULL;
int *sortedRLsctr34=NULL;//"int" because sortup returns "int" 
int medtemp[256];
out outmedtemp[256];
double *weights_sqrt_sctr=NULL;//???
typedef void (*F)(void); F U[Amount],f[Amount],V[Amount];
unsigned char u[Amount],v[Amount];
//unsigned char *tr=NULL,*tr1,*br=NULL,*br1,*sr=NULL,*sr1;//trace array used in all the porgram
//*****A new modus operandi in three PLACESs below: PLACE1,PLACE2,PLACE3 
               //PLACE1:
//index M of UM,fM,VM must be M>1, index k of objects also must be k>1
//*******************ANOTHER MODUS OPERANDI 
int i;
void U2(void){u[0]=0;u[1]=0;}//uses objects, line should end with zero 
void f2(void)//"inverse track" NEEDS memoryInitiation
    {   tr1=tr;br1=br+L;for(i=L;i>0;i--) *(--br1)=*tr1++;
    }//END.
void V2(void){v[0]=3;v[1]=0;}//computed objects;line should end with zero;
//*******************ANOTHER MODUS OPERANDI 
void U4(void) {u[0]=0;u[1]=0;}//uses objects, line should end with zero 
void f4(void)//"inverse track" NEEDS memoryInitiation
    {   tr1=tr;sr1=sr+L;for(i=L;i>0;i--) *(--sr1)=-*tr1++;
    }//END.
void V4(void) {v[0]=5;v[1]=0;}//computed objects;line should end with zero;
//*******************ANOTHER MODUS OPERANDI 
void U6(void) {u[0]=0;u[1]=0;}//uses objects, line should end with zero 
void f6(void)//"abs trace" NEEDS memoryInitiation
    {  if  (typetr EQ 0) atr=tr;//for(i=0;i<L;i++) atr[i]=tr[i];//object 6: abs(trace)
       else for(i=0;i<L;i++) atr[i]=ABS(tr[i]);
    }//END.
void V6(void) {v[0]=6;v[1]=0;}//computed objects;line should end with zero;
//*******************ANOTHER MODUS OPERANDI 
out sum,sumNeg,sumPos;//"Radon (integral), also computes sumNeg and sumPos" 
void U40(void){u[0]=0;u[1]=0;}//uses objects,line should end with zero
void f40(void)//radon, sum from 0 to L-1
    {
     sumNeg=0;sumPos=0;tr1=tr+start;out val;
     if (typetr>0)
      for(i=span;i>0;i--){val=*tr1++; if(val>0)sumPos+=val;else sumNeg+=val;}
     else
      { sum=0; for(i=span;i>0;i--)sum+=*tr1++;  sumPos+=sum;}
     sum=sumPos+sumNeg;
    o[33]=sum;
    }//END.
void V40(void)
{v[0]=33;v[1]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI 
int medindex,Lr34,Ll34;//"median index dividing integral abs(f(t))" 
double medindexPrecise;//this is o[34], but integer version medindex is used later 
void U41(void){u[0]=33;u[1]=6;u[2]=0;}//uses objects,line should end with zero
 double sum2;out cumsum;
void f41(void)//the next text supposes that sum2>0. 
    { sum2=(sumPos-sumNeg)/2.;
      cumsum=0;tr1=atr+start;
      for(i=lstart;i<=lfin;i++){cumsum+=*tr1++;if (cumsum>=sum2) break;}
      medindexPrecise=i;medindex=i;
      if (cumsum EQ sum2){medindexPrecise=i+0.5;medindex++;}
      o[34]=medindexPrecise;
      int c=medindex-lbeg; Lr34=fin-c+1, Ll34=c-start+1;

}//END. 
void V41(void)
{v[0]=34;v[1]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI 
TYPEtr min,max;
void U44(void){u[0]=0;u[1]=0;}//uses objects,line should end with zero 
void f44(void)//min max; 
    {  tr1=tr+start; min=*tr1;max=*tr1;
    for(i=span-1;i>0;i--)
    //{tr1++;if(max<*tr1)max=*tr1;if(min>*tr1)min=*tr1;}
   {TYPEtr t=*++tr1;if(max<t)max=t;if(min>t)min=t;}

     if (span<L){if (min>0) min=0;if (max<=0) max=0;}//"<=" for compiler not to complain
    o[35]=min;o[37]=max;
    }//END.
void V44(void)
{v[0]=35;v[1]=37;v[2]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI 
void U46(void){u[0]=0;u[1]=0;}//uses objects,line should end with zero 
void f46(void)//max; 
    {  tr1=tr+start; max=*tr1;
    for(i=span-1;i>0;i--){tr1++;if(max<*tr1)max=*tr1;}
    o[37]=max;
    }//END.
void V46(void)
{v[0]=37;v[1]=0;v[2]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI 
TYPEtr maxAbs;
void U47(void){u[0]=35;u[1]=37;u[2]=0;}//uses objects,line should end with zero 
void f47(void)//"max abs(f(t))"
    {  if (typetr EQ 0) maxAbs=max;
       else {TYPEtr mi=ABS(min),ma=ABS(max); maxAbs=(mi<ma)?ma:mi;}
    o[38]=maxAbs;
    }//END.
void V47(void)
{v[0]=38;v[1]=0;v[2]=0;}//computed objects,line should end with zero 

//*******************ANOTHER MODUS OPERANDI 
void U48(void){u[0]=37;u[1]=0;}//uses objects,line should end with zero 
void f48(void)//min for sr; 
    {  
    o[39]=-max;
    }//END.
void V48(void)
{v[0]=39;v[1]=0;v[2]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI 
void U50(void){u[0]=35;u[1]=0;}//uses objects,line should end with zero 
void f50(void)//max for sr; 
    {  
    o[41]=-min;
    }//END.
void V50(void)
{v[0]=41;v[1]=0;v[2]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI
int rmS,rmN,l; double tmax;
void U54(void){u[0]=6;u[1]=38;u[2]=0;}//uses objects,line should end with zero 
void f54(void)//"(average) t-index of max abs(f(t))"
    {   tmax=0;rmS=0;rmN=0;tr1=atr+start;
        for(l=lstart;l<=lfin;l++) if(maxAbs EQ *tr1++){rmS+=l;rmN++;}
        if (rmN) tmax=(rmS+0.0)/rmN;
    o[43]=tmax;}//END. ///all computations for dlt=1, after it will be corrected
void V54(void)
{v[0]=43;v[1]=0;v[2]=0;v[3]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI
void U55(void){u[0]=0;u[1]=0;}//uses objects,line should end with zero 
void f55(void)//object 44 "differences 1"
    {   
        for(i=0;i<L-1;i++) {diff1[i]=tr[i+1]-tr[i];adiff1[i]=ABS(diff1[i]);}
        diff1[L-1]=tr[0]-tr[L-1];adiff1[L-1]=ABS(diff1[L-1]);
   po[44]=diff1; //adiff1 will not be stored in po
    }//END.
void V55(void)
{v[0]=44;v[1]=0;v[2]=0;v[3]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI
out sumAbsDiff1;
void U56(void){u[0]=44;u[1]=0;}//uses objects,line should end with zero 
void f56(void)//object 45 "integral of |tr'|   "
    {   sumAbsDiff1=0;
        for(i=0;i<L-1;i++) sumAbsDiff1+=adiff1[i];
    o[45]=sumAbsDiff1; 
    }//END.
void V56(void)
{v[0]=45;v[1]=0;v[2]=0;v[3]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI
out sumAbsDiff1c;// circular
void U57(void){u[0]=45;u[1]=0;}//uses objects,line should end with zero 
void f57(void)//object 46 "integral of |tr'| circular"
    {   sumAbsDiff1c=sumAbsDiff1+adiff1[L-1];
    o[46]=sumAbsDiff1c; 
    }//END.
void V57(void)
{v[0]=46;v[1]=0;v[2]=0;v[3]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI
void U58(void){u[0]=44;u[1]=0;}//uses objects,line should end with zero 
void f58(void)//object 47 "differences 2"
    {   for(i=0;i<L-1;i++){diff2[i]=diff1[i+1]-diff1[i];adiff2[i]=ABS(diff2[i]);}
        diff2[L-1]=diff1[0]-diff1[L-1];adiff2[L-1]=ABS(diff2[L-1]);
   po[47]=diff2; //adiff2 will not be stored in po
    }//END.
void V58(void)
{v[0]=47;v[1]=0;v[2]=0;v[3]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI
out sumAbsDiff2;
void U59(void){u[0]=47;u[1]=0;}//uses objects,line should end with zero 
void f59(void)//object 48 "integral of |tr''|   "
    {   sumAbsDiff2=0;
        for(i=0;i<L-2;i++) sumAbsDiff2+=adiff2[i];
    o[48]=sumAbsDiff2; 
    }//END.
void V59(void)
{v[0]=48;v[1]=0;v[2]=0;v[3]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI
out sumAbsDiff2c;// circular
void U60(void){u[0]=48;u[1]=0;}//uses objects,line should end with zero 
void f60(void)//object 49 "integral of |tr''| circular"
    {   sumAbsDiff2c=sumAbsDiff2+adiff2[L-2]+adiff2[L-1];
    o[49]=sumAbsDiff2c; 
    }//END.
void V60(void)
{v[0]=49;v[1]=0;v[2]=0;v[3]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI 
double indexGrCenter;//"t - gravity center of abs(f(t))" 
void U61(void){u[0]=33;u[1]=6;u[2]=0;}//uses objects,line should end with zero
void f61(void)//
    { out sumAbs=sumPos-sumNeg,suml=0; tr1=atr+start; 
      for(int l=lstart;l<=lfin;l++)suml+=l*(*tr1++);
      indexGrCenter = (suml+0.0)/sumAbs;//+0.0 because "out" can be "int"
    o[50]=indexGrCenter;}//END. 
void V61(void)
{v[0]=50;v[1]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI 


//---------------------------------------
//*******************ANOTHER MODUS OPERANDI 
out sumSqR;//for typetr=0 this is 16 times bigger.
double Lp05;// "Lp quasi-norm (p=0.5) = (sumSqR)^2, where sumSqR=integral sqrt(abs(f(t))"; 
void U62(void){u[0]=6;u[1]=0;}//uses objects,line should end with zero
void f62(void)//radon, sum from 0 to L-1
    { tr1=atr+start; sumSqR=0;
#if typetr //int and double
      for(i=span;i>0;i--) sumSqR += sqrt(*tr1++);
      Lp05=sumSqR*sumSqR;
#else
      for(i=span;i>0;i--) sumSqR += SQRT16[*tr1++];
      Lp05=sumSqR/16.*sumSqR/16.; //sumSqR= sumSqR;
#endif
    o[51]=Lp05;
    if (o[51]<0)
     Lp05=Lp05;
    }//END.
void V62(void)
{v[0]=51;v[1]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI 
int medSqR_index;//"median index dividing integral abs(f(t))" 
double medSqR_indexPrecise;//up to 1/2. this is o[52], but integer version medindex is used later 
void U63(void){u[0]=51;u[1]=6;u[2]=0;}//uses objects,line should end with zerodouble cumsum;
void f63(void)// the next text supposes that sumSqR>0. 
    { double sum2=sumSqR/2.; out cumsum=0;tr1=atr+start;
#if typetr //int and double
      for(i=lstart;i<=lfin;i++){cumsum+=sqrt(*tr1++);if (cumsum>=sum2) break;}
#else     
      for(i=lstart;i<=lfin;i++){cumsum+=SQRT16[*tr1++];if (cumsum>=sum2) break;}
#endif
    medSqR_indexPrecise=i;medSqR_index=i;
    if (cumsum EQ sum2) {medSqR_indexPrecise=i+0.5;medSqR_index++;}
    o[52]=medSqR_indexPrecise;}//END. 
void V63(void)
{v[0]=52;v[1]=0;}//computed objects,line should end with zero 

//------------------------------
//*******************ANOTHER MODUS OPERANDI 
TYPEtr max_min; int Max;//Max<=255
void U64(void){u[0]=35;u[1]=37;u[2]=6;u[3]=0;}//uses objects,line should end with zero 
void f64(void)//object 53 "Scaled trace" for median computing
    { max_min=max-min;
#if typetr //int and double
      int i; max_min=max-min;if (max_min EQ 0) max_min=1;
      Max=3*span+30; if (Max>255) Max=255; // should it be Max=3*span???
      double Coe=(double)Max / max_min;
      for(i=0;i<L;i++) sctr[i]=(int) ((tr[i]-min)*Coe);
#else // typetr EQ 0 
      sctr=tr; Max=max;
#endif
///po[53] = without
    }//END.
void V64(void)
{v[0]=53;v[1]=0;v[2]=0;v[3]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI 
int IS_sortedRLsctr34;//it maybe not sorted if span is short or Max is small 
void U65(void){u[0]=53;u[1]=34;u[2]=0;u[3]=0;}//uses objects,line should end with zero 
void f65(void)//object 54 "sorted sctr to the right and left of 34" 
    {  
       if (span > 2*0.2*Max)///Is the condition optimal ???
            {IS_sortedRLsctr34=0; return;}       
       IS_sortedRLsctr34=1;
       int c=medindex-lbeg, Lr=Lr34,Ll=Ll34;   

       int  i, *remS=sortedRLsctr34;

       sctr1=sctr+c;      
       for(i=0;i<Lr;i++) sortfeed[i]=*sctr1++;
       int*sR=sortup(sortfeed,Lr,sorttemp);
       for(i=0;i<Lr;i++) *remS++=sR[i];

       sctr1=sctr+c;
       for(i=0;i<Ll;i++) sortfeed[i]=*sctr1--;
       int*sL=sortup(sortfeed,Ll,sorttemp);
       for(i=0;i<Ll;i++) *remS++=sL[i];
     //o[54] =    sortedRLsctr34[Lr/2];
///po[54] = without
    }//END.
void V65(void)
{v[0]=54;v[1]=0;v[2]=0;v[3]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI 
void U66(void){u[0]=54;u[1]=0;u[2]=0;u[3]=0;}//uses objects,line should end with zero 
void f66(void)//object 55 "MedianW R+: f(x-c); c is median abscissa (34);\n   W=1"
{if (IS_sortedRLsctr34) 
      {
       int med=sortedRLsctr34[Lr34/2];
#if typetr //int and double, rescale "med" back:       i
       double Coe=(double)Max / max_min;
    o[55] = med/Coe+min;
#else
    o[55] = med;
#endif
      }
     else//if (IS_sortedRLsctr34) 
       { sctr1=sctr+medindex-lbeg;
         int wei_threshold=Lr34/2;
         int i,j,cumsum=0; 
         for (i=Max;i>=0;i--) medtemp[i]=0;
         for (j=Lr34-1;j>=0;j--) {i=sctr1[j];medtemp[i]++;}
         for (i=0;i<=Max;i++) {cumsum+=medtemp[i];if (cumsum>wei_threshold) break;}
         int med=i;
#if typetr //int and double, rescale "med" back:       i
         double Coe=(double)Max / max_min;
         o[55] = med/Coe+min;
#else
         o[55] = med;
#endif
       }
}//END
void V66(void)
{v[0]=55;v[1]=0;v[2]=0;v[3]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI
void U67(void){u[0]=54;u[1]=0;u[2]=0;u[3]=0;}//uses objects,line should end with zero 
void f67(void)//object 56=55Back "MedianW R+: f(x-c); c is median abscissa (34);\n   W=1;"
{if (IS_sortedRLsctr34) 
      {
       int med=sortedRLsctr34[Lr34+Ll34/2];
#if typetr //int and double, rescale "med" back:       i
       double Coe=(double)Max / max_min;
    o[56] = med/Coe+min;
#else
    o[56] = med;
#endif
      }
     else//if (IS_sortedRLsctr34) 
       { sctr1=sctr+medindex-lbeg;//c=medindex-lbeg
         int wei_threshold=Ll34/2;
         int i,j,cumsum=0; 
         for (i=Max;i>=0;i--) medtemp[i]=0;
         for (j=Ll34-1;j>=0;j--) {i=*sctr1--;medtemp[i]++;}//go back from c
         //>=???
         for (i=0;i<=Max;i++) {cumsum+=medtemp[i];if (cumsum>wei_threshold) break;}
         int med=i;
#if typetr //int and double, rescale "med" back:       i
         double Coe=(double)Max / max_min;
    o[56] = med/Coe+min;
#else
    o[56] = med;
#endif
       }
}//END
void V67(void)
{v[0]=56;v[1]=0;v[2]=0;v[3]=0;}//computed objects,line should end with zero 
//*******************ANOTHER MODUS OPERANDI
void U68(void){u[0]=56;u[1]=0;u[2]=0;u[3]=0;}//uses objects,line should end with zero 
               // all objects are already booked by object 55
void f68(void)
{   o[57]=-o[56]; 
}//END.
void V68(void)
{v[0]=57;v[1]=0;v[2]=0;v[3]=0;}//computed objects,line should end with zero 

//*******************ANOTHER MODUS OPERANDI 
void U69(void){u[0]=6;u[1]=54;u[2]=0;u[3]=0;}//uses objects,line should end with zero 
void f69(void)//object 58 "MedianW R+: f(t-c); c is median abscissa (34);\n   W=abs(f(t))(t-c)"
{ out weight=0;int c=medindex-lbeg;tr1=atr+c; 
  {for(int j=0;j<Lr34;j++)weight += (*tr1++) * j;}
  if (weight EQ 0) 
  { o[58]=tr[c] ;return;}
  int i,j;  

⌨️ 快捷键说明

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