📄 fingerdlg.cpp
字号:
a[7]=x+1;
b[7]=y+1;
while(i<8)
{
if(data[a[i]][b[i]]<10&&show[a[i]][b[i]]==255)
{
v=genzong(x,y,20+flag);
if(v==1)
{
bx[flag]=linendx;
by[flag]=linendy;
biaozhi[flag]=flag;
}
else
{
bx[flag]=0;
by[flag]=0;
biaozhi[flag]=flag;
}
flag++;
}
i++;
}
/* if(data[a[i]][b[i]]<10&&show[a[i]][b[i]]==255)
{
t=genzong(a[i],b[i],color+i);
if(t==1)
{
bx[flag]=linendx;
by[flag]=linendy;
biaozhi[flag]=flag;
flag++;
if(flag>2)
error=1;
}
i++;
}*/
if(flag!=3)
{
//MessageBox("什么是中间点");
for(i=0;i<300;i++)
{
for(j=0;j<300;j++)
{
if(show[i][j]>10)
show[i][j]=255;
}
}
return 0;
}
if(flag==3)
{
if(bx[0]==bx[1]&&by[0]==by[1]&&bx[0]!=0&&by[0]!=0)
{
// MessageBox("0和1");
qing(20);
}
else
if(bx[0]==bx[2]&&by[0]==by[2]&&bx[2]!=0&&by[2]!=0)
{
// MessageBox("0和2");
qing(22);
}
else
if(bx[1]==bx[2]&&by[1]==by[2]&&bx[1]!=0&&by[1]!=0)
{
// MessageBox("1和2");
qing(21);
}
else
{
//MessageBox("脱离");
for(i=0;i<300;i++)
{
for(j=0;j<300;j++)
{
if(show[i][j]>10)
show[i][j]=255;
}
}
//showshow();
return 0;
}
return 1;/////////表示找到了;
}
return 0;
}
int CFingerDlg::qing(int c)
{
int i,j;
for(i=0;i<300;i++)
{
for(j=0;j<300;j++)
{
if(show[i][j]==c)
{
data[i][j]=255;
}
}
}
for(i=0;i<300;i++)
{
for(j=0;j<300;j++)
{
if(show[i][j]>10)
show[i][j]=255;
}
}
return 0;
}
int CFingerDlg::searcharendpoint(int x, int y, int yuanx, int yuany)
{
int flag;
int i,j;
BYTE a[8];
int xp[8];
int yp[8];
i=x;
j=y;
a[0]=show[i][j+1];
xp[0]=i;
yp[0]=j+1;
a[1]=show[i][j-1];
xp[1]=i;
yp[1]=j-1;
a[2]=show[i+1][j];
xp[2]=i+1;
yp[2]=j;
a[3]=show[i-1][j];
xp[3]=i-1;
yp[3]=j;
a[4]=show[i+1][j-1];
xp[4]=i+1;
yp[4]=j-1;
a[5]=show[i-1][j-1];
xp[5]=i-1;
yp[5]=j-1;
a[6]=show[i-1][j+1];
xp[6]=i-1;
yp[6]=j+1;
a[7]=show[i+1][j+1];
xp[7]=i+1;
yp[7]=j+1;
flag=0;
i=0;
/////////////////////////////
while(i<8&&flag==0)
{
if(a[i]<10)
{
if(xp[i]!=yuanx || yp[i]!=yuany)
flag=1;
}
i++;
}
if(flag==1&&i<=8)
{
linendx=xp[i-1];
linendy=yp[i-1];
return 1;
}
else
return 0;
}
int CFingerDlg::getendpoint(int x, int y)
{
if(show[linendx][linendy]<10&&show[linendx][linendy]>4)
return 2;//////分擦点
else
if(show[linendx][linendy]<5)
return 1;///////终结点;
else
return 0;///////////////出错
}
int CFingerDlg::genzong(int x, int y, int c)
{
////////////////////////
int biao;
int t;
int flag;
int nextx,nexty;
int i,j;
//////////////////////////
biao=0;
flag=0;
i=x;
j=y;
nextx=i;
nexty=j;
//0表示没有占用的终结点,1表示被占用的终结点,5表示没有被占用的分叉点,6表示被占用的分叉点;
while(flag==0)//////////
{
t=searcharendpoint(i,j,x,y);
if(t==1)//////表示没有特殊点;
{
flag=1;
biao=1;
}
else
{
if(data[i+1][j]<10 &&show[i+1][j]==255)
{
nextx=i+1;
nexty=j;
show[i+1][j]=c;
}///////////扫描一点;
else
{
if(data[i-1][j]<10 &&show[i-1][j]==255)
{
nextx=i-1;
nexty=j;
show[i-1][j]=c;
}///////////////////扫描二点
else
{
if(data[i][j+1]<10 && show[i][j+1]==255)
{
nextx=i;
nexty=j+1;
show[i][j+1]=c;
}////////////////扫描三点;
else
{
if(data[i][j-1]<10 &&show[i][j-1]==255)
{
nextx=i;
nexty=j-1;
show[i][j-1]=c;
}/////////////////扫描四点;
else
{
if(data[i-1][j-1]<10&&show[i-1][j-1]==255)
{
nextx=i-1;
nexty=j-1;
show[i-1][j-1]=c;
}///////////////////扫描五点;
else
{
if(data[i-1][j+1]<10 &&show[i-1][j+1]==255)
{
nextx=i-1;
nexty=j+1;
show[i-1][j+1]=c;
}/////////////////////扫描六点;
else
{
if(data[i+1][j-1]<10 &&show[i+1][j-1]==255)
{
nextx=i+1;
nexty=j-1;
show[i+1][j-1]=c;
}/////////////////////扫描七点;
else
{
if(data[i+1][j+1]<10 &&show[i+1][j+1]==255)
{
nextx=i+1;
nexty=j+1;
show[i+1][j+1]=c;
}////////////////扫描八点
else
{
flag=1;
}
}
}
}
}
}
}
}
}
i=nextx;
j=nexty;
}//////////////循环结束;
//MessageBox("ttttt");
//showshow();
if(biao==1)
return 1;//正常返回;
else
return 0;//不正常返回;
}
long CFingerDlg::thing()
{
// TODO: Add your control notification handler code here
// AfxMessageBox("正在编写中!");
//定义图象的长和宽;
int lWidth=300;
int lHeight=300;
BYTE dataTemp[300][300];
for(int x=0;x<300;x++)
{
for(int y=0;y<300;y++)
{
dataTemp[x][y]=255;
}
}
//脏标记,用于判断是否完成总的循环
BOOL bModified;
//循环变量
int i;
int j;
int n;
int m;
//四个条件
BOOL bCondition1;
BOOL bCondition2;
BOOL bCondition3;
BOOL bCondition4;
//计数器
unsigned char nCount;
//5×5相邻区域像素值
unsigned char neighbour[5][5];
bModified=TRUE;
while(bModified)
{
bModified = FALSE;
for(j = 2; j <lHeight-2; j++)
{
for(i = 2;i <lWidth-2; i++)
{
bCondition1 = FALSE;
bCondition2 = FALSE;
bCondition3 = FALSE;
bCondition4 = FALSE;
//如果源图像中当前点为白色,则跳过
if(data[j][i]== 255)
continue;
//获得当前点相邻的5×5区域内像素值,白色用0代表,黑色用1代表
for (m = 0;m < 5;m++ )
{
for (n = 0;n < 5;n++)
{
neighbour[m][n] =(255-data[j+m-2][i+n-2]) / 255;
}
}
//neighbour[][]
//逐个判断条件。
//判断2<=NZ(P1)<=6
nCount = neighbour[1][1] + neighbour[1][2] + neighbour[1][3]
+ neighbour[2][1] + neighbour[2][3] +
+ neighbour[3][1] + neighbour[3][2] + neighbour[3][3];
if ( nCount >=2 && nCount<=6)
bCondition1 = TRUE;
//判断Z0(P1)=1
nCount = 0;
if (neighbour[1][2] == 0 && neighbour[1][1] == 1)
nCount++;
if (neighbour[1][1] == 0 && neighbour[2][1] == 1)
nCount++;
if (neighbour[2][1] == 0 && neighbour[3][1] == 1)
nCount++;
if (neighbour[3][1] == 0 && neighbour[3][2] == 1)
nCount++;
if (neighbour[3][2] == 0 && neighbour[3][3] == 1)
nCount++;
if (neighbour[3][3] == 0 && neighbour[2][3] == 1)
nCount++;
if (neighbour[2][3] == 0 && neighbour[1][3] == 1)
nCount++;
if (neighbour[1][3] == 0 && neighbour[1][2] == 1)
nCount++;
if (nCount == 1)
bCondition2 = TRUE;
//判断P2*P4*P8=0 or Z0(p2)!=1
if (neighbour[1][2]*neighbour[2][1]*neighbour[2][3] == 0)
bCondition3 = TRUE;
else
{
nCount = 0;
if (neighbour[0][2] == 0 && neighbour[0][1] == 1)
nCount++;
if (neighbour[0][1] == 0 && neighbour[1][1] == 1)
nCount++;
if (neighbour[1][1] == 0 && neighbour[2][1] == 1)
nCount++;
if (neighbour[2][1] == 0 && neighbour[2][2] == 1)
nCount++;
if (neighbour[2][2] == 0 && neighbour[2][3] == 1)
nCount++;
if (neighbour[2][3] == 0 && neighbour[1][3] == 1)
nCount++;
if (neighbour[1][3] == 0 && neighbour[0][3] == 1)
nCount++;
if (neighbour[0][3] == 0 && neighbour[0][2] == 1)
nCount++;
if (nCount != 1)
bCondition3 = TRUE;
}
//判断P2*P4*P6=0 or Z0(p4)!=1
if (neighbour[1][2]*neighbour[2][1]*neighbour[3][2] == 0)
bCondition4 = TRUE;
else
{
nCount = 0;
if (neighbour[1][1] == 0 && neighbour[1][0] == 1)
nCount++;
if (neighbour[1][0] == 0 && neighbour[2][0] == 1)
nCount++;
if (neighbour[2][0] == 0 && neighbour[3][0] == 1)
nCount++;
if (neighbour[3][0] == 0 && neighbour[3][1] == 1)
nCount++;
if (neighbour[3][1] == 0 && neighbour[3][2] == 1)
nCount++;
if (neighbour[3][2] == 0 && neighbour[2][2] == 1)
nCount++;
if (neighbour[2][2] == 0 && neighbour[1][2] == 1)
nCount++;
if (neighbour[1][2] == 0 && neighbour[1][1] == 1)
nCount++;
if (nCount != 1)
bCondition4 = TRUE;
}
if(bCondition1 && bCondition2 && bCondition3 && bCondition4)
{
dataTemp[j][i] = 255;
bModified = TRUE;
}
else
{
dataTemp[j][i] = 0;
}
}
}
// 复制腐蚀后的图像
for(int x=0;x<300;x++)
{
for(int y=0;y<300;y++)
{
data[x][y]=dataTemp[x][y];
}
}
}
ShowBmp();
return 0;
}
long CFingerDlg::reload()
{
// TODO: Add your control notification handler code here
if(!Being)
{
AfxMessageBox("未输入指纹图像!");
return 0;
}
///////
GiveData();
GiveDatabmp();
ShowBmp();
m_DIBStatic.UpdateDib();
return 0;
}
int CFingerDlg::sao(int type)
{
int saocount;
int v,t;
int i,j;
int zai[300][300];
/////////////////////
saocount=0;
newendcount=0;
for(i=0;i<300;i++)
{
for(j=0;j<300;j++)
{
c[i][j]=mart[i][j];
}
}
for(i=0;i<300;i++)
{
for(j=0;j<300;j++)
{
if(mart[i][j]==0)
{
if(beijin[i][j]==255)
{
mart[i][j]=255;
}
}
}
}
for(i=0;i<300;i++)
{
for(j=0;j<300;j++)
{
zai[i][j]=255;
}
}
////////////////////////
for(i=30;i<270;i++)
{
for(j=30;j<270;j++)
{
v=0;
t=0;
if(mart[i][j]==0)
{
t=getdirect(i,j);
if(t==1)
{
v=neiborghtstart(i,j,-lx,-ly);
if(v==1)///表示符合条件的终结点
{
zai[i][j]=0;
newenddian[saocount].x=i;
newenddian[saocount].y=j;
newenddian[saocount].dirx=-lx;
newenddian[saocount].diry=-ly;
if(saocount<19)
saocount++;
}
}
}
}
}
////////////////////////
for(i=0;i<300;i++)
{
for(j=0;j<300;j++)
{
if(zai[i][j]==0&&c[i][j]==0)
zai[i][j]=0;
else
zai[i][j]=255;
}
}
for(i=0;i<300;i++)
{
for(j=0;j<300;j++)
{
if(zai[i][j]==0)
{
data[i][j+1]=20;
data[i+1][j+1]=20;
data[i+1][j]=20;
data[i+1][j-1]=20;
data[i][j-1]=20;
data[i-1][j-1]=20;
data[i-1][j]=20;
data[i-1][j+1]=20;
}
}
}
ShowBmp();
if(saocount<19&&saocount>4)
{
newendcount=saocount;
return 1;
}
else
{
return 0;
}
}
long CFingerDlg::getdirect(int x, int y)
{
int nx,ny;
int i,j;
int len;
BYTE lin[20][20];
for(i=0;i<20;i++)
{
for(j=0;j<20;j++)
{
if(data[x-10+i][y-10+j]==0)
lin[i][j]=0;
else
lin[i][j]=255;
}
}
i=10;
j=10;
len=5;
while(len>0)
{
if(lin[i+1][j]==0)
{
nx=i+1;
ny=j;
lin[i][j]=255;
}
else
{
if(lin[i-1][j]==0)
{
nx=i-1;
ny=j;
lin[i][j]=255;
}
else
{
if(lin[i][j+1]==0)
{
nx=i;
ny=j+1;
lin[i][j]=255;
}
else
{
if(lin[i][j-1]==0)
{
nx=i;
ny=j-1;
lin[i][j]=255;
}
else
{
if(lin[i-1][j-1]==0)
{
nx=i-1;
ny=j-1;
lin[i][j]=255;
}
else
{
if(lin[i-1][j+1]==0)
{
nx=i-1;
ny=j+1;
lin[i][j]=255;
}
else
{
if(lin[i+1][j-1]==0)
{
nx=i+1;
ny=j-1;
lin[i][j]=255;
}
else
{
if(lin[i+1][j+1]==0)
{
nx=i+1;
ny=j+1;
lin[i][j]=255;
}
else
{
return 0;
}
}
}
}
}
}
}
}
i=nx;
j=ny;
len--;
}
lx=i-10;
ly=j-10;
return 1;
}
int CFingerDlg::fanwei(int type)
{
// TODO: Add your control notification handler code here
int i,j,k,v;
//////////////初始化t[][]数组
for(i=0;i<20;i++)
{
for(j=0;j<300;j++)
{
data[i][j]=255;
data[i+280][j]=255;
data[j][i]=255;
data[j][i+280]=255;
}
}
for(i=0;i<300;i++)
{
for(j=0;j<300;j++)
{
beijin[i][j]=140;
}
}
//////////////从左到右
for(i=5;i<295;i++)
{
j=0;
while(j<300)
{
if(data[i][j]>220)
j++;
else
break;
}//计算出到黑点的列值
for(k=-2;k<3;k++)
{
for(v=0;v<j;v++)
{
beijin[i+k][v]=255;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -