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

📄 patterndlg.cpp

📁 汉字识别的一个小例子 识别率不是那么高
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
		// Select the brush into the device context .
		CBrush* pOldBrush = pDC->SelectObject (&Brush);
		pDC->Ellipse(point.x-4,point.y-4,point.x+4,point.y+4);
		pDC->SelectObject (pOldBrush );
		x=(int)(point.x-Startx)*32/wid;
		y= (int)(point.y-Starty)*32/lon;
		
		if(Time==0)
		{ 
			store[num][Time].x=x;
			store[num][Time].y=y;
			Time++;
			if(y>ymax) 
				ymax=y;
			if(y<ymin) 
				ymin=y;
			if(x>xmax) 
				xmax=x;
			if(x<xmin) 
				xmin=x;
		}
		               
		else
		{ 
			if(x!=store[num][Time-1].x||y!=store[num][Time-1].y)
			{
				store[num][Time].x=x;
				store[num][Time].y=y;
				Time++;
				if(y>ymax) 
					ymax=y;
				if(y<ymin) 
					ymin=y;
				if(x>xmax) 
					xmax=x;
				if(x<xmin) 
					xmin=x;
			}
		}
		
		if(Time>=300)
		{
			AfxMessageBox("当前笔划写入有误(太多)",NULL,NULL);
			OnClear();
		}
	}
	
	ReleaseDC(pDC );
	DeleteObject(pOldBrush);
	DeleteObject(Rgn);
	DeleteObject(Brush);
	
	CWnd::OnMouseMove(nFlags, point);
}

//清空画板
void CPatternDlg::OnClear() 
{
	int i,j,k;
	CDC *pDC=GetDC();
	pDC-> PatBlt (Startx,Starty,wid,lon, PATCOPY );
	ReleaseDC(pDC );
	mouseDown=0;

	for(i=0;i<15;i++){
		for(j=0;j<300;j++)
		{
			store[i][j].x=-1;
			store[i][j].y=-1;
		}
	}

	for(i=0;i<15;i++){
		for(j=0;j<300;j++)
		{
			storeback[i][j].x=-1;
			storeback[i][j].y=-1;
		}
	}

	Time=0;
	num=0;
	xmax=0;
	ymax=0;
	xmin=32;
	ymin=32;

	for(i=0;i<50;i++)
		queue[i]=-1;
	for(i=0;i<40;i++)
		queue1[i]=-1;

	test.total=-1;
	for(j=0;j<15;j++) 
		test.dian[j]=-1;
	for(j=0;j<15;j++)
	{
		for(k=0;k<20;k++)
		{
			test.detail[j][k].relate=0;
			test.detail[j][k].arc=0;
			test.detail[j][k].region=0;
		}
	}
   
	return;
}

//去除噪声
int CPatternDlg::Ridnoise(int j)         //返回k+1个特征点
{
	int i,k,ff;
	k=0;
	ff=test.total+1;      //ff,当前的处理条数,total为已存条数的最大下标

	queue1[0]=queue[0];
	for(i=1;i<j-1;i++)
	{ 
		if (abs(store[ff][queue[i]].x-store[ff][queue1[k]].x)<yu1+1+1
			&&(((store[ff][queue[i]].y-store[ff][queue1[k]].y)*(store[ff][queue[i]].y-store[ff][queue[i+1]].y))<0
			||abs(store[ff][queue[i]].y-store[ff][queue[i+1]].y)<yu2))
		{;}
		else
		{
			if (abs(store[ff][queue[i]].y-store[ff][queue1[k]].y)<yu1+1+1
				&&(((store[ff][queue[i]].x-store[ff][queue1[k]].x)*(store[ff][queue[i]].x-store[ff][queue[i+1]].x))<0||abs(store[ff][queue[i]].x-store[ff][queue[i+1]].x)<yu2))
			{;}    
			else
			{
				k++; 
				queue1[k]=queue[i];
			} 
		}
	}

	if( abs(store[ff][queue[j-1]].y-store[ff][queue1[k]].y)<2
		&&abs(store[ff][queue[j-1]].x-store[ff][queue1[k]].x)<2)
	{      
		queue1[k]=queue[j-1];
	}
	else
	{
		k++;
		queue1[k]=queue[j-1];
	}
  
	return k;
}

