📄 patterndlg.cpp
字号:
{
// 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 + -