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

📄 reconizedlg.cpp

📁 该程序是能够处理图象分割和识别等等内容,为朋友提供图象处理原代码.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	flag1=0;	flag2=0;	flag3=0;	flag4=0;
	iflag=0;	index2=0;
	for(i=longOffset;i<m_Width-longOffset;i++)
	{
		for(j=longOffset;j<m_Height-longOffset;j++)
		{
			for(k=1;k<=longOffset;k++)
				for(l=1;l<=shortOffset;l++)
				{
					if(BufferReg[i-k][j-l]==255)
						flag1+=1;
				}
			for(k=1;k<=longOffset;k++)
				for(l=1;l<=shortOffset;l++)
				{
					if(BufferReg[i-k][j+l]==255)
						flag2+=1;
				}
			for(k=1;k<=shortOffset;k++)
				for(l=1;l<=longOffset;l++)
				{
					if(BufferReg[i-k][j+l]==255)
						flag3+=1;
				}
			for(k=1;k<=shortOffset;k++)
				for(l=1;l<=longOffset;l++)
				{
					if(BufferReg[i+k][j+l]==255)
						flag4+=1;
				}
			if( (flag2>=whitepercent) && (flag3>=whitepercent) )
			{
				iflag=1;
				j+=step;
				PointRT[index2][0]=i;
				PointRT[index2][1]=j;
				PointRT[index2][2]=1;
				index2++;
			}
			/////////////////////////////////////////////////
			flag1=0;	flag2=0;	flag3=0;	flag4=0;
			//////////////////////////////////////////////////
		}
		if(iflag==1)
		{
			i+=step;
			iflag=0;
		}
	}

	/////////////////////////////////////////////////
	//求右下角
	flag1=0;	flag2=0;	flag3=0;	flag4=0;
	iflag=0;	index3=0;
	for(i=longOffset;i<m_Width-longOffset;i++)
	{
		for(j=longOffset;j<m_Height-longOffset;j++)
		{
			for(k=1;k<=longOffset;k++)
				for(l=1;l<=shortOffset;l++)
				{
					if(BufferReg[i-k][j+l]==255)
						flag1+=1;
				}
			for(k=1;k<=longOffset;k++)
				for(l=1;l<=shortOffset;l++)
				{
					if(BufferReg[i-k][j-l]==255)
						flag2+=1;
				}
			for(k=1;k<=shortOffset;k++)
				for(l=1;l<=longOffset;l++)
				{
					if(BufferReg[i-k][j-l]==255)
						flag3+=1;
				}
			for(k=1;k<=shortOffset;k++)
				for(l=1;l<=longOffset;l++)
				{
					if(BufferReg[i+k][j-l]==255)
						flag4+=1;
				}
			if( (flag2>=whitepercent) && (flag3>=whitepercent) )
			{
				iflag=1;
				j+=step;
				PointRB[index3][0]=i;
				PointRB[index3][1]=j;
				PointRB[index3][2]=1;
				index3++;
			}
			/////////////////////////////////////////////////
			flag1=0;	flag2=0;	flag3=0;	flag4=0;
			//////////////////////////////////////////////////
		}
		if(iflag==1)
		{
			i+=step;
			iflag=0;
		}
	}

	///////////////////////////////////////////////////////////
	//求左下角
	flag1=0;	flag2=0;	flag3=0;	flag4=0;
	iflag=0;	index4=0;
	for(i=longOffset;i<m_Width-longOffset;i++)
	{
		for(j=longOffset;j<m_Height-longOffset;j++)
		{
			for(k=1;k<=longOffset;k++)
				for(l=1;l<=shortOffset;l++)
				{
					if(BufferReg[i+k][j+l]==255)
						flag1+=1;
				}
			for(k=1;k<=longOffset;k++)
				for(l=1;l<=shortOffset;l++)
				{
					if(BufferReg[i+k][j-l]==255)
						flag2+=1;
				}
			for(k=1;k<=shortOffset;k++)
				for(l=1;l<=longOffset;l++) 
				{
					if(BufferReg[i+k][j-l]==255)
						flag3+=1;
				}
			for(k=1;k<=shortOffset;k++)
				for(l=1;l<=longOffset;l++)
				{
					if(BufferReg[i-k][j-l]==255)
						flag4+=1;
				}
			if( (flag2>=whitepercent) && (flag3>=whitepercent) )
			{
				iflag=1;
				j+=step;
				PointLB[index4][0]=i;
				PointLB[index4][1]=j;
				PointLB[index4][2]=1;
				index4++;
			}
			/////////////////////////////////////////////////
			flag1=0;	flag2=0;	flag3=0;	flag4=0;
			//////////////////////////////////////////////////
		}
		if(iflag==1)
		{
			i+=step;
			iflag=0;
		}
	}
