📄 reconizedlg.cpp
字号:
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 + -