📄 susan.cpp
字号:
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) */
void susan_edges_small(uchar *in,int *r,uchar *mid,uchar *bp,int max_no,int x_size,int 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) */
void corner_draw(uchar *in,CORNER_LIST corner_list,int x_size,int 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) */
void susan_corners(uchar *in,int *r,uchar *bp,int max_no,CORNER_LIST corner_list,int x_size,int y_size)
{
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -