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

📄 artdlg.cpp

📁 用ART神经网络对输入的汉字进行识别分类
💻 CPP
字号:
// artDlg.cpp : implementation file
//

#include "stdafx.h"
#include "art.h"
#include "artDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CArtDlg dialog

CArtDlg::CArtDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CArtDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CArtDlg)
	m_WhiteOnBlack = FALSE;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CArtDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CArtDlg)
	DDX_Check(pDX, IDC_CHECK1, m_WhiteOnBlack);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CArtDlg, CDialog)
	//{{AFX_MSG_MAP(CArtDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_INIT, OnInit)
	ON_BN_CLICKED(IDC_LOAD, OnLoad)
	ON_BN_CLICKED(IDC_SAVEIMG, OnSaveimg)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CArtDlg message handlers

BOOL CArtDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
    nnum=1;	
	fixneuron=0;
	Isload=FALSE;
	Haveinit=FALSE;
	recognize=FALSE;
	haveinit=FALSE;
    m_nbitcount=0;
	mode=FALSE;
   
	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CArtDlg::OnPaint()               // 显示
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}

	if(Isload)                    // 显示载入的图片
	{	

	CBitmap m_bitmap1;
	m_nWidth = (int)m_pDib->GetWidth();
	m_nHeight = (int)m_pDib->GetHeight(); 
    pwnd1=GetDlgItem(IDC_STATIC1);
    pControlDC1=pwnd1->GetDC();
	CRect* pRect1=new CRect;
	pwnd1->GetClientRect(pRect1);
	int m_top1=pRect1->top;
	int m_left1=pRect1->left;
	int controlh1=pRect1->Height();
	int controlw1=pRect1->Width();
	delete pRect1;
	pwnd1->Invalidate();
	pwnd1->UpdateWindow();
	CDC memDC1;
	memDC1.CreateCompatibleDC(pControlDC1);
	m_bitmap1.CreateCompatibleBitmap(pControlDC1, controlw1, controlh1);
    pOldBitmap = memDC1.SelectObject(&m_bitmap1);
	m_pDib->Draw(memDC1.m_hDC, 0, 0, m_nWidth, m_nHeight, 0, 0, m_nWidth, m_nHeight, DIB_RGB_COLORS, SRCCOPY);
    pControlDC1->SetStretchBltMode(BLACKONWHITE);
	pControlDC1->StretchBlt(0,0,controlw1,controlh1,&memDC1,0,0,m_nWidth,m_nHeight,SRCCOPY);
	memDC1.SelectObject(pOldBitmap);
	pwnd1->ReleaseDC(pControlDC1);
	m_bitmap1.Detach();
	m_bitmap1.DeleteObject();
	}
	if(recognize)                      // 显示识别后的图片
	{
	CBitmap m_bitmap2;
	m_nWidth = (int)m_pDib->GetWidth();
	m_nHeight = (int)m_pDib->GetHeight(); 
	pwnd1=GetDlgItem(IDC_STATIC2);
	pControlDC1=pwnd1->GetDC();
	CRect* pRect2=new CRect;
	pwnd1->GetClientRect(pRect2);
	int m_top2=pRect2->top;
	int m_left2=pRect2->left;
	int controlh2=pRect2->Height();
	int controlw2=pRect2->Width();
	delete pRect2;
	pwnd1->Invalidate();
	pwnd1->UpdateWindow();
	CDC memDC2;
	memDC2.CreateCompatibleDC(pControlDC1);
	m_bitmap2.CreateCompatibleBitmap(pControlDC1, controlw2, controlh2);
	 pOldBitmap = memDC2.SelectObject(&m_bitmap2);
	m_pDib2->Draw(memDC2.m_hDC, 0, 0, m_nWidth, m_nHeight, 0, 0, m_nWidth, m_nHeight, DIB_RGB_COLORS, SRCCOPY);
    pControlDC1->SetStretchBltMode(COLORONCOLOR);
	pControlDC1->StretchBlt(0,0,controlw2,controlh2,&memDC2,0,0,m_nWidth,m_nHeight,SRCCOPY);
	memDC2.SelectObject(pOldBitmap);
	pwnd1->ReleaseDC(pControlDC1);
	m_bitmap2.Detach();
	m_bitmap2.DeleteObject();
	}