//得到arc特征
int CPatternDlg::Getarc(int j)
{
	int x1,x2,y1,y2,x3,y3,t1,smax,ci,vct,are;
	float s; 
	smax=0;ci=0;vct=0;
	 
	int kk;
	kk=test.total;
  
	x1=store[kk][queue1[j-1]].x;
	y1=store[kk][queue1[j-1]].y;
	x3=store[kk][queue1[j]].x;
	y3=store[kk][queue1[j]].y;
	are=abs(x1-x3);
	if(abs(y1-y3)>are) 
		are=abs(y1-y3);
	 
	for(t1=queue1[j-1]+1;t1<queue1[j];t1++)
	{
		y2=store[kk][t1].y;
		x2=store[kk][t1].x;
		s=(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2)/are;

		if(s>=yu||s<=-yu)
		{
			if(s*smax==0)
			{
				if(s>0)
					vct=1;
				else
					vct=-1;
			}
		 
			if(s*smax<=0)
			{
				ci++;
				smax=s;
			}

			if(abs(smax)<abs(s)) 
				smax=s;
		}
	}
	 
	ci=vct*ci;

	return ci;
}

//保存特征点
void CPatternDlg::Save(int k)//此条共k+1个点
{     
	int i,j,m,l,tat;
	float value;
	test.total++; //特征总条数加一
	tat=test.total;//没有排序
	test.dian[test.total]=k;//k+1 points,初值为-1,定义此条值

	for(j=0;j<=k;j++)
	{   
		m=(int)((store[tat][queue1[j]].x-xmin)*16/(xmax-xmin+1));
		l=(int)((store[tat][queue1[j]].y-ymin)*16/(ymax-ymin+1));
		test.detail[tat][j].region=16*l+m;

		if(j==0)
		{
			test.detail[tat][j].relate=10;
			test.detail[tat][j].arc=0;
		}

		if(j>0)
		{
			if((store[tat][queue1[j]].x-store[tat][queue1[j-1]].x)>5.67*abs(store[tat][queue1[j]].y-store[tat][queue1[j-1]].y))
			{
				test.detail[test.total][j].relate=1;
				test.detail[test.total][j].arc=Getarc(j);
			}
			else 
			{
				if((store[tat][queue1[j]].x-store[tat][queue1[j-1]].x)<-5.67*abs(store[tat][queue1[j]].y-store[tat][queue1[j-1]].y))
				{
					test.detail[test.total][j].relate=9;
					test.detail[test.total][j].arc=Getarc(j);
				}
				else
				{
					if(5.67*abs(store[tat][queue1[j]].x-store[tat][queue1[j-1]].x)<(store[tat][queue1[j]].y-store[tat][queue1[j-1]].y))
					{
						test.detail[test.total][j].relate=7;
						test.detail[test.total][j].arc=Getarc(j);
					}
					else 
					{
						if(-5.67*abs(store[tat][queue1[j]].x-store[tat][queue1[j-1]].x)>(store[tat][queue1[j]].y-store[tat][queue1[j-1]].y))
						{
							test.detail[test.total][j].relate=3;
							test.detail[test.total][j].arc=Getarc(j);
						}
						else
						{
							value=(float)(store[tat][queue1[j]].y-store[tat][queue1[j-1]].y)/(store[tat][queue1[j]].x-store[tat][queue1[j-1]].x);

							if(value<2.747&&value>0.364&&(store[tat][queue1[j]].y-store[tat][queue1[j-1]].y)>0)
							{
								test.detail[test.total][j].relate=6;
								test.detail[test.total][j].arc=Getarc(j);
							}

							if(value<2.747&&value>0.364&&(store[tat][queue1[j]].y-store[tat][queue1[j-1]].y)<0)
							{
								test.detail[test.total][j].relate=4;
								test.detail[test.total][j].arc=Getarc(j);
							}
            
							if(value>-2.747&&value<-0.364&&(store[tat][queue1[j]].y-store[tat][queue1[j-1]].y)>0)
							{
								test.detail[test.total][j].relate=8;
								test.detail[test.total][j].arc=Getarc(j);
							}

							if(value>-2.747&&value<-0.364&&(store[tat][queue1[j]].y-store[tat][queue1[j-1]].y)<0)
							{
								test.detail[test.total][j].relate=2;
								test.detail[test.total][j].arc=Getarc(j);
							}

							if(value<=5.61&&value>=2.747&&(store[tat][queue1[j]].y-store[tat][queue1[j-1]].y)>0)
							{
								test.detail[test.total][j].relate=76;
								test.detail[test.total][j].arc=Getarc(j);
							}
							
							if(value<=5.61&&value>=2.747&&(store[tat][queue1[j]].y-store[tat][queue1[j-1]].y)<0)
							{
								test.detail[test.total][j].relate=34;
								test.detail[test.total][j].arc=Getarc(j);
							}

							if(value>=-5.61&&value<=-2.747&&(store[tat][queue1[j]].y-store[tat][queue1[j-1]].y)>0)
							{
								test.detail[test.total][j].relate=78;
								test.detail[test.total][j].arc=Getarc(j);
							}

							if(value>=-5.61&&value<=-2.747&&(store[tat][queue1[j]].y-store[tat][queue1[j-1]].y)<0)
							{
								test.detail[test.total][j].relate=32;
								test.detail[test.total][j].arc=Getarc(j);
							}

							if(value<=0.364&&value>=0.1782&&(store[tat][queue1[j]].y-store[tat][queue1[j-1]].y)>0)
							{
								test.detail[test.total][j].relate=16;
								test.detail[test.total][j].arc=Getarc(j);
							}

							if(value<=0.364&&value>=0.1782&&(store[tat][queue1[j]].y-store[tat][queue1[j-1]].y)<0)
							{
								test.detail[test.total][j].relate=94;
								test.detail[test.total][j].arc=Getarc(j);
							}
           
							if(value>=-0.364&&value<=-0.1782&&(store[tat][queue1[j]].y-store[tat][queue1[j-1]].y)>0)
							{
								test.detail[test.total][j].relate=98;
								test.detail[test.total][j].arc=Getarc(j);
							}
           
							if(value>=-0.364&&value<=-0.1782&&(store[tat][queue1[j]].y-store[tat][queue1[j-1]].y)<0)
							{
								test.detail[test.total][j].relate=12;
								test.detail[test.total][j].arc=Getarc(j);
							}
						}
					}
				}
			}
		}
	}
			  
	for(i=0;i<50;i++)
		queue[i]=-1;
	for(i=0;i<40;i++)
		queue1[i]=-1;		      //must
}

