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

📄 susan feature dection source code2l.c

📁 the source code is writed by the authot, the susan algorithm to detecte the corner linear and many o
💻 C
📖 第 1 页 / 共 4 页
字号:
susan_edges(in,r,mid,bp,max_no,x_size,y_size)  uchar *in, *bp, *mid;  int   *r, max_no, x_size, y_size;{float z;int   do_symmetry, i, j, m, n, a, b, x, y, w;uchar c,*p,*cp;  memset (r,0,x_size * y_size * sizeof(int));  for (i=3;i<y_size-3;i++)    for (j=3;j<x_size-3;j++)    {      n=100;      p=in + (i-3)*x_size + j - 1;      cp=bp + in[i*x_size+j];      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p);      p+=x_size-3;       n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p);      p+=x_size-5;      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p);      p+=x_size-6;      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p);      p+=2;      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p);      p+=x_size-6;      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p);      p+=x_size-5;      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p);      p+=x_size-3;      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p);      if (n<=max_no)        r[i*x_size+j] = max_no - n;    }  for (i=4;i<y_size-4;i++)    for (j=4;j<x_size-4;j++)    {      if (r[i*x_size+j]>0)      {        m=r[i*x_size+j];        n=max_no - m;        cp=bp + in[i*x_size+j];        if (n>600)        {          p=in + (i-3)*x_size + j - 1;          x=0;y=0;          c=*(cp-*p++);x-=c;y-=3*c;          c=*(cp-*p++);y-=3*c;          c=*(cp-*p);x+=c;y-=3*c;          p+=x_size-3;               c=*(cp-*p++);x-=2*c;y-=2*c;          c=*(cp-*p++);x-=c;y-=2*c;          c=*(cp-*p++);y-=2*c;          c=*(cp-*p++);x+=c;y-=2*c;          c=*(cp-*p);x+=2*c;y-=2*c;          p+=x_size-5;              c=*(cp-*p++);x-=3*c;y-=c;          c=*(cp-*p++);x-=2*c;y-=c;          c=*(cp-*p++);x-=c;y-=c;          c=*(cp-*p++);y-=c;          c=*(cp-*p++);x+=c;y-=c;          c=*(cp-*p++);x+=2*c;y-=c;          c=*(cp-*p);x+=3*c;y-=c;          p+=x_size-6;          c=*(cp-*p++);x-=3*c;          c=*(cp-*p++);x-=2*c;          c=*(cp-*p);x-=c;          p+=2;          c=*(cp-*p++);x+=c;          c=*(cp-*p++);x+=2*c;          c=*(cp-*p);x+=3*c;          p+=x_size-6;              c=*(cp-*p++);x-=3*c;y+=c;          c=*(cp-*p++);x-=2*c;y+=c;          c=*(cp-*p++);x-=c;y+=c;          c=*(cp-*p++);y+=c;          c=*(cp-*p++);x+=c;y+=c;          c=*(cp-*p++);x+=2*c;y+=c;          c=*(cp-*p);x+=3*c;y+=c;          p+=x_size-5;          c=*(cp-*p++);x-=2*c;y+=2*c;          c=*(cp-*p++);x-=c;y+=2*c;          c=*(cp-*p++);y+=2*c;          c=*(cp-*p++);x+=c;y+=2*c;          c=*(cp-*p);x+=2*c;y+=2*c;          p+=x_size-3;          c=*(cp-*p++);x-=c;y+=3*c;          c=*(cp-*p++);y+=3*c;          c=*(cp-*p);x+=c;y+=3*c;          z = sqrt((float)((x*x) + (y*y)));          if (z > (0.9*(float)n)) /* 0.5 */	  {            do_symmetry=0;            if (x==0)              z=1000000.0;            else              z=((float)y) / ((float)x);            if (z < 0) { z=-z; w=-1; }            else w=1;            if (z < 0.5) { /* vert_edge */ a=0; b=1; }            else { if (z > 2.0) { /* hor_edge */ a=1; b=0; }            else { /* diag_edge */ if (w>0) { a=1; b=1; }                                   else { a=-1; b=1; }}}            if ( (m > r[(i+a)*x_size+j+b]) && (m >= r[(i-a)*x_size+j-b]) &&                 (m > r[(i+(2*a))*x_size+j+(2*b)]) && (m >= r[(i-(2*a))*x_size+j-(2*b)]) )              mid[i*x_size+j] = 1;          }          else            do_symmetry=1;        }        else           do_symmetry=1;        if (do_symmetry==1)	{           p=in + (i-3)*x_size + j - 1;          x=0; y=0; w=0;          /*   |      \               y  -x-  w               |        \   */          c=*(cp-*p++);x+=c;y+=9*c;w+=3*c;          c=*(cp-*p++);y+=9*c;          c=*(cp-*p);x+=c;y+=9*c;w-=3*c;          p+=x_size-3;             c=*(cp-*p++);x+=4*c;y+=4*c;w+=4*c;          c=*(cp-*p++);x+=c;y+=4*c;w+=2*c;          c=*(cp-*p++);y+=4*c;          c=*(cp-*p++);x+=c;y+=4*c;w-=2*c;          c=*(cp-*p);x+=4*c;y+=4*c;w-=4*c;          p+=x_size-5;              c=*(cp-*p++);x+=9*c;y+=c;w+=3*c;          c=*(cp-*p++);x+=4*c;y+=c;w+=2*c;          c=*(cp-*p++);x+=c;y+=c;w+=c;          c=*(cp-*p++);y+=c;          c=*(cp-*p++);x+=c;y+=c;w-=c;          c=*(cp-*p++);x+=4*c;y+=c;w-=2*c;          c=*(cp-*p);x+=9*c;y+=c;w-=3*c;          p+=x_size-6;          c=*(cp-*p++);x+=9*c;          c=*(cp-*p++);x+=4*c;          c=*(cp-*p);x+=c;          p+=2;          c=*(cp-*p++);x+=c;          c=*(cp-*p++);x+=4*c;          c=*(cp-*p);x+=9*c;          p+=x_size-6;              c=*(cp-*p++);x+=9*c;y+=c;w-=3*c;          c=*(cp-*p++);x+=4*c;y+=c;w-=2*c;          c=*(cp-*p++);x+=c;y+=c;w-=c;          c=*(cp-*p++);y+=c;          c=*(cp-*p++);x+=c;y+=c;w+=c;          c=*(cp-*p++);x+=4*c;y+=c;w+=2*c;          c=*(cp-*p);x+=9*c;y+=c;w+=3*c;          p+=x_size-5;           c=*(cp-*p++);x+=4*c;y+=4*c;w-=4*c;          c=*(cp-*p++);x+=c;y+=4*c;w-=2*c;          c=*(cp-*p++);y+=4*c;          c=*(cp-*p++);x+=c;y+=4*c;w+=2*c;          c=*(cp-*p);x+=4*c;y+=4*c;w+=4*c;          p+=x_size-3;          c=*(cp-*p++);x+=c;y+=9*c;w-=3*c;          c=*(cp-*p++);y+=9*c;          c=*(cp-*p);x+=c;y+=9*c;w+=3*c;          if (y==0)            z = 1000000.0;          else            z = ((float)x) / ((float)y);          if (z < 0.5) { /* vertical */ a=0; b=1; }          else { if (z > 2.0) { /* horizontal */ a=1; b=0; }          else { /* diagonal */ if (w>0) { a=-1; b=1; }                                else { a=1; b=1; }}}          if ( (m > r[(i+a)*x_size+j+b]) && (m >= r[(i-a)*x_size+j-b]) &&               (m > r[(i+(2*a))*x_size+j+(2*b)]) && (m >= r[(i-(2*a))*x_size+j-(2*b)]) )            mid[i*x_size+j] = 2;	        }      }    }}/* }}} *//* {{{ susan_edges_small(in,r,sf,max_no,out) */susan_edges_small(in,r,mid,bp,max_no,x_size,y_size)  uchar *in, *bp, *mid;  int   *r, max_no, x_size, y_size;{float z;int   do_symmetry, i, j, m, n, a, b, x, y, w;uchar c,*p,*cp;  memset (r,0,x_size * y_size * sizeof(int));  max_no = 730; /* ho hum ;) */  for (i=1;i<y_size-1;i++)    for (j=1;j<x_size-1;j++)    {      n=100;      p=in + (i-1)*x_size + j - 1;      cp=bp + in[i*x_size+j];      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p);      p+=x_size-2;       n+=*(cp-*p);      p+=2;      n+=*(cp-*p);      p+=x_size-2;      n+=*(cp-*p++);      n+=*(cp-*p++);      n+=*(cp-*p);      if (n<=max_no)        r[i*x_size+j] = max_no - n;    }  for (i=2;i<y_size-2;i++)    for (j=2;j<x_size-2;j++)    {      if (r[i*x_size+j]>0)      {        m=r[i*x_size+j];        n=max_no - m;        cp=bp + in[i*x_size+j];        if (n>250)	{          p=in + (i-1)*x_size + j - 1;          x=0;y=0;          c=*(cp-*p++);x-=c;y-=c;          c=*(cp-*p++);y-=c;          c=*(cp-*p);x+=c;y-=c;          p+=x_size-2;           c=*(cp-*p);x-=c;          p+=2;          c=*(cp-*p);x+=c;          p+=x_size-2;          c=*(cp-*p++);x-=c;y+=c;          c=*(cp-*p++);y+=c;          c=*(cp-*p);x+=c;y+=c;          z = sqrt((float)((x*x) + (y*y)));          if (z > (0.4*(float)n)) /* 0.6 */          {            do_symmetry=0;            if (x==0)	      z=1000000.0;	    else	      z=((float)y) / ((float)x);	    if (z < 0) { z=-z; w=-1; }            else w=1;            if (z < 0.5) { /* vert_edge */ a=0; b=1; }            else { if (z > 2.0) { /* hor_edge */ a=1; b=0; }            else { /* diag_edge */ if (w>0) { a=1; b=1; }                                   else { a=-1; b=1; }}}            if ( (m > r[(i+a)*x_size+j+b]) && (m >= r[(i-a)*x_size+j-b]) )              mid[i*x_size+j] = 1;          }          else            do_symmetry=1;        }        else          do_symmetry=1;        if (do_symmetry==1)	{           p=in + (i-1)*x_size + j - 1;          x=0; y=0; w=0;          /*   |      \               y  -x-  w               |        \   */          c=*(cp-*p++);x+=c;y+=c;w+=c;          c=*(cp-*p++);y+=c;          c=*(cp-*p);x+=c;y+=c;w-=c;          p+=x_size-2;           c=*(cp-*p);x+=c;          p+=2;          c=*(cp-*p);x+=c;          p+=x_size-2;          c=*(cp-*p++);x+=c;y+=c;w-=c;          c=*(cp-*p++);y+=c;          c=*(cp-*p);x+=c;y+=c;w+=c;          if (y==0)            z = 1000000.0;          else            z = ((float)x) / ((float)y);          if (z < 0.5) { /* vertical */ a=0; b=1; }          else { if (z > 2.0) { /* horizontal */ a=1; b=0; }          else { /* diagonal */ if (w>0) { a=-1; b=1; }                                else { a=1; b=1; }}}          if ( (m > r[(i+a)*x_size+j+b]) && (m >= r[(i-a)*x_size+j-b]) )            mid[i*x_size+j] = 2;	        }      }    }}/* }}} *//* }}} *//* {{{ corners *//* {{{ corner_draw(in,corner_list,drawing_mode) */corner_draw(in,corner_list,x_size,drawing_mode)  uchar *in;  CORNER_LIST corner_list;  int x_size, drawing_mode;{uchar *p;int   n=0;  while(corner_list[n].info != 7)  {    if (drawing_mode==0)    {      p = in + (corner_list[n].y-1)*x_size + corner_list[n].x - 1;      *p++=255; *p++=255; *p=255; p+=x_size-2;      *p++=255; *p++=0;   *p=255; p+=x_size-2;      *p++=255; *p++=255; *p=255;      n++;    }    else    {      p = in + corner_list[n].y*x_size + corner_list[n].x;      *p=0;      n++;    }  }}/* }}} *//* {{{ susan(in,r,sf,max_no,corner_list) */susan_corners(in,r,bp,max_no,corner_list,x_size,y_size)  uchar       *in, *bp;  int         *r, max_no, x_size, y_size;  CORNER_LIST corner_list;{int   n,x,y,sq,xx,yy,      i,j,*cgx,*cgy;float divide;uchar c,*p,*cp;  memset (r,0,x_size * y_size * sizeof(int));  cgx=(int *)malloc(x_size*y_size*sizeof(int));  cgy=(int *)malloc(x_size*y_size*sizeof(int));  for (i=5;i<y_size-5;i++)    for (j=5;j<x_size-5;j++) {        n=100;        p=in + (i-3)*x_size + j - 1;        cp=bp + in[i*x_size+j];        n+=*(cp-*p++);        n+=*(cp-*p++);        n+=*(cp-*p);        p+=x_size-3;         n+=*(cp-*p++);        n+=*(cp-*p++);        n+=*(cp-*p++);        n+=*(cp-*p++);        n+=*(cp-*p);        p+=x_size-5;        n+=*(cp-*p++);        n+=*(cp-*p++);        n+=*(cp-*p++);        n+=*(cp-*p++);        n+=*(cp-*p++);        n+=*(cp-*p++);        n+=*(cp-*p);        p+=x_size-6;        n+=*(cp-*p++);        n+=*(cp-*p++);        n+=*(cp-*p);      if (n<max_no){    /* do this test early and often ONLY to save wasted computation */        p+=2;        n+=*(cp-*p++);      if (n<max_no){        n+=*(cp-*p++);      if (n<max_no){        n+=*(cp-*p);      if (n<max_no){        p+=x_size-6;        n+=*(cp-*p++);      if (n<max_no){        n+=*(cp-*p++);      if (n<max_no){        n+=*(cp-*p++);      if (n<max_no){        n+=*(cp-*p++);      if (n<max_no){        n+=*(cp-*p++);      if (n<max_no){        n+=*(cp-*p++);      if (n<max_no){        n+=*(cp-*p);      if (n<max_no){        p+=x_size-5;        n+=*(cp-*p++);      if (n<max_no){        n+=*(cp-*p++);      if (n<max_no){        n+=*(cp-*p++);      if (n<max_no){        n+=*(cp-*p++);      if (n<max_no){        n+=*(cp-*p);      if (n<max_no){        p+=x_size-3;        n+=*(cp-*p++);      if (n<max_no){        n+=*(cp-*p++);      if (n<max_no){        n+=*(cp-*p);        if (n<max_no)        {            x=0;y=0;            p=in + (i-3)*x_size + j - 1;            c=*(cp-*p++);x-=c;y-=3*c;            c=*(cp-*p++);y-=3*c;            c=*(cp-*p);x+=c;y-=3*c;            p+=x_size-3;                 c=*(cp-*p++);x-=2*c;y-=2*c;            c=*(cp-*p++);x-=c;y-=2*c;            c=*(cp-*p++);y-=2*c;            c=*(cp-*p++);x+=c;y-=2*c;            c=*(cp-*p);x+=2*c;y-=2*c;            p+=x_size-5;                c=*(cp-*p++);x-=3*c;y-=c;            c=*(cp-*p++);x-=2*c;y-=c;            c=*(cp-*p++);x-=c;y-=c;            c=*(cp-*p++);y-=c;            c=*(cp-*p++);x+=c;y-=c;            c=*(cp-*p++);x+=2*c;y-=c;            c=*(cp-*p);x+=3*c;y-=c;            p+=x_size-6;            c=*(cp-*p++);x-=3*c;            c=*(cp-*p++);x-=2*c;            c=*(cp-*p);x-=c;            p+=2;            c=*(cp-*p++);x+=c;            c=*(cp-*p++);x+=2*c;            c=*(cp-*p);x+=3*c;            p+=x_size-6;                c=*(cp-*p++);x-=3*c;y+=c;            c=*(cp-*p++);x-=2*c;y+=c;            c=*(cp-*p++);x-=c;y+=c;            c=*(cp-*p++);y+=c;            c=*(cp-*p++);x+=c;y+=c;            c=*(cp-*p++);x+=2*c;y+=c;

⌨️ 快捷键说明

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