if(haveinit)                             // 显示当前模式个数
{
	strofnnum.Format(" 已存了%d个模式",nnum);
	CWnd* pwnd3=GetDlgItem(IDC_STATIC3);
	CDC* pControlDC3=pwnd3->GetDC();
	pControlDC3->SetBkColor(RGB(234,232,216));
	pControlDC3->TextOut(0,0,patternstring);
	pwnd3->ReleaseDC(pControlDC3);
	pwnd3=GetDlgItem(IDC_STATIC4);
	pControlDC3=pwnd3->GetDC();
	pControlDC3->SetBkColor(RGB(234,232,216));
	pControlDC3->TextOut(0,0,strofnnum);
	pwnd3->ReleaseDC(pControlDC3);
}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CArtDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CArtDlg::img2vector(BYTE *pimgdata, int A[], int width, int height)
{
	int i,j;
	BYTE temp,t;
	for(i=0;i<height;i++)
	{
		int jump=((31+width)/32)*4;
		temp=128;
		int b=0;
		for(j=0;j<width;j++)
		{
			t=*(pimgdata+b+(height-i-1)*jump);
			t=(t&temp)/temp;
			A[i*width+j]= (int)t;
			temp=temp/2;
			if(temp==0)
			{
				temp=128;
				b=b++;
			}
		}
	}
}

void CArtDlg::OnInit()               //系统初始化
{
	recognize=FALSE;
	int xvector[200];
	double c[200];
	int i;
	int num=3;
	int tempnnum;
	
	char ch1[10];
	GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
	rulo = double(atof(ch1));                   //警戒值

	 BYTE* pimgdata1;
	 UpdateData(TRUE);
	 mode=m_WhiteOnBlack;
	str.Format("..\\img\\bb%d.bmp",1); 
	 CFile file;
	 BOOL fileexist=file.Open(str,CFile::modeRead,NULL);
	if(fileexist)
	  {
		  file.Close();
	  }
	else
	{
		str.Format(".\\img\\bb%d.bmp",1);
		fileexist=file.Open(str,CFile::modeRead,NULL);
		if(fileexist)
		{
			file.Close();
		}
		else
		{
			AfxMessageBox("Can not find file to initialize  ",MB_OK,0);
			return;
		}
	}
	  m_pDib=new CDib(str);
	  m_nWidth=m_pDib->GetWidth();
	  m_nHeight=m_pDib->GetHeight();
	  mlength=m_nWidth*m_nHeight;
	  m_nbitcount=m_pDib->GetBitCount();
	  m_pDib->ClearMemory();
	  initb(b,mlength);                   //权值初始化,自下而上
	  initt(t,mlength);                   //权值初始化,自上而下
	  do
	  {
		  tempnnum=nnum;
	for(i=0;i<num;i++)
   {  
	  int xu=i+1;
	  str.Format("..\\img\\bb%d.bmp",xu); 
	  CFile file;
	 BOOL fileexist=file.Open(str,CFile::modeRead,NULL);
	if(fileexist)
	  {
		  file.Close();
	  }
	else
	{
		str.Format(".\\img\\bb%d.bmp",xu);
	}
	  m_pDib=new CDib(str);
	  pimgdata1=m_pDib->GetDibData(); 
	  m_pDib->ClearMemory();
      img2vector(pimgdata1,xvector,m_nWidth,m_nHeight);
	  if(mode)
	  {
	  invvector(xvector,mlength);
	  } 
	  matrixmulti(b,xvector,c,nnum,mlength,mlength,1);     //矩阵相乘
	 BOOL rs=findpattern(t,b,xvector,c,nnum,mlength);	 // 判断是否是一个新模式,并存储
	 if(!rs)
	 {
		 addpattern(b,t,xvector,mlength,nnum);    //增加一个模式
	 } 
	}
	  }
	  while(nnum!=tempnnum);
	Haveinit=TRUE;
	CWnd* pwnd=GetDlgItem(IDC_LOAD);
	pwnd->EnableWindow(Haveinit);
	pwnd=GetDlgItem(IDC_SAVEIMG);
	 pwnd->EnableWindow(recognize);
	haveinit=TRUE;
	pwnd=GetDlgItem(IDC_INIT);
    pwnd->EnableWindow(FALSE);
	Invalidate();
}

void CArtDlg::initb(double A[], int length)    //权值初始化,自上而下
{
	for(int i=0;i<length;i++)
	{
		A[i]=1.0/(1.0+length);
	}
}

void CArtDlg::initt(int A[], int length)      //权值初始化,自下而上
{
	for(int i=0;i<length;i++)
	{
		A[i]=1;
	}

}