//进一步处理数据,提取特征
void  CPatternDlg::DealData()
{  
	int i,j,k,num1,Time1;
	Inorder();
	for(num1=0;store[num1][0].x>-1;num1++)        //第几条线
	{
		for(Time1=0,j=0;store[num1][Time1].x>-1;Time1++) 
		{       
			if(Time1==0)
			{
				queue[j]=Time1;j++;
			}
			
			if(Time1>0&&store[num1][Time1+1].x==-1)
			{
				queue[j]=Time1;j++;
			}
        
			if(Time1>0&&store[num1][Time1+1].x!=-1)
			{
				if((store[num1][Time1+1].x-store[num1][Time1].x)*(store[num1][Time1-1].x-store[num1][Time1].x)>0||(store[num1][Time1+1].y-store[num1][Time1].y)*(store[num1][Time1-1].y-store[num1][Time1].y)>0)
				{
					queue[j]=Time1;j++;
				}

				if (store[num1][Time1-1].x-store[num1][Time1].x==0)//&&(store[num1][Time1+1].x-store[num1][Time1].x!0))
				{
					for(i=1;store[num1][Time1-1-i].x==store[num1][Time1-1].x&&(Time1-1-i)>=0;i++){;}
					
					if((store[num1][Time1+1].x-store[num1][Time1].x)*(store[num1][Time1-1-i].x-store[num1][Time1].x)>0)
					{
						queue[j]=Time1;j++;
					}
				}

				if (store[num1][Time1-1].y-store[num1][Time1].y==0)//&&(store[num1][Time1+1].y-store[num1][Time1].y)<0)
				{
					for(i=1;store[num1][Time1-1-i].y==store[num1][Time1-1].y&&(Time1-1-i)>=0;i++){;}
					
					if((store[num1][Time1+1].y-store[num1][Time1].y)*(store[num1][Time1-1-i].y-store[num1][Time1].y)>0)
					{
						queue[j]=Time1;j++;
					}
				}
			}
		}
			
		k=Ridnoise(j);    //共j点,0到j-1
		Save(k);
	}
}

CPatternDlg::OnRecogch()                                 //清空获取的特征
{
	int i,j,k;

	for(i=0;i<50;i++)
		queue[i]=-1;
	for(i=0;i<40;i++)
		queue1[i]=-1;

	test.total=-1;
	for(j=0;j<15;j++) 
    	test.dian[j]=-1;

	for(j=0;j<15;j++)
	{
		for(k=0;k<20;k++)
		{
			test.detail[j][k].relate=0;
			test.detail[j][k].arc=0;
			test.detail[j][k].region=0;
		}
	}
	
	return(1);
}