/////////////////////////////////////////////////////////////////////	
}

void CReconizeDlg::OnDrawEdge() //求出满足要求的四个顶点,并且绘制出来
{
	// TODO: Add your command handler code here
	if(Flag!=2)
	{
		MessageBox("未二值化","除错",MB_ICONSTOP|MB_OK);
		return;
	}

	int i,j,k;

	Getpts() ;

	///////  绘出左上角
	CString tmpStr1;
	tmpStr1.Format("左上角点数:%d",index1);
	MessageBox(tmpStr1);
	CClientDC dc(this);
	DrawRegion();
	for(i=0;i<index1;i++)
	{
		for(j=-1;j<=1;j++)
			for(k=-1;k<=1;k++)
			{
				dc.SetPixel(PointLT[i][0]+j,PointLT[i][1]+k,RGB(255,0,0) );
			}
	}

	///////  绘出右上角
	tmpStr1.Format("右上角点数: %d",index2);
	MessageBox(tmpStr1);
	DrawRegion();
	for(i=0;i<index2;i++)
	{
		for(j=-1;j<=1;j++)
			for(k=-1;k<=1;k++)
			{
				dc.SetPixel(PointRT[i][0]+j,PointRT[i][1]+k,RGB(255,0,0) );
			}
	}


	///////  绘出右下角
	tmpStr1.Format("右下角点数: %d",index3);
	MessageBox(tmpStr1);
	DrawRegion();
	for(i=0;i<index3;i++)
	{
		for(j=-1;j<=1;j++)
			for(k=-1;k<=1;k++)
			{
				dc.SetPixel(PointRB[i][0]+j,PointRB[i][1]+k,RGB(255,0,0) );
			}
	}

	///////  绘出左下角
	tmpStr1.Format("左下角点数: %d",index4);
	MessageBox(tmpStr1);
	DrawRegion();
	for(i=0;i<index4;i++)
	{
		for(j=-1;j<=1;j++)
			for(k=-1;k<=1;k++)
			{
				dc.SetPixel(PointLB[i][0]+j,PointLB[i][1]+k,RGB(255,0,0) );
			}
	}

////////////////////////////////////////////////
}

void CReconizeDlg::OnDrawRect() 
{
	// TODO: Add your control notification handler code here
	DrawAvgrect();
	
}

void CReconizeDlg::OnQuickReconize() 
{
	// TODO: Add your control notification handler code here
	
	if(Flag!=0)
	{
		MessageBox("未打开图象","除错",MB_ICONSTOP|MB_OK);
		return;
	}
    
	OnToGray();			//求出灰度图
	OnWhiteBlack();//求出二值图
	OnDrawEdge();//描点
	OnGetRect() ;//求矩形
	OnDrawRect();		//求出平均矩形
	MessageBox("王侯艳----2004--6--20");
}

void CReconizeDlg::DrawRect()   //绘制矩形。
{
	// TODO: Add your command handler code here
	MatchRect2();
	CString tmpStr1;
	tmpStr1.Format("矩形总数: %d",indexRect);
	MessageBox(tmpStr1);

	CClientDC dc(this);
	//OnDrawOrig();
	CPen pen(PS_SOLID,1,RGB(255,0,0));
	dc.SelectObject(pen);
	int i;
	for(i=0;i<indexRect;i++)
	{
		dc.MoveTo( PointLT[Rect[i][0]][0] , PointLT[Rect[i][0]][1] );///////
		dc.LineTo( PointRT[Rect[i][1]][0] , PointRT[Rect[i][1]][1] );

		dc.MoveTo( PointRT[Rect[i][1]][0] , PointRT[Rect[i][1]][1] );
		dc.LineTo( PointRB[Rect[i][2]][0] , PointRB[Rect[i][2]][1] );

		dc.MoveTo( PointRB[Rect[i][2]][0] , PointRB[Rect[i][2]][1] );
		dc.LineTo( PointLB[Rect[i][3]][0] , PointLB[Rect[i][3]][1] );

		dc.MoveTo( PointLB[Rect[i][3]][0] , PointLB[Rect[i][3]][1] );
		dc.LineTo( PointLT[Rect[i][0]][0] , PointLT[Rect[i][0]][1] );
	}

}

void CReconizeDlg::MatchRect2()
{
	indexRect=0;
	int i,j,k,l;
	for(i=0;i<50000;i++)
		for(j=0;j<4;j++)
			Rect[i][j]=-1;
	////////////i PointLT ;   j PointRT ;   k PointRB ;   l PointLB
	double x,y,rate, x1,y1,rate1;
	for(i=0;i<index1;i++)
	{
		Rect[indexRect][0]=i;
		for(j=0;j<index2;j++)
		{
			if( PointRT[j][0]>(PointLT[i][0]+80) && abs(PointRT[j][1]-PointLT[i][1])<10 )//符合要求的右上点
			{
				for(k=0;k<index3;k++)
				{
					if( abs(PointRB[k][0]-PointRT[j][0])<10 && PointRB[k][1]>(PointRT[j][1]+40) )//符合要求的右下点
					{
						for(l=0;l<index4;l++)
						{
							if(    PointLB[l][0]<PointRB[k][0]-80 && abs(PointLB[l][1]-PointRB[k][1])<10
								&& abs(PointLB[l][0]-PointLT[i][0])<10 && PointLB[l][1]>PointLT[i][1]+40 )//符合要求的左下点
							{
								x = PointRT[j][0]-PointLT[i][0];
								y = PointRB[k][1]-PointRT[j][1]+0.001;
								x1= PointRB[k][0]-PointLB[l][0];
								y1= PointLB[l][1]-PointLT[i][1]+0.001;
								rate = x/y;
								rate1= x1/y1;
								if(rate>=2.7 && rate<=3.3 && rate1>=2.7 && rate1<=3.3)
								{
									Rect[indexRect][0]=i;
									Rect[indexRect][1]=j;
									Rect[indexRect][2]=k;
									Rect[indexRect][3]=l;
									indexRect++;
								}
							}
						}//for(l=0;l<index4;l++)
					}
				}//for(k=0;k<index3;k++)
			}
		}//for(j=0;j<index2;j++)
	}//for(i=0;i<index1;i++)
}

void CReconizeDlg::DrawAvgrect() //求出平均矩形。
{
	// TODO: Add your command handler code here
	AvgRect();	
	DrawBMP();
	
	CString tmpStr1;
	tmpStr1.Format(" 车牌: %d",avgindexRect);
	MessageBox(tmpStr1);

	CClientDC dc(this);
	CPen pen(PS_SOLID,1,RGB(255,0,0));
	dc.SelectObject(pen);
	DrawBMP();
	int i;
	for(i=0;i<avgindexRect;i++)
	{
		dc.MoveTo( avgPointLT[i][0] , avgPointLT[i][1] );
		dc.LineTo( avgPointRT[i][0] , avgPointRT[i][1] );

		dc.MoveTo( avgPointRT[i][0] , avgPointRT[i][1] );
		dc.LineTo( avgPointRB[i][0] , avgPointRB[i][1] );
		
		dc.MoveTo( avgPointRB[i][0] , avgPointRB[i][1] );
		dc.LineTo( avgPointLB[i][0] , avgPointLB[i][1] );
		
		dc.MoveTo( avgPointLB[i][0] , avgPointLB[i][1] );
		dc.LineTo( avgPointLT[i][0] , avgPointLT[i][1] );

	}
}

bool CReconizeDlg::MatchRectPoint(int i,int j)
{ int Distance,k;    //两个矩形的顶点相距参数
  bool flag=true;
  Distance=25;
  for(k=0;flag&&k<2;k++)
	 if(abs(PointLT[Rect[i][0]][k]-PointLT[Rect[j][0]][k])<=Distance
		 &&abs(PointRT[Rect[i][1]][k]-PointRT[Rect[j][1]][k])<=Distance
		 &&abs(PointRB[Rect[i][2]][k]-PointRB[Rect[j][2]][k])<=Distance
		 &&abs(PointLB[Rect[i][3]][k]-PointLB[Rect[j][3]][k])<=Distance
	   )
        flag=true;
	   else flag=false;
  return(flag); 
}