BOOL CArtDlg::matrixmulti(double A[], int B[], double C[], int Am, int An, int Bm, int Bn)      //矩阵相乘
{
	if(An!=Bm)
	{
		return 1;
	}
	int m,n,l;
	if (An!=Bm)
	{ return 1;
	}
	for(m=0;m<Am;m++)
	{
		for(n=0;n<Bn;n++)
		{
			double sum=0;
			for(l=0;l<An;l++)
			{
				sum=sum+A[m*An+l]*B[l*Bn+n];
			}
			C[m*Bn+n]=sum;
		}
	}
	return 0;

}

int CArtDlg::findmaxneuro(double A[],int length)       //选择最佳匹配样本
{
	int index,i;
	index=-1;
	double max=0;
	for(i=0;i<length;i++)
	{
		if(A[i]>max)
		{
			max=A[i];
			index=i;
		}
	}
	return index;
}

BOOL CArtDlg::findtiofneuro(int T[], int Ti[], int Tm, int Tn, int neuro)
{
	if (neuro>Tm)
	{
		return FALSE;
	}
	int i;
	for(i=0;i<Tn;i++)
	{
		Ti[i]=T[neuro*Tn+i];
	}
	return TRUE;
}

int CArtDlg::modofvector(int A[], int length)      //向量相乘,计算匹配度
{
	int result;
	result=0;
	for(int i=0;i<length;i++)
	{
		result=result+A[i];
	}
	return result;
}

void CArtDlg::vectormulti(int A[], int B[], int C[],int length)
{
	for(int i=0;i<length;i++)
	{
		C[i]=A[i]*B[i];
	}
}

BOOL CArtDlg::findpattern(int T[], double B[],int ivector[],double C[], int nofneuron, int length)  //判断是否为新增输入
{   //rs=findpattern(t,b,xvector,c,nnum,mlength);
	int ti[200],tx[200];
	int i=0;
	BOOL notfound=TRUE;
	while((i<nofneuron)&&notfound)
	{

	  int numofmaxneuro=findmaxneuro(C,nofneuron);                     //选择最佳匹配样本
	  BOOL result=findtiofneuro(T,ti,nofneuron,length,numofmaxneuro);  //
	  if(!result)
	  {
		  AfxMessageBox("Have a wrong   ",MB_OK,0);
	  }
	  vectormulti(ti,ivector,tx,length);
	  double modx=modofvector(tx,length);                             //向量相乘,计算匹配度
	  double modti=modofvector(ivector,length); 
	  double r=modx/modti;
	  if(r<rulo)
	  {
		  notfound=TRUE;
		  i++;
		  C[numofmaxneuro]=0;
	  }
	  else
	  {
		  fixneuron=numofmaxneuro;
		  notfound=FALSE;
		  adjustt(T,tx,length,fixneuron);      //调整T的权值
//		  BOOL result1=findtiofneuro(T,ti,nofneuron,length,numofmaxneuro);
		  adjustb(B,tx,length,fixneuron);        //调整B的权值
//		  result=findtiofneuro(T,ti,nofneuron,length,numofmaxneuro);
		  return TRUE;
	  }
	}
	  return FALSE;

}

void CArtDlg::adjustt(int A[], int tx[], int length,int num)    //调整T的权值
{
	for(int i=0;i<length;i++)
	{
		A[num*length+i]=tx[i];
	}


}

void CArtDlg::adjustb(double A[], int Ti[], int length, int num)   //调整B的权值
{
	double sumti=0;
	int i;
	for(i=0;i<length;i++)
	{
		sumti=sumti+Ti[i];
	}	
	for(i=0;i<length;i++)
	{
		A[num*length+i]=Ti[i]/(0.5+sumti);
	}
}

void CArtDlg::addpattern(double B[], int T[], int x[], int length, int& nofneuron)     //增加一个模式
{
	int i;
	double sumx;
	sumx=0;
	for(i=0;i<length;i++)
	{
		sumx=sumx+x[i];
	}
	for(i=0;i<length;i++)
	{
		B[nofneuron*length+i]=x[i]/(1+sumx);
		T[nofneuron*length+i]=x[i];
	}
	nofneuron++;
}