void CPatternDlg::OnExitMenu() 
{
	// TODO: Add your command handler code here
	OnEsp();
}

void CPatternDlg::OnAboutMenu() 
{  
	CAboutDlg cabout;	

	// TODO: Add your command handler code here
	if(cabout.DoModal()==1)
	{;}
}

void CPatternDlg::OnSaveMenu() 
{
	// TODO: Add your command handler code here
	CFile cf;	
	int k,j;
	
	if(cf.Open("mydata.dat",CFile::modeReadWrite)==NULL)
	{
		AfxMessageBox("打开文件失败,\n您最好退出程序");
	}
	else 
	{       
		cf.SeekToEnd();
		cf.Write(&tez[zong].zifu, sizeof(char)*2);
		cf.Write(&tez[zong].total, sizeof(int));
		for(j=0;j<=tez[zong].total;j++)
		{
			cf.Write(&tez[zong].dian[j], sizeof(int));
		}
		   
		for(j=0;j<=tez[zong].total;j++)
		{
			for(k=0;k<=tez[zong].dian[j];k++)
			{
				cf.Write(&tez[zong].detail[j][k].relate,sizeof(int));
				cf.Write(&tez[zong].detail[j][k].region, sizeof(int));
				cf.Write(&tez[zong].detail[j][k].arc, sizeof(int));
			}
		}
			
		cf.Close( );
	}
}		

void CPatternDlg::OnOpenMenu() 
{
	CFile cf;	
	char s[20];
	int j,k;
	int nFileSize;
	int tt;

	if(cf.Open("mydata.dat",CFile::modeReadWrite)==NULL)
	{
		AfxMessageBox("打开文件失败,\n您最好退出程序");
	}
	else 
	{     
		cf.SeekToBegin(); 
		nFileSize=cf.GetLength( ); 
	    for(zong=0,tt=0;tt<nFileSize-1;zong++)                //最后减一
		{  
			cf.Read(&tez[zong].zifu, sizeof(char)*2);
			tt=tt+sizeof(char)*2;
						
			cf.Read(&tez[zong].total, sizeof(int));

			tt=tt+sizeof(int);
			for(j=0;j<=tez[zong].total;j++)
			{
				cf.Read(&tez[zong].dian[j], sizeof(int));
				tt=tt+sizeof(int);}
		   
				for(j=0;j<=tez[zong].total;j++)
				{
					for(k=0;k<=tez[zong].dian[j];k++)
					{
						cf.Read(&tez[zong].detail[j][k].relate,sizeof(int));
						cf.Read(&tez[zong].detail[j][k].region, sizeof(int));
						cf.Read(&tez[zong].detail[j][k].arc, sizeof(int));
						tt=tt+sizeof(int)*3;
					}
				}
		}
		zong--;
	}
	
	cf.Close( );
	sprintf(s,"读入正确,共有字 %d",zong);
	AfxMessageBox(s);
}

void CPatternDlg::OnSaveMenu1()
{
	AfxMessageBox("Save OK");
}

void CPatternDlg::Inorder()
{
	int i,j,k,num1,Time1;
	int  xxbegin,xxend,yybegin,yyend,total;
   
	for(num1=0;store[num1][0].x>-1;num1++)        //第几条线
	{
		xxbegin=store[num1][0].x;
		yybegin=store[num1][0].y;
		for(Time1=0,j=0;store[num1][Time1].x>-1;Time1++) 
		{;}
		total=Time1;
		xxend=store[num1][Time1-1].x;
		yyend=store[num1][Time1-1].y;
		
		for(Time1=0;store[num1][Time1].x>-1;Time1++) 
		{
			storeback[0][total-Time1-1].x=store[num1][Time1].x;
			storeback[0][total-Time1-1].y=store[num1][Time1].y;
		}
   
		if(abs(xxbegin-xxend)>2*abs(yybegin-yyend)&&(xxbegin>xxend))
		{
			for(j=0;j<total;j++)
			{
				store[num1][j].x=storeback[0][j].x;
				store[num1][j].y=storeback[0][j].y;
			}
		}
		
		if(abs(xxbegin-xxend)<=2*abs(yybegin-yyend)&&(yybegin>yyend))
		{
			for(j=0;j<total;j++)
			{
				store[num1][j].x=storeback[0][j].x;
				store[num1][j].y=storeback[0][j].y;
			}
		}
	}
}

⌨️ 快捷键说明

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