void CReconizeDlg::AvgRect()
{
    bool AlreadyRect[50000];
    int i,j,k,count,tempLT[2],tempRT[2],tempRB[2],tempLB[2];
	avgindexRect=0;
	for(i=0;i<2;i++)
	{
	   tempLT[i]=0;
       tempLB[i]=0;
	   tempRT[i]=0;
	   tempRB[i]=0;
	}
	for( i=0;i<50000;i++)
	{
	   AlreadyRect[i]=false;
	}
	
    for( i=0;i<indexRect;i++)
	{ 
	 if(!AlreadyRect[i])
	{  
		  count=1;
		  for(k=0;k<2;k++)
		  {
			tempLT[k]=PointLT[Rect[i][0]][k];
			tempLB[k]=PointLB[Rect[i][3]][k];
			tempRT[k]=PointRT[Rect[i][1]][k];
			tempRB[k]=PointRB[Rect[i][2]][k];
		  }
		  for(j=i+1;j<indexRect;j++)
		  {
		   if(!AlreadyRect[j])
			 if(MatchRectPoint(i,j))
			 {
			  AlreadyRect[i]=true;
			  AlreadyRect[j]=true;
			  count++;
			  for(k=0;k<2;k++)
			   {
				tempLT[k]+=PointLT[Rect[j][0]][k];
				tempLB[k]+=PointLB[Rect[j][3]][k];
				tempRT[k]+=PointRT[Rect[j][1]][k];
				tempRB[k]+=PointRB[Rect[j][2]][k];
			  }
			 }
		  }
		  for(k=0;k<2;k++)
		  {
			  avgPointLT[avgindexRect][k]=int(tempLT[k]/(count*1.0));
			  avgPointRT[avgindexRect][k]=int(tempRT[k]/(count*1.0));
			  avgPointRB[avgindexRect][k]=int(tempRB[k]/(count*1.0));
			  avgPointLB[avgindexRect][k]=int(tempLB[k]/(count*1.0));
		  }
		  avgindexRect++;//找到矩形个数

	 }
	 }  
}

int CReconizeDlg::PickColor(int index)
{   
   int i,j,blueNum,whiteNum,blackNum,yellowNum,allNum;
   blueNum=0;
   blackNum=0;
   yellowNum=0;
   whiteNum=0;
   for(i= (HaveJumpRectLT[index][0]+HaveJumpRectLB[index][0]) /2 ;
       i< (HaveJumpRectRT[index][0]+HaveJumpRectRB[index][0]) /2;
	   i++)
	 for(j=(HaveJumpRectLT[index][1]+HaveJumpRectRT[index][1])/2;
		 j=(HaveJumpRectLB[index][1]+HaveJumpRectRB[index][1])/2;
		 j++)
	   {
	     if(2*Buffer[i][j][0]-Buffer[i][j][1]-Buffer[i][j][2]>0)
            blueNum++;
		 if((Buffer[i][j][0]>=200)
			  &&(Buffer[i][j][0]>=200)
			  &&(Buffer[i][j][0]>=200)
			  &&(abs(Buffer[i][j][0]-Buffer[i][j][1])<25)
			  &&(abs(Buffer[i][j][0]-Buffer[i][j][2])<25)
			  &&(abs(Buffer[i][j][1]-Buffer[i][j][2])<25)
			  )    
			 whiteNum++;
		 if( (Buffer[i][j][2]+Buffer[i][j][1]-2*Buffer[i][j][0])>0
				 && ( abs(Buffer[i][j][2]-Buffer[i][j][1])<20) )
		          yellowNum++;
	     if( (Buffer[i][j][0]<=55)
			  &&(Buffer[i][j][0]<=55)
			  &&(Buffer[i][j][0]>=55)
			  &&(abs(Buffer[i][j][0]-Buffer[i][j][1])<25)
			  &&(abs(Buffer[i][j][0]-Buffer[i][j][2])<25)
			  &&(abs(Buffer[i][j][1]-Buffer[i][j][2])<25)
			  )    
			 blackNum++;
		}
   allNum=i*j;
   if( (blueNum/ (1.0*allNum) >0.5) && (whiteNum/(1.0*allNum)>0.1)  )
	   return 1;
   if((yellowNum/ (1.0*allNum) >0.5) && (blackNum/(1.0*allNum)>0.1)) 
       return 2;
   if((blackNum/ (1.0*allNum) >0.5) && (whiteNum/(1.0*allNum)>0.1)) 
       return 3;
   if((whiteNum/ (1.0*allNum) >0.5) && (blackNum/(1.0*allNum)>0.1)) 
       return 4;
   return 5;
}


void CReconizeDlg::OnGetRect() 
{
	// TODO: Add your control notification handler code here
	DrawRect();
}

///////////////////////////////////////////////////著者:王侯艳      2004,6,20

⌨️ 快捷键说明

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