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

📄 fingerdlg.cpp

📁 这是个手指指纹识别的源代码 ,也是从网络上下载的
💻 CPP
📖 第 1 页 / 共 5 页
字号:
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 + -