void CArtDlg::OnLoad()                   //载入新样本,并进行识别
{
	int xvector[200];
	double c[200];
	CString filePath;
	Invalidate();
	BYTE* pimgdata;
//	BYTE pimg[200];
	CFileDialog fileOpenDlg(TRUE, "bmp", "*.bmp", NULL, "Bitmap Files(*.bmp)|*.bmp|All File(*.*)|*.*||", NULL);
	int nRespond = fileOpenDlg.DoModal();
	if(nRespond==IDOK)
	{
		filePath = fileOpenDlg.GetPathName();
		m_pDib = new CDib(filePath);
		m_pDib2=new CDib(filePath);
		if(m_pDib->IsValid()==FALSE)
		{
			AfxMessageBox("Can not open the file",MB_OK,0);
		}
	pimgdata=m_pDib->GetDibData();
      img2vector(pimgdata,xvector,m_nWidth,m_nHeight);
	  if(mode)
	  {
	  invvector(xvector,mlength);
	  }
	  matrixmulti(b,xvector,c,nnum,mlength,mlength,1);    //矩阵相乘
	 BOOL rs=findpattern(t,b,xvector,c,nnum,mlength);    // 判断是否是一个新模式,并存储
	 if(!rs)
	 {
		 addpattern(b,t,xvector,mlength,nnum);        //增加一个模式
		 if(mode)
		 {
		 invvector(xvector,mlength);
		 }
		 vector2img(xvector,pimg,m_nWidth,m_nHeight);
		 m_pDib2->setdibdata(pimg);
		 patternstring=" 这是一个新增模式";
	 }
	 else
	 {
		 findtiofneuro(t,xvector,nnum,mlength,fixneuron);
		 if(mode)
		 {
		 invvector(xvector,mlength);
		 }
		 vector2img(xvector,pimg,m_nWidth,m_nHeight);
		 m_pDib2->setdibdata(pimg);
		 patternstring=" 这是一个库存模式";
	 }
	 Isload=TRUE;
	 recognize=TRUE;

	}
	if(nRespond==IDCANCEL)
	{
		recognize=FALSE;
		 patternstring="";
	}
		CWnd* pwnd=GetDlgItem(IDC_SAVEIMG);
	 pwnd->EnableWindow(recognize);

	Invalidate();	
}

void CArtDlg::vector2img(int A[], BYTE img[], int width, int height)
{
	int i,j,b,w32bit;
BYTE temp,a;
 w32bit=((31+width)/32)*4;
int length=w32bit*height;
for (i=0;i<length;i++)
{
	img[i]=0;
}
for(i=0;i<height;i++)
{
	a=0;b=0;temp=128;
	for(j=0;j<width;j++)
	{
		if(A[(height-1-i)*width+j]>0)
		{
			a=a+temp;
			img[i*w32bit+b]=a;
		}
		temp=temp/2;
		if(temp==0)
		{
			temp=128;
			a=0;b++;
		}
	}
}

}

void CArtDlg::invvector(int A[],  int length)
{
	int i;
	for(i=0;i<length;i++)
	{
		A[i]=1-A[i];
	}
}

void CArtDlg::OnOK() 
{
	CDialog::OnOK();
}

void CArtDlg::OnSaveimg() 
{
	CString filePath;
	CFileDialog m_filesavedlg(FALSE, "bmp", "*.bmp", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Bitmap Files(*.bmp)|*.bmp|All File(*.*)|*.*||", NULL);
if (recognize)
{
	int nRespond = m_filesavedlg.DoModal();
	if(nRespond == IDOK)
	{
		filePath = m_filesavedlg.GetPathName();
		CFile file((LPCTSTR )filePath, CFile::modeCreate |
			CFile::modeReadWrite | CFile::shareExclusive);
	int dwSaveWidthBytes=((31+m_nHeight)/32)*4;
	DWORD dwDibBitsSize = dwSaveWidthBytes * m_nHeight; 
	DWORD dwFileSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwDibBitsSize; 
	if(m_nbitcount == 1) dwFileSize += (2 * sizeof(RGBQUAD)); 
	DWORD dwOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); 
	if(m_nbitcount == 1) dwOffBits += (2 * sizeof(RGBQUAD)); 
	BITMAPFILEHEADER bmFileHeader; 
	bmFileHeader.bfType=0x4d42; 
	bmFileHeader.bfSize = dwFileSize; 
	bmFileHeader.bfReserved1 = 0; 
	bmFileHeader.bfReserved2 = 0;  
    bmFileHeader.bfOffBits = dwOffBits; 
    file.Write((LPSTR)&bmFileHeader, sizeof(BITMAPFILEHEADER)); 
	int a=sizeof(BITMAPFILEHEADER);
	int b= sizeof(BITMAPINFOHEADER);
    dwOffBits =b; 
	if(m_nbitcount == 1) dwOffBits += (2 * sizeof(RGBQUAD)); 
	BITMAPINFO* pbmInfo; 
	pbmInfo=m_pDib2->GetBmpInfo();
	file.Write(pbmInfo,dwOffBits);
	BYTE* pdata=m_pDib2->GetDibData();
	file.Write(pdata,dwDibBitsSize);
	file.Close();
	}
}
Invalidate();		
}

⌨️ 快捷键说